2

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

.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

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

4

1 回答 1

2

每个xBP用于定位其参数或局部变量的函数都需要在一开始就设置xBPxSP

通过这样做,它xBP从调用函数中破坏了先前的值,因此,自然地,它应该通过例如使用pushand来保存和恢复它pop

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

许多编译器都有一个xSP用于定位函数参数和局部变量的选项。如果启用了该选项,则xBP可能不需要保留(除非调用约定需要保留)。

于 2012-10-20T13:26:06.520 回答