我已经学习了一段时间的汇编,并且开始掌握它,但是我似乎无法理解的一件事是为什么我们需要递减堆栈指针以离开本地漫游变量,看看这段代码:(使用 64 位 GNU 编译器编译的代码,AT&T 语法)
pushq %rbp
movq %rsp, %rbp
subq $48, %rsp
call __main
movl $0, -4(%rbp)
movl $4, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
addl %edx, %eax
movl %eax, -12(%rbp)
movl -4(%rbp), %edx
movl -12(%rbp), %eax
addl %eax, %edx
movl -8(%rbp), %eax
addl %edx, %eax
movl %eax, -16(%rbp)
addq $48, %rsp
popq %rbp
ret
在这个小程序中,我可以想象在不需要将 esp 递减 48 的情况下完成所有这些操作。我可以使用基指针将值从堆栈移入堆栈,并让 esp 指向准备弹出 ebp 的相同位置并返回。有人可以澄清为什么有必要为局部变量留出“空间”。谢谢!!如果这似乎是一个愚蠢的问题,我深表歉意