·程式碼(實驗樓中的程式碼,改了部分數值)命名為test.c
int g(int x)
{
return x + 7;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(3) + 5;
}
·在64位的機器上產生32位彙編(使用指令為:gcc - g test.c -o test -m32),然後使用gdb test指令進入gdb偵錯程式,進入後在main這裡設定一個斷點,然後執行:
·
·使用指令:disassemble獲取彙編程式碼,指令:info registers檢視各暫存器的值:
此時主函式的基址為Ox80483d8
·使用指令:display /i $pc,這樣在每次執行下一條彙編語句時,都會顯示出當前執行的語句
·call指令將下一條指令的地址入棧:
·將上一個函式的基址入棧,從當前%esp開始作為新基址:
·為傳參做準備,然後實參入棧:
·f函式的彙編程式碼:
·實參入棧,然後call指令將下一條指令的地址入棧:
·分配棧空間:
·將%eax與立即數7相加:
·在結束前彈棧:
·結束函式並與立即數相加:
·leave返回棧然後進入main函式:
·ret結束main函式: