我已經學習了一會兒的程序集,現在我已經開始掌握它了,但是我似乎無法理解的一件事就是爲什麼我們需要遞減堆棧指針離開漫遊本地變量,來看看下面的代碼:在這個小程序(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