系統(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)用,請(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