我在汇编中创建了一个atoi
函数,当我使用已经定义的字符串测试它时,它工作正常,但当我使用int 21h / 3Fh
从用户获取字符串时(然后我存储并传递给它)它给了我一些毫无意义的价值。
我正在为学校做这个,我把它放在我正在制作的某个库中,除了它包含itoa
函数,我没有遇到问题。
这些函数将其地址先前存储在SI
中的字符串转换为存储在AX
中的整数。
我使用itoa
来显示AX
的内容。
希望有人知道这是什么问题。
这是不可行的例子:
mov ah, 3fh ;get string
mov dx, stri
int 21h
mov si, stri ;convert it
call z_atoi
stri db '$$$$$$$$$$$$$$$$$$'
工作示例:
mov si, stri
call z_atoi
stri db '789$'
功能:
z_atoi: ;z_atoi(si=str) return ax=[number]
xor dh, dh ;needs to be zero for dx==dl
xor ax, ax ;the number
xor cx, cx ;the character
z_atoi1:
test cx, cx ;is this the first character
je z_atoi2 ;if so skip this
imul ax, 10 ;multiply by 10
z_atoi2:
mov bx, si
add bx, cx
mov dl, [bx] ;get next character
sub dl, 30h ;ascii to integer
add ax, dx ;add to the number
inc cx ;next character
inc bx
cmp byte[bx], '$' ;check if there are any more characters
je z_atoi3
cmp byte[bx], 0
je z_atoi3
cmp byte[bx], 0ah ;<--THIS WAS WHAT I WAS MISSING, THANKS
je z_atoi3
jmp z_atoi1
z_atoi3:
ret