程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言背後的運行機制,c語言運行機制

c語言背後的運行機制,c語言運行機制

編輯:關於C語言

c語言背後的運行機制,c語言運行機制


目的:通過分析c語言轉換成匯編代碼後的執行過程對匯編語言和X86構架有一個初步認識

實驗代碼

 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 返回

實驗感悟

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved