Nasm 系统调用

系统调用是用户空间与内核空间之间的接口的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
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!