標籤:彙編 棧幀
備忘:秋風 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
C程式碼(簡單的函數調用和返回):
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/62/wKiom1T70UrDuEyVAAEXuKD7xcM376.jpg" style="float:none;" title="QQ20150307212646.png" alt="wKiom1T70UrDuEyVAAEXuKD7xcM376.jpg" />
將C源碼編譯成彙編代碼:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/5E/wKioL1T70mTx4cbOAAEWmOoDdSY210.jpg" style="float:none;" title="QQ20150307212729.png" alt="wKioL1T70mTx4cbOAAEWmOoDdSY210.jpg" />
有效彙編代碼內容:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/62/wKiom1T70UqCyi_QAAJqsTEfsQI659.jpg" style="float:none;" title="QQ20150307212856.png" alt="wKiom1T70UqCyi_QAAJqsTEfsQI659.jpg" />
通過仔細分析彙編代碼的工作過程中堆棧的變化情況,可以描繪出函數調用過程中使用的棧幀結構如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5A/5E/wKioL1T74KCTiK4qAAE4U9Bfsto636.jpg" title="QQ20150308133449.png" alt="wKioL1T74KCTiK4qAAE4U9Bfsto636.jpg" />
總結:
電腦在工作時使用程式棧來支援函數或程序呼叫,機器用棧傳遞參數、儲存返回資訊、儲存寄存器值用於以後恢複,和儲存本地變數。棧向低地址方向增長,寄存器%esp指向棧頂位置,使用pushl和popl指令進行資料壓棧和出棧操作;將%esp值減小可以分配未指定初值的資料空間,通過增加%esp釋放資料空間。
假設P調用Q,則Q的參數位於P的棧幀中,P的返回地址(當程式從Q返回時應該繼續執行的位置,即P中call語句下一條指令地址)也被壓入P棧幀的尾部。Q的棧幀從儲存棧基址指標(%ebp)開始,後面是其他寄存器(如%eip等)的值、變數等內容。
附錄:其他相關知識點
Linux使用AT&T彙編格式
b,w,l,q 分別代表 8,16,32,64位
pushl %eax subl $4,%esp movl %eax,(%esp)
popl %eax movl (%esp),%eax addl $4,%esp
以上pop和push指令可以由後面兩條指令等價替換使用
call 0x1234 pushl %eip movl $0x1234,%eip
ret popl %eip
eip寄存器不能被直接操作,需要使用call、ret等特殊指令修改
enter
pushl %ebp
movl %esp,%ebp
leave
movl %ebp,%esp
popl %ebp
電腦工作模型(馮·諾依曼體繫結構)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/5E/wKioL1T74d7CyxrNAAFTdJZx_gM514.jpg" title="電腦體繫結構.png" alt="wKioL1T74d7CyxrNAAFTdJZx_gM514.jpg" />
(1)電腦處理的資料和指令一律用位元表示
(2)順序執行程式
電腦運行過程中,把要執行的程式和處理的資料首先存入主儲存空間(記憶體),電腦執行程式時,將自動地並按順序從主儲存空間中取出指令一條一條地執行,這一概念稱作順序執行程式。
(3)電腦硬體由運算器、控制器、儲存空間、輸入裝置和輸出裝置五大部分組成。
本文出自 “颯颯秋風” 部落格,請務必保留此出處http://xjhznick.blog.51cto.com/3608584/1618368
通過反組譯碼C程式碼分析電腦函數調用機制和棧幀結構