function - 为什么要在函数开头保存旧的基指针?

标签 function assembly stack

在函数开始时将旧的基指针保存在堆栈上有什么意义?我是在汇编中使用函数的新手,但到目前为止我还没有看到这样做的意义。它只是被插入堆栈,然后在最后弹出,它不执行任何操作。例如,以下代码无需执行此操作即可正常工作:

.section .data
.section .text
.globl _start

.type add, @function
add:
    mov %rsp, %rbp
    mov 8(%rbp), %rax
    mov 16(%rbp), %rdi
    add %rax, %rdi

    mov %rbp, %rsp
    ret

_start:
    push $45
    push $36
    call add
    add  $16, %rsp

    mov $60, %rax
    syscall

我知道您可以通过在本示例中使用堆栈指针来进一步简化此操作,但我可以看出这是一种不好的做法。

最佳答案

每个使用xBP来定位其参数或局部变量的函数都需要在开始时将xBP设置为xSP

通过这样做,它会从调用函数中销毁 xBP 的先前值,因此,自然地,它应该通过例如保存和恢复它。使用pushpop

如果根本不使用xBP,则不需要保存和恢复。

许多编译器都可以选择使用xSP来定位函数参数和局部变量。如果启用该选项,xBP 可能不需要保留(除非调用约定需要保留)。

关于function - 为什么要在函数开头保存旧的基指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12988814/

相关文章:

C - 对附有姓名的数字进行排序

javascript - Meteor JS - 加载每个模板后启动功能

assembly - 从Rust更改x86中的执行堆栈

android - 清除所有 Activity

使用 C 语言中的 switch 和函数的计算器

c - 在 C 中的函数内部声明函数

c - 二进制数到十六进制字符串的高效转换

linux - 如何运行在 Cool 编译器中生成的中间文件,如 x86 汇编文件

java - 为什么实例和静态内部类的初始化不同?

java - 如何检查栈顶两个元素是否存在?