这是我通过反汇编看到的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/