目的:通過分析C語言轉換成匯編代碼後的執行過程對匯編語言和X86構架有一個初步認識
實驗代碼
#include <stdio.h>
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
實驗過程
編譯
1.使用cd Desktop切換至桌面
2.使用touch 1-1.c在桌面建立1-1.c這個文件
3.在1-1.c這個文件中輸入我們的代碼,保存
4.使用此命令gcc –S –o main.s main.c -m32編譯成匯編代碼。
結果
逐行分析
main:
pushl %ebp 棧頂向上,開辟出一塊新的內存,將棧底的內存地址放到棧頂(運算完成時函數能跳轉回來)
movl %esp,%ebp 將esp寄存器的值賦給給ebp,使棧底向上移一位
subl $0x4,%esp 將棧頂向上移動一位
movl 8,(%esp) 將參數8放進esp指向的內存
call f 跳轉到函數f
f:
pushl %ebp 棧頂向上,開辟出一塊新的內存,將棧底的內存地址放到棧頂(運算完成時函數能跳轉回來)
movl %esp,%ebp 將esp寄存器的值賦給給ebp,使棧底向上移一位
subl $0x4,%esp 將棧頂向上移動一位
movl 8(%ebp),(%eax)將8這個數字賦給eax寄存器(eax用於函數返回值使用)
movl %eax,(%esp)將eax的值寫入內存
call g 跳轉到函數g
g:
pushl %ebp 棧頂向上,開辟出一塊新的內存,將棧底的內存地址放到棧頂(運算完成時函數能跳轉回來)
movl %esp,%ebp 將esp寄存器的值賦給給ebp,使棧底向上移一位
movl 8(%ebp),%eax 將8賦給eax
addl $3,eax 執行8+3
popl %ebp 退棧
ret 返回函數f
f:
leave 刪除為函數參數建立的空間
ret 返回main函數
main:
addl $1,%eax eax+1
leave 刪除為函數參數建立的空間
ret 返回
實驗感悟
在計算機中通過對內存堆棧的操作函數的執行,跳轉和參數的傳遞。另外通過對學習匯編能讓我們理解程序運行的機制,幫助我們寫出精簡的代碼,提高效率。