天天看點

關于GCC彙編代碼的幾個寄存器解釋

典型的基于PC的函數調用棧格式如下:

push    ebp        

mov     ebp, esp      

sub     esp, 4*3         

...

mov     esp, ebp       

pop     ebp            

ret

解釋:

首先對于一個程序,棧平衡是必須的。在進入某程序的某個子函數的調用前,棧頂指針esp和棧基址(棧底指針)ebp有個內插補點。ebp在函數調用期外作為棧基址(這個棧基址值在程序生命期不變),但在調用期内,又是作為棧尋址指針來用的,是以在第一行需要把ebp儲存起來,在最後一行又将ebp彈出,這兩步保證整個調用結束前後的ebp不變。第二行将esp的棧頂值賦給ebp,讓ebp作為棧尋址指針,而esp始終作為棧頂指針,是以第三行需要為實參預留頂空間。第四行為函數調用結束後,将棧指針ebp賦給esp作為棧頂指針,而棧基址不變。

是以對于一個N層的遞歸調用,在遞推階段,esp的值不斷減小,即棧不斷加長,主要是為了儲存每層遞歸的傳回位址,是以在每層調用前,ebp-esp的值都不一樣,它反映了整個遞歸調用的調用棧大小;在回歸階段,esp又是不斷增加的,即向ebp靠近。而在整個過程,ebp的值是不變的,當然在調用棧内ebp會作為棧尋址指針使用,此時的值肯定會臨時改變,但調用結束後會恢複原值。

繼續閱讀