我已经学习了一会儿的程序集,现在我已经开始掌握它了,但是我似乎无法理解的一件事就是为什么我们需要递减堆栈指针离开漫游本地变量,来看看下面的代码:在这个小程序(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
我可以想象做所有这些,而不需要减少48。我可以使用基指针来将值从堆栈中移出,并且只需要指向相同的位置以准备好弹出ebp并返回。 有人可以澄清为什么有必要为局部变量留下“空间”。 谢谢!! 如果这看起来像一个愚蠢的问题,我很抱歉
好吧,所以递减堆栈指针的全部意义在于,当我们调用另一个函数时总是保持递减ebp,从而为我们节省了执行如下操作的麻烦:'mov“返回地址”,-52($ ebp)'我们为新函数插入一个局部变量,并且保持跟踪每帧的beginig和end(通过推送ebp和递减esp),是吗? – user3769877 2014-10-01 07:22:44