Assembly 系統呼叫


系統呼叫是使用者空間與核心空間之間的介面的API。我們已經使用該系統呼叫sys_write的sys_exit的的寫入螢幕,然後分別從程式退出。

Linux 系統呼叫

可以利用Linux系統呼叫組合程式。如需要在程式中使用Linux系統呼叫,請採取以下步驟:

  • 把EAX暫存器中的系統呼叫號。

  • 在暫存器儲存的引數的系統呼叫 EBX, ECX等.

  • 呼叫相關的中斷 (80h)

  • 其結果通常是返回EAX 暫存器

有6個暫存器儲存系統呼叫的引數。 它們有 EBX, ECX, EDX, ESI, EDI 和 EBP. 這些暫存器採取連續的引數,起始帶EBX暫存器。如果有超過六個引數,那麼第一個引數的儲存位置被儲存在EBX暫存器。

下面的程式碼片段顯示了使用系統呼叫sys_exit:

mov	eax,1		; system call number (sys_exit)
int	0x80		; call kernel

下面的程式碼片段顯示了使用系統呼叫sys_write:

mov	edx,4		; message length
mov	ecx,msg		; message to write
mov	ebx,1		; file descriptor (stdout)
mov	eax,4		; system call number (sys_write)
int	0x80		; call kernel

列出了所有的系統呼叫 /usr/include/asm/unistd.h, 連同他們的編號(之前把在EAX呼叫int80H)。

下表顯示了一些本教學中使用的系統呼叫:

%eax Name %ebx %ecx %edx %esx %edi
1 sys_exit int - - - -
2 sys_fork struct pt_regs - - - -
3 sys_read unsigned int char * size_t - -
4 sys_write unsigned int const char * size_t - -
5 sys_open const char * int int - -
6 sys_close unsigned int - - - -

例子

下面的例子從鍵盤讀取,並顯示在螢幕上:

section  .data ;Data segment
    userMsg db 'Please enter a number: ' ;Ask the user to enter a number
    lenUserMsg equ $-userMsg             ;The length of the message
    dispMsg db 'You have entered: '
    lenDispMsg equ $-dispMsg                 

section .bss            ;Uninitialized data
    num resb 5
section .text           ;Code Segment
       global _start
_start:
       ;User prompt
       mov eax, 4
       mov ebx, 1
       mov ecx, userMsg
       mov edx, lenUserMsg
       int 80h

       ;Read and store the user input
       mov eax, 3
       mov ebx, 2
       mov ecx, num  
       mov edx, 5       ;5 bytes (numeric, 1 for sign) of that information
       int 80h
       ;Output the message 'The entered number is: '
       mov eax, 4
       mov ebx, 1
       mov ecx, dispMsg
       mov edx, lenDispMsg
       int 80h  

       ;Output the number entered
       mov eax, 4
       mov ebx, 1
       mov ecx, num
       mov edx, 5
       int 80h  
; Exit code
       mov eax, 1
       mov ebx, 0
       int 80h

上面的程式碼編譯和執行時,它會產生以下結果:

Please enter a number:
1234  
You have entered:1234