實驗:
首先,寫一個簡單的c程序
通過命令編譯c程序為匯編代碼
打開匯編代碼
簡化匯編代碼
假設目前棧底位置為1000,棧為空棧,即ebp=esp=1000,令目前棧底位置為單元1,每單元占4字節
代碼從main部分開始執行
pushl ?%ebp ;在單元1處保存目前ebp1000,棧頂移動一個單元esp=996
movl ?%esp,%ebp;ebp=996
subl ?$4,%esp;esp=992
movl ?$9,(%esp);在單元2處保存立即數9
call ?f;在單元3處保存目前eip23,棧頂移動一個單元esp=988,轉至f開始執行
pushl ?%ebp;在單元4處保存目前ebp996,棧頂移動一個單元esp=984
movl? %esp,%ebp;ebp=984
subl ?$4,%esp;esp=980
movl ?8(%ebp),%eax;將單元2內容存至eax,eax=9
movl ?%eax,(%esp);將eax中內容9至單元5
call ?g;在單元6處保存目前eip15,棧頂移動一個單元esp=976,轉至g開始執行
pushl? %ebp ;在單元7處保存目前ebp984,棧頂移動一個單元esp=972
movl ?%esp,%ebp;ebp=972
movl? 8(%ebp),%eax;將單元5內容存至eax,eax=9
addl ?$7,%eax;eax中內容加上立即數7,eax=16
popl ?%ebp;ebp=984
ret ?;eip=15,返回f繼續執行
leave;ebp=996
ret ?;eip=23,返回main繼續執行
addl? $1,%eax;eax中內容加上立即數1,eax=17
leave;ebp=1000,esp=1000
ret
總結:
這個簡單的小程序主要是依賴寄存器、內存以及內存中的棧進行工作的
操作的實現主要依賴寄存器
調用的實現主要依賴內存中的棧
王瀟洋
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000