張曉攀+原創作品轉載請註明出處+《Linux核心分析》MOOC課程https://mooc.study.163.com/course/1000029000
實驗樓上配套實驗一
1.建立main.c檔案
touch main.c
vim main.c
2.將main.c檔案編譯成彙編程式碼
gcc –S –o main.s main.c -m32
這條命令的含義是:
gcc
: 呼叫 GCC 編譯器。-S
: 只生成彙編程式碼,不生成可執行檔案。-o main.s
: 指定輸出檔名為main.s
。main.c
: 輸入的 C 原始檔。-m32
: 生成 32 位架構的程式碼。
3.檢視彙編程式碼main.s的內容
vim main.s
彙編程式碼main.s的內容為:
這段程式碼的含義如下:
函式 g
:
- 從第6行開始定義的函式
g
,是一個簡單的函式:pushl %ebp
和movl %esp, %ebp
: 這些指令將棧指標儲存到ebp
暫存器,設定棧幀。movl 8(%ebp), %eax
: 讀取呼叫者傳遞的引數,將其從棧中載入到eax
暫存器中。8(%ebp) 表示棧中ebp
暫存器偏移量為8的位置,這是函式的第一個引數。addl $2, %eax
: 將暫存器eax
中的值加2。popl %ebp
: 恢復ebp
的值,撤銷棧幀設定。ret
: 返回eax
中的值。
這個函式實際上實現的是一個簡單的將輸入引數加2並返回的功能。
函式 f
:
- 第24行開始定義的是函式
f
,它實現了對函式g
的呼叫:- 邏輯與
g
類似,設定棧幀。 movl 8(%ebp), %eax
: 從棧中載入引數到eax
中。movl %eax, (%esp)
: 將這個引數傳遞給g
,即將它存入棧中。call g
: 呼叫函式g
,並獲取其返回值。leave
和ret
: 清理棧幀並返回結果。
- 邏輯與
函式 f
的主要作用是接收一個引數並將其傳遞給 g
,再返回 g
的結果。
函式 main
:
- 第45行開始定義的是
main
函式:- 這個函式傳遞常量值
$3
給函式f
。 movl $3, (%esp)
: 將常量值3壓入棧中,作為引數傳遞給f
。call f
: 呼叫函式f
,獲取返回值。addl $4, %eax
: 這一行的操作是將f
返回的結果加上4。
- 這個函式傳遞常量值
因此,main
函式最終返回的是 f(3)
加4的結果。
總結:
- 函式
g
實現了將傳入的引數加2。 - 函式
f
呼叫了g
,並傳遞了從呼叫者獲取的引數。 main
函式呼叫了f
,傳遞引數3,最終將結果加上4。
這個程式碼的大致邏輯是:main
傳遞3給 f
,f
再傳遞給 g
,g
將3加2並返回5,f
傳回5,main
再加4,最後返回9。