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

标签 assembly x86 stack calling-convention

这是我通过反汇编语句 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/

相关文章:

c - 解析堆栈和寄存器(EBP、EIP、ESP)并找出与每个帧相关的函数

c++ - 为什么发出空的 asm 命令会交换变量?

assembly - 是否需要为 X64 快速调用叶函数保留 RCX?

c - 为什么这个程序会分配以下金丝雀值和汇编代码?

linux - 如何逐步调试没有符号或部分的程序集二进制文件?

java - 使用堆栈 - 覆盖 onBackPressed

multithreading - 能否在仅部分覆盖的情况下执行单字节指令?

c++ - 使用 Intel PIN 在寻址模式下使用特定寄存器检测 mov dword ptr [rbp - ...] 指令

c - 用汇编语言解释这一行?

c++ - 为什么我收到错误消息 "subscript requires array or pointer type"我正在尝试读取我的数组以查看它是否是一个操作数