【问题标题】:x86 Assembly, what is wrong with my code? Input, arithmetic, printx86 程序集,我的代码有什么问题?输入、算术、打印
【发布时间】:2023-03-27 18:45:01
【问题描述】:

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

我想,大部分都在工作。但它不能正确打印结果。它打印一大堆随机字符。我认为问题与我的代码中发生的 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

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

【问题讨论】:

  • 可执行文件的格式是什么?
  • 写成nasm(.asm文件)

标签: assembly x86


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我使用了调试器和一切,直到它尝试打印结果为止。我认为它可能与 itoa 有关,它以 0 而不是 $ 结尾。我发现在字符串末尾附加一个 $ 是一个简单的解决方案,可能并不理想,但它有效并且我的结果打印出来了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多