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