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 架構。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw