20242822《Linux核心原理與分析》第二週作業

zzzxp13發表於2024-09-29

張曉攀+原創作品轉載請註明出處+《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 %ebpmovl %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,並獲取其返回值。
    • leaveret: 清理棧幀並返回結果。

函式 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的結果。

總結:

  1. 函式 g 實現了將傳入的引數加2。
  2. 函式 f 呼叫了 g,並傳遞了從呼叫者獲取的引數。
  3. main 函式呼叫了 f,傳遞引數3,最終將結果加上4。

這個程式碼的大致邏輯是:main 傳遞3給 ff 再傳遞給 gg 將3加2並返回5,f 傳回5,main 再加4,最後返回9。

相關文章