Mas*_*ask 8 assembly stack calling-convention
这是我通过反汇编看到的声明function(1,2,3);
:
movl $0x3,0x8(%esp)
movl $0x2,0x4(%esp)
movl $0x1,(%esp)
call 0x4012d0 <_Z8functioniii>
Run Code Online (Sandbox Code Playgroud)
似乎ret地址根本没有被推入堆栈,那怎么ret
工作呢?
在x86处理器上(对于汇编语言示例),call
指令会将堆栈上的返回地址推送到控制器并将控制转移到该函数.
并非所有处理器体系结构都将返回地址放在堆栈上 - 通常有一组一个或多个寄存器用于保存返回地址.在ARM处理器上,BL
指令将返回地址放在特定寄存器(LR
或"链接寄存器")中,并将控制转移到该函数.ia64处理器执行类似的操作,只是有几个可能的寄存器(b0
- b7
)可以接收返回地址,一个将在指令中指定(b0
默认情况下).
理想情况下,call
声明应该照顾到这一点.程序计数器的下一个位置将被推入堆栈.当被调用的函数(子例程)完成它并且遇到return语句时,控件现在转到被推入堆栈的地址,它将被弹出.
归档时间: |
|
查看次数: |
15453 次 |
最近记录: |