我正在尝试编写的程序需要一些帮助。该程序应该从标准输入读取两个数字,保存并使用它来执行基本的数学运算然后返回它。
我认为大多数事情都在发挥作用。但它不能正确打印结果。它会打印出一大堆随机字符。我认为问题与ascii to int或我的代码中发生的int到ascii转换有关,但我不能确定。
以下是我从输入中读取的代码部分:
mov byte [firstNum], 30
mov byte [firstNum + 1], 0
mov ah, 0Ah
mov edx, firstNum
int 021H
movzx esi, byte [firstNum+1]
mov edx, firstNum+2
add esi, edx
mov byte [esi], "$"
mov byte [secondNum], 30
mov byte [secondNum + 1], 0
mov ah, 0Ah
mov edx, secondNum
int 021H
movzx esi, byte [secondNum+1]
mov edx, secondNum+2
add esi, edx
mov byte [esi], "$"
其中:
firstNum resb 32 ; first number
secondNum resb 32 ; second number
result resb 32 ; result
现在这里是将字符串输入转换为整数的部分,添加两个值,从整数转换为字符串并打印结果:
push dword secondNum+2
call _atoi
add esp, 4
mov ebx, eax
push dword firstNum+2
call _atoi
add esp, 4
add eax, ebx
push dword 10 ; base of 10, decimal
push dword result
push dword eax
call _itoa
add esp, 12
printOut result
如果有人可以告诉我我的代码有什么问题,我真的很感激。谢谢!
答案 0 :(得分:0)
嗯,有一件事看起来不对,如果atoi
是C库版本,那么你应该用零而不是美元符号来终止输入字符串。
我们也看不到段寄存器是否设置正确。要使int 21
起作用,必须将DS
设置为保留缓冲区的段。
此外,printOut
似乎是一个宏。由于您正在获取无意义的输出,因此您可能会错误地设置对此宏的调用,或者宏本身存在错误。但是我们不知道它是如何工作的,所以不能说这部分代码有什么问题。例如,如果printOut
使用int 21
,那么它会使用美元符号终止符,而itoa
将使用0代替。
当汇编代码不起作用时,调试器就是你的朋友。您是否试图单步执行代码并查看正在发生的事情?
如果你没有调试器,那么删除输入部分并单独尝试输出部分:在eax中加载42并将其转换为字符串并将其放入标准输出。