【发布时间】:2013-08-16 20:44:22
【问题描述】:
我正在尝试在汇编(网络汇编器)中实现 atoi。我已经通过使用调试器检查寄存器值来验证我的方法是有效的。问题是应用程序在即将退出时会崩溃。我担心我的程序以某种方式破坏了堆栈。我正在链接 GCC 标准库以允许使用 printf 函数。我注意到它改变了导致意外行为的寄存器(对我不认识的值的广泛迭代),但是我通过将 EAX 的值存储在 EBX 中(不被 printf 修改)然后在函数调用后恢复该值来解决这个问题。这就是为什么我能够通过单步执行算法来确认程序现在的行为符合预期,并确认程序在即将终止时崩溃。 代码如下:
global _main
extern _printf
section .data
_str: db "%d", 0
section .text
_main:
mov eax, 1234
mov ebx, 10
call _itoa
_terminate:
ret
_itoa:
test eax, eax
jz _terminate
xor edx, edx
div ebx
add edx, 30h
push eax
push edx
push _str
call _printf
add esp, 8
pop eax
jmp _itoa
这里是堆栈转储:
例外:在 eip=00402005 处的 STATUS_ACCESS_VIOLATION eax=00000000 ebx=00000000 ecx=20000038 edx=61185C40 esi=612A3A7C edi=0022CD84 ebp=0022ACF8 esp=0022AC20 程序=C:\Cygwin\home\Benjamin\nasm\itoa.exe,pid 3556,线程主 cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023 堆栈跟踪: 框架函数参数 0022ACF8 00402005 (00000000, 0022CD84, 61007120, 00000000) 堆栈跟踪结束
编辑:请注意,由于程序不再崩溃,stackdump 真的不再那么重要了,它只是显示了一个不正确的值。
【问题讨论】:
-
请注意,上面的代码并没有崩溃。 OP问了一个问题,然后在他们得到答案后改变了问题。这使得搜索网络的人更难找到类似问题的解决方案。