【发布时间】:2013-06-11 12:17:01
【问题描述】:
我在 Assemby 中有一小段代码,它基本上是通过循环运行并以相反的顺序打印值,但是当我运行时,它进入无限循环。下面是代码。
section .data
x db "value=%d"
section .text
global main
extern printf
main:
mov eax, 10
well_done:
push eax
push x
call printf
add esp,8
dec eax
cmp eax ,0
jnz well_done
ret
【问题讨论】:
-
有推送但没有弹出?
-
eax是 cdecl 中的 caller-save,printf可能正在扼杀它的价值 -
@kerrek 我可以知道为什么在这种特殊情况下需要 pop 。
-
我不知道——我不是声称自己理解它,我只是注意到不对称。
-
无论如何你都无法从中恢复它,一个函数可能会修改它的参数——这不是很常见,但你不能真正依赖它。你可以
push eax两次(显然在调用后弹出),或者使用像ebx这样的被调用者保存寄存器