歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言背後的運行機制

目的:通過分析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 返回

實驗感悟

  在計算機中通過對內存堆棧的操作函數的執行,跳轉和參數的傳遞。另外通過對學習匯編能讓我們理解程序運行的機制,幫助我們寫出精簡的代碼,提高效率。

Copyright © Linux教程網 All Rights Reserved