1 #include <stdio.h> 2 3 int g(int x) 4 { 5 return x + 3; 6 } 7 8 int f(int x) 9 { 10 return g(x); 11 } 12 13 int main(void) 14 { 15 return f(8) + 1; 16 }
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 返回
在計算機中通過對內存堆棧的操作函數的執行,跳轉和參數的傳遞。另外通過對學習匯編能讓我們理解程序運行的機制,幫助我們寫出精簡的代碼,提高效率