0

我需要一些关于我正在尝试编写的程序的帮助。该程序应该从标准输入中读取两个数字,保存并使用它来执行基本的数学运算,然后返回它。

我想,大多数事情都在工作。但它不能正确打印结果。它打印一大堆随机字符。我相信这个问题与我的代码中发生的 ascii 到 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

如果有人能告诉我我的代码有什么问题,我将不胜感激。谢谢!

4

1 回答 1

0

好吧,看起来不对的一件事是,如果atoi是 C 库版本,那么您应该用零而不是美元符号来终止输入字符串。

我们也看不到段寄存器是否设置正确。为了int 21工作,DS必须设置为保留缓冲区的段。

此外,它看起来像是printOut一个宏。由于您得到的是无意义的输出,因此可以肯定的是,您错误地设置了对该宏的调用,否则宏本身存在错误。但是我们不知道它是如何工作的,所以不能说这部分代码有什么问题。例如,如果printOut正在使用int 21,那么它将期望一个美元符号终止符,并且itoa将使用 0 代替。

当汇编代码不起作用时,调试器就是你的朋友。您是否尝试过单步执行代码并查看发生了什么?

如果您没有调试器,则删除输入部分并单独尝试输出部分:在 eax 中加载 42 并将其转换为字符串并将其放入标准输出。

于 2013-02-10T07:58:31.060 回答