这是我通过反汇编看到的声明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(使用前将#替换为@)