鍍金池/ 教程/ Java/ Assembly 系統(tǒng)調(diào)用
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語(yǔ)言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語(yǔ)法
Assembly匯編 過(guò)程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術(shù)指令
Assembly 環(huán)境設(shè)置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly 系統(tǒng)調(diào)用

系統(tǒng)調(diào)用是用戶(hù)空間與內(nèi)核空間之間的接口的API。我們已經(jīng)使用該系統(tǒng)調(diào)用sys_write的sys_exit的的寫(xiě)入屏幕,然后分別從程序退出。

Linux 系統(tǒng)調(diào)用

可以利用Linux系統(tǒng)調(diào)用匯編程序。如需要在程序中使用Linux系統(tǒng)調(diào)用,請(qǐng)采取以下步驟:

  • 把EAX寄存器中的系統(tǒng)調(diào)用號(hào)。

  • 在寄存器存儲(chǔ)的參數(shù)的系統(tǒng)調(diào)用 EBX, ECX等.

  • 調(diào)用相關(guān)的中斷 (80h)

  • 其結(jié)果通常是返回EAX 寄存器

有6個(gè)寄存器存儲(chǔ)系統(tǒng)調(diào)用的參數(shù)。 它們有 EBX, ECX, EDX, ESI, EDI 和 EBP. 這些寄存器采取連續(xù)的參數(shù),起始帶EBX寄存器。如果有超過(guò)六個(gè)參數(shù),那么第一個(gè)參數(shù)的存儲(chǔ)位置被存儲(chǔ)在EBX寄存器。

下面的代碼片段顯示了使用系統(tǒng)調(diào)用sys_exit:

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

下面的代碼片段顯示了使用系統(tǒng)調(diào)用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

列出了所有的系統(tǒng)調(diào)用 /usr/include/asm/unistd.h, 連同他們的編號(hào)(之前把在EAX調(diào)用int80H)。

下表顯示了一些本教程中使用的系統(tǒng)調(diào)用:

%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 - - - -

例子

下面的例子從鍵盤(pán)讀取,并顯示在屏幕上:

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

上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:

Please enter a number:
1234  
You have entered:1234