如何在堆栈中指定返回地址?

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工作呢?

Mic*_*urr 7

在x86处理器上(对于汇编语言示例),call指令会将堆栈上的返回地址推送到控制器并将控制转移到该函数.

并非所有处理器体系结构都将返回地址放在堆栈上 - 通常有一组一个或多个寄存器用于保存返回地址.在ARM处理器上,BL指令将返回地址放在特定寄存器(LR或"链接寄存器")中,并将控制转移到该函数.ia64处理器执行类似的操作,只是有几个可能的寄存器(b0- b7)可以接收返回地址,一个将在指令中指定(b0默认情况下).


bra*_*boy 5

理想情况下,call声明应该照顾到这一点.程序计数器的下一个位置将被推入堆栈.当被调用的函数(子例程)完成它并且遇到return语句时,控件现在转到被推入堆栈的地址,它将被弹出.

  • 调用指令的部分工作是将返回地址压入堆栈.返回地址只是调用指令参数后面的地址.要查看上面示例中的返回地址,只要程序进入0x4012d0的过程,就必须立即查看堆栈. (5认同)

Car*_*rum 3

call它取决于 ABI 和体系结构,但如果返回地址最终出现在堆栈上,则这是将其放置在那里的指令的副作用。