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

时间:2012-10-20 13:16:01

标签: 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

我知道你可以通过在这个例子中使用堆栈指针进一步简化这一点,但我可以看到这是不好的做法。

1 个答案:

答案 0 :(得分:2)

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

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

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

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