栈中的返回地址是如何指定的?

2023-11-25

这是我通过反汇编看到的声明function(1,2,3);:

movl   $0x3,0x8(%esp)
movl   $0x2,0x4(%esp)
movl   $0x1,(%esp)
call   0x4012d0 <_Z8functioniii>

看来转发地址根本没有压入栈,那怎么办ret work?


在 x86 处理器上(对于您的汇编语言示例),call指令将返回地址压入堆栈并将控制权转移给函数。

因此,在进入函数时,堆栈指针指向返回地址,准备好ret将其弹出到程序计数器(EIP / RIP)中。


并非所有处理器体系结构都将返回地址放在堆栈上 - 通常有一组一个或多个寄存器设计用于保存返回地址。在 ARM 处理器上,BL指令将返回地址放置在特定寄存器中(LR,或“链接寄存器”)并将控制权转移到该函数。

ia64 处理器做了类似的事情,除了有几个可能的寄存器(b0-b7)可以接收返回地址,并且将在指令中指定一个(与b0为默认值)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈中的返回地址是如何指定的? 的相关文章

随机推荐