MASM

2017-07-11 5 views
2

における形式のファイルIこのMASM

201のような行を持つファイルを読み取るしようとしている読書; 18.5; 2500; 35(4情報、第二の一方はフロートであり、他はint型である)を

そして、これらの数値を10進数に変換したい(操作するために)。私は8086の浮動小数点の機能を使用しません。たとえば、「18,5」、私は18を1000プラス5倍100倍し、それらを合計して1つの数値にします(64kに達しません)。

私は論理を知っていますが、どうやってそれを行うのか分かりません。

私は ";"または「」または 『CR』(CRLFが行をマーク)

は、ここで私は

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 

これまで持っているものだ君たちは私を助けることはできますか?おかげ

答えて

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

はこれがMASMです!

MASM 第2オペランド(FileBuffer)を参照すると、メモリオペランドとして扱います。
しかし、最初のオペランド(String[si])もメモリオペランドです。

同じ命令で2つのメモリオペランドを使用することはできません。そのため、エラーメッセージが表示されます。

私はコードの残りの部分を(長いと、必然的に必要なコメントなしで)従っていませんでしたが、次の2つの解決策があなたのために働くかもしれません。

mov  String[si], offset FileBuffer 
  • 読み取りをし、別の工程で書く:

    • は、即時に第二オペランドを回し

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

    ねえ、おかげで、私はあなたが助けることができる、ということでした私はこれらの価値観を別々に読み取る方法を見つけましたか?私のプログラムは、今どのように – Caiorrs

    +0

    これは https://pastebin.com/7Gv2VpJ7 、入力ファイルの例 https://pastebin.com/recaLkTF – Caiorrs