Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335179
  • 博文数量: 89
  • 博客积分: 5152
  • 博客等级: 大校
  • 技术积分: 1155
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-25 15:12
文章分类

全部博文(89)

文章存档

2012年(1)

2011年(5)

2010年(14)

2009年(69)

我的朋友

分类: LINUX

2009-04-12 20:11:44

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

阅读(593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~