在函数开头将旧的基指针保存在堆栈上有什么意义?我刚接触汇编中的函数,但到目前为止,我还没有看到这样做的重点。它只是被推入堆栈然后在最后弹出,它什么也没做。例如,以下代码可以正常工作而不执行此操作:
.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
我知道你可以通过在这个例子中使用堆栈指针进一步简化这一点,但我可以看到这是不好的做法。
答案 0 :(得分:2)
使用xBP
定位其参数或局部变量的每个函数都需要在最开始时将xBP
设置为xSP
。
通过这样做,它会从调用函数中销毁xBP
的先前值,因此,它自然应该通过例如保存和恢复它来保存和恢复它。使用push
和pop
。
如果根本不使用xBP
,则无需保存和恢复。
许多编译器都可以选择使用xSP
来定位函数参数和局部变量。如果启用该选项,则可能不需要保留xBP
(除非调用约定要求保留它)。