位置:首頁 > 高級語言 > Assembly彙編 > Assembly 係統調用

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