jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

System Call 專題討論, #3:使用 Assembly 呼叫 System Call(x86)

.作者:jollen/
.日期:December 1, 2006 4:30 PM


Wrapper routine 透過 0x80 號中斷(軟體中斷)進入 kernel space,並且跳至 system call handler執行。由於透過軟體中斷即可達成呼叫 system call的目地,因此使用 assembly來寫程式時,我們也可以直接呼叫system call。

在產生軟體中斷前,我們必須告訴 Linux kernel 所要呼叫的 system call 編號,system call 的編號透過 %eax 暫存器來指定;若要傳遞參數,則是透過其它暫存器來傳遞。

參數傳遞與傳回值

Linux system call最多可傳遞6個參數,參數的傳遞是透過以下的暫存器來完成:

  • %ebx:第1個參數。
  • %ecx:第2個參數。
  • %edx:第3個參數。
  • %esi:第4個參數。
  • %edi:第5個參數。
  • %ebp:第6個參數(做臨時用途)。

System call 的編號由 %eax 暫存器指定。System call 的傳回值則是存放於 %eax 暫存器。請看以下的範例程式 hello.S

.data

msg:        .ascii	    "Hello, World!\n"
            len = . – msg

.text

            .global _start

_start:

# sys_write
	movl	    $len,%edx
	movl	    $msg,%ecx
	movl	    $1,%ebx
	movl	    $4,%eax
	int      $0x80

# sys_exit
	movl	    	$0,%ebx
	movl	    	$1,%eax
	int      $0x80 

組譯與連結的方法為:

$ as -o hello.o hello.S
$ ld -s -o hello hello.o

透過 assembly 程式,我們便能來初步了解 x86 上的 system call 架構。

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2006 www.jollen.org. All rights reserved.
Last update: 2026-07-22