这是我通过反汇编语句 function(1,2,3);
看到的结果:
movl $0x3,0x8(%esp)
movl $0x2,0x4(%esp)
movl $0x1,(%esp)
call 0x4012d0 <_Z8functioniii>
看起来ret地址根本没有压入堆栈,那么ret
是如何工作的?
最佳答案
在 x86 处理器上(对于您的汇编语言示例),call
指令将返回地址压入堆栈并将控制权转移给函数。
因此,在进入函数时,堆栈指针指向返回地址,准备好 ret
将其弹出到程序计数器 (EIP/RIP) 中。
并非所有处理器架构都将返回地址放在堆栈上 - 通常有一组一个或多个寄存器设计用于保存返回地址。在 ARM 处理器上,BL
指令将返回地址放置在特定寄存器(LR
或“链接寄存器”)中,并将控制权转移给函数。
ia64 处理器执行类似的操作,只不过有多个可能的寄存器 (b0
-b7
) 可以接收返回地址,并且将在指令中指定一个寄存器(b0
是默认值)。
关于assembly - 堆栈中的返回地址是如何指定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542949/