【发布时间】:2015-08-21 08:36:28
【问题描述】:
我对汇编代码中的 CALL 函数有疑问。当我在汇编中执行 CALL 函数时,将指令推入堆栈是否正确?
当我CALL一个函数时,指令什么时候弹出?
【问题讨论】:
-
CALL不是函数,它是CPU 执行的一条指令。根据架构(x86、PPC、ARM、...)和调用约定,事情的实现方式不同。请查阅您正在编程的硬件的手册,或在此处向我们提供更多信息。
我对汇编代码中的 CALL 函数有疑问。当我在汇编中执行 CALL 函数时,将指令推入堆栈是否正确?
当我CALL一个函数时,指令什么时候弹出?
【问题讨论】:
CALL 不是函数,它是CPU 执行的一条指令。根据架构(x86、PPC、ARM、...)和调用约定,事情的实现方式不同。请查阅您正在编程的硬件的手册,或在此处向我们提供更多信息。
这个答案假设Intel x86 architecture。
当我在汇编中执行 CALL 函数时,该指令被推入堆栈是正确的吗?
没有。入栈的是指令指针的值,此时该指针指向CALL指令后面的指令。
当我调用一个函数时,指令什么时候弹出?
通常在您执行RET 指令时。
有关详细信息,请参阅x86 calling conventions 和英特尔的x86 instruction manual。
【讨论】:
esp。
esp 标签似乎没有定义。操作应该更具体。
在 x86 和 x86/64 位调用下,压入下一条指令的堆栈地址。
例如:
call after_hello
db 'hello', 0xa
after_hello:
在栈顶的这个时刻,你有这个字符串的地址——这是一个很好的技巧。可能在这一刻你从不使用 ret 来跳转到调用后的第一条指令。
【讨论】: