gpt4 book ai didi

c - itoa 实现崩溃?

转载 作者:行者123 更新时间:2023-11-30 19:48:29 26 4
gpt4 key购买 nike

我正在尝试在汇编(网络汇编器)中实现atoi。我通过使用调试器检查寄存器值来验证我的方法是有效的。问题是应用程序在即将退出时会崩溃。我担心我的程序正在以某种方式破坏堆栈。我链接到 GCC stdlib 以允许使用 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

这是堆栈转储:

Exception: STATUS_ACCESS_VIOLATION at eip=00402005 eax=00000000 ebx=00000000 ecx=20000038 edx=61185C40 esi=612A3A7C edi=0022CD84 ebp=0022ACF8 esp=0022AC20 program=C:\Cygwin\home\Benjamin\nasm\itoa.exe, pid 3556, thread main cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023 Stack trace: Frame Function Args 0022ACF8 00402005 (00000000, 0022CD84, 61007120, 00000000) End of stack trace

编辑:请注意,堆栈转储实际上不再那么相关了,因为程序不再崩溃,它只是显示错误的值。

最佳答案

我不熟悉您的平台,但我希望您需要在调用 printf() 后弹出推送的值来恢复堆栈。

由于 printf() 不知道将传递多少个参数,因此它无法恢复堆栈。您的代码推送永远不会弹出的参数。因此,当您的过程返回时,它会从压入堆栈的数据中获取返回地址,这些数据不会指向有效的代码。这将是您的访问违规。

关于c - itoa 实现崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com