實驗四——使用庫函式API和C程式碼中嵌入彙編程式碼兩種方式使用同一個系統呼叫
本次實驗採用4號系統呼叫write
一、使用庫函式API
1.建立hello.c檔案
vim hello.c
2.編譯並執行
編譯
gcc -o hello hello.c
執行
./hello
二、C程式碼中嵌入彙編程式碼
1.建立hello-asm.c檔案
vim hello-asm.c
這段程式碼是使用內聯彙編的C程式,它透過系統呼叫 write
向標準輸出(即螢幕)列印字串 "hello world!"。
①定義了一個 msg
字串為 "hello world!",長度 len
為12。
②使用 asm volatile
來嵌入彙編程式碼,volatile 關鍵字告訴編譯器不要最佳化這段彙編。
③彙編部分:
movl %2, %%edx
: 將字串長度len
移入暫存器edx
,作為系統呼叫的第三個引數。movl %1, %%ecx
: 將msg
的地址放入暫存器ecx
,作為系統呼叫的第二個引數。movl $1, %%ebx
: 檔案描述符1(標準輸出)傳遞給ebx
,作為第一個引數。movl $4, %%eax
: 系統呼叫號4,表示sys_write
,將其放入eax
。int $0x80
: 執行系統呼叫。
④最後透過 int $0x80
觸發系統呼叫,將訊息輸出到螢幕。
2.編譯並執行
編譯
gcc -o hello-asm hello-asm.c
執行
./hello-asm
總結
Linux 系統呼叫的工作機制可以包括以下幾點:
- 使用者態和核心態的切換:系統呼叫是使用者程式請求作業系統核心服務的介面,呼叫時會從使用者態切換到核心態。
- 系統呼叫號:每個系統呼叫都有一個唯一的呼叫號,使用者程式透過
eax
暫存器傳遞呼叫號給核心。 - 引數傳遞:系統呼叫的引數透過暫存器(如
ebx
,ecx
,edx
等)傳遞,核心透過這些引數執行相應的操作。 - 中斷觸發:透過觸發中斷(如
int 0x80
)來通知核心執行特定的系統呼叫。 - 返回結果:核心處理完請求後,將結果放回暫存器並返回使用者態程式。