在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
我正在尝试读取包含这样几行的文件
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