在函数开始时将旧的基指针保存在堆栈上有什么意义?我是在汇编中使用函数的新手,但到目前为止我还没有看到这样做的意义。它只是被插入堆栈,然后在最后弹出,它不执行任何操作。例如,以下代码无需执行此操作即可正常工作:
.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
的先前值,因此,自然地,它应该通过例如保存和恢复它。使用push
和pop
。
如果根本不使用xBP
,则不需要保存和恢复。
许多编译器都可以选择使用xSP
来定位函数参数和局部变量。如果启用该选项,xBP
可能不需要保留(除非调用约定需要保留)。
关于function - 为什么要在函数开头保存旧的基指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12988814/