2017-07-11 2 views
2

Je suis en train de lire un fichier qui a des lignes comme celle-ciLecture d'un fichier formaté en masm

201; 18,5; 2500; 35 (4 informations, le second est un flotteur, les autres sont ints)

Et je veux convertir ces nombres en nombre décimal (pour fonctionner avec). Je n'utiliserai pas les capacités du flotteur 8086, par exemple "18,5", je multiplierai 18 par 1000 plus 5 fois 100, et les somme en un nombre (n'atteindra pas 64k).

Je connais les logiques, mais je ne sais pas comment faire.

Je dois lire jusqu'à ce que j'obtiens ";" ou "" ou "CR" (CRLF marque les lignes)

Voici ce que j'ai jusqu'à présent

atoi proc near 
     mov  ax,0 
atoi_2: 
     cmp  byte ptr[bx], 0 
     jz  atoi_1 
     mov  cx,10 
     mul  cx 
     mov  ch,0 
     mov  cl,[bx] 
     add  ax,cx 
     sub  ax,'0' 
     inc  bx 
     jmp  atoi_2  
atoi_1: 
     ret  
atoi endp 


read_char_convert proc near 
put_on_string: ;To convert using atoi  
    cmp  FileBuffer, AscSemiColon ; is it ";"? 
    je  column_count 
    cmp  FileBuffer, AscComma  ; Is it ","? 
    je  fechar_string_comma 
    cmp  FileBuffer, CR   ; Is it "CR"? 
    je  close_string_CR 

    ;I CANT DO THIS 
    ;add String, i 
    ;mov String, FileBuffer 
    ;inc i 
    mov  si, i 
    mov  String[si], FileBuffer ;THIS IS GETTING ME AN ERROR 
    inc  i  
close_string_comma: 

columnCount: 
    call columnCounter 
fechar_string_CR: 
    mov  SemiColonCounter, 0 ; going to the next line 
read_char_convert endp 

columnCounter proc near 
    inc  i 
    mov  si, i 
    mov  String[si], 0 
    inc  SemiColonCounter 
    cmp  SemiColonCounter, 1 
    je  chamaConversaoTempo 
    cmp  SemiColonCounter, 2 
    je  chamaConversaoBateria 
    cmp  SemiColonCounter, 3 
    je  chamaConversaoDistancia 
    cmp  SemiColonCounter, 4 
    je  chamaConversaoVelocidade 

callTimeConversion: 
    call speedConversion 
    jmp  return_columnCounter 
callBatteryConversion: 
    call batteryConversion 
    jmp  return_columnCounter 
callDistanceConversion: 
    call distanceConversion 
    jmp  return_columnCounter 
callSpeedConversion: 
    call speedConversion 
    ;jmp return_columnCounter 

retourn_columnCounter: 
    ret 
columnCounter endp 

timeConversion proc near  
    lea  bx, String 
    call atoi 
    mov  T_PARCIAL1, ax 
    cmp  nbr_lines, 1 
    jne  returnTime 
    mov  bx, T_INICIAL 
    mov  T_PARCIAL1, bx 
returnTime: 
    ret 
timeConversion endp 

batteryConversion proc near 

    lea  bx, String 
    call atoi 
    ;cmp b_int, 1 ; flag -> 1 int part, 0, decimal part 
    jne  mult_100 
    mov  ax, THOUSAND ;constant 
    mul  ax 
    mov  B_PARCIAL1, ax 
    jmp  jump_100 
mult_100: 
    mov  ax, HUNDRED 
    mul  ax 
    add  B_PARCIAL1, ax 
jump_100:  
    cmp  nbr_lines, 1 
    jne  returnBattery 
    mov  bx, B_INICIAL 
    mov  B_PARCIAL1, bx  
returnBattery: 
    ret 
batteryConversion endp 

distanceConversion proc near  
    lea  bx, String 
    call atoi 
    mov  D_PARCIAL1, ax 
    cmp  nbr_lines, 1 
    jne  returnDistance 
    mov  bx, D_INICIAL 
    mov  D_PARCIAL1, bx 
returnDistance: 
    ret 
distanceConversion endp 

speedConversion proc near 

    lea  bx, String 
    call atoi 
    mov  V_PARCIAL1, ax 
    cmp  nbr_lines, 1 
    jne  returnSpeed 
    mov  bx, V_INICIAL 
    mov  V_PARCIAL1, bx 
returnSpeed: 
    ret 
speedConversion endp 

Pouvez-vous les gars me aider? Merci

Répondre

2
mov  String[si], FileBuffer ;THIS IS GETTING ME AN ERROR 

C'est MASM!

Lorsque MASM voit le deuxième opérande (FileBuffer), il traitera comme un opérande de mémoire.
Mais le premier opérande (String[si]) est aussi un opérande de mémoire.

Vous ne pouvez pas avoir 2 opérandes de mémoire comme celui-ci dans la même instruction, d'où le message d'erreur.

Je n'ai pas suivi le reste du code (un peu long et sans les commentaires désespérément nécessaires) mais les 2 prochaines solutions pourraient faire le travail pour vous.

  • Tourner le second opérande dans un immédiat:

    mov  String[si], offset FileBuffer 
    
  • Lire et écrire dans des étapes séparées:

    mov  al, FileBuffer 
    mov  String[si], al 
    
+0

Hey, merci, je l'ai fait, pourriez-vous aider moi dans la recherche d'un moyen de lire ces valeurs séparément? – Caiorrs

+0

Voici comment mon programme est en ce moment https://pastebin.com/7Gv2VpJ7 et un fichier d'entrée exemple https://pastebin.com/recaLkTF – Caiorrs