在masm中读取格式化文件

Reading a formatted file in masm

我正在尝试读取包含这样几行的文件

201;18,5;2500;35(4个信息,第二个是float,其他都是int)

而且我想将这些数字转换为十进制(以进行运算)。我不会使用 8086 的 float 功能,例如 "18,5" ,我会将 18 乘以 1000 再加上 5 乘以 100,然后将它们相加为一个数(不会达到 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

你们能帮帮我吗?谢谢

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

我是MASM!

当 MASM 看到 第二个操作数 (FileBuffer) 时,它会将其视为内存操作数。
但是第一个操作数 (String[si]) 也是一个内存操作数。

您不能在同一条指令中有 2 个这样的内存操作数,因此会出现错误消息。

我没有遵循代码的其余部分(有点长而且没有迫切需要的注释)但接下来的 2 个解决方案可能会为您完成这项工作。

  • 将第二个操作数转为立即数:

    mov     String[si], offset FileBuffer
    
  • 分步读写:

    mov      al, FileBuffer
    mov      String[si], al