Assembly - Cuộc gọi hệ thống

Lời gọi hệ thống là các API cho giao diện giữa không gian người dùng và không gian nhân. Chúng tôi đã sử dụng các cuộc gọi hệ thống. sys_write và sys_exit, để ghi vào màn hình và thoát khỏi chương trình, tương ứng.

Cuộc gọi hệ thống Linux

Bạn có thể sử dụng lệnh gọi hệ thống Linux trong các chương trình hợp ngữ của mình. Bạn cần thực hiện các bước sau để sử dụng lệnh gọi hệ thống Linux trong chương trình của mình -

  • Đặt số cuộc gọi hệ thống vào sổ đăng ký EAX.
  • Lưu trữ các đối số cho lệnh gọi hệ thống trong thanh ghi EBX, ECX, v.v.
  • Gọi ngắt liên quan (80h).
  • Kết quả thường được trả về trong thanh ghi EAX.

Có sáu thanh ghi lưu trữ các đối số của lệnh gọi hệ thống được sử dụng. Đây là EBX, ECX, EDX, ESI, EDI và EBP. Các thanh ghi này nhận các đối số liên tiếp, bắt đầu với thanh ghi EBX. Nếu có nhiều hơn sáu đối số, thì vị trí bộ nhớ của đối số đầu tiên được lưu trữ trong thanh ghi EBX.

Đoạn mã sau cho thấy việc sử dụng lệnh gọi hệ thống sys_exit -

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

Đoạn mã sau đây cho thấy việc sử dụng lệnh gọi hệ thống 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ất cả các cuộc gọi tổng hợp được liệt kê trong /usr/include/asm/unistd.h , cùng với số của chúng (giá trị cần đặt trong EAX trước khi bạn gọi int 80h).

Bảng sau đây cho thấy một số lệnh gọi hệ thống được sử dụng trong hướng dẫn này:

% eax Tên % ebx % ecx % edx % esx % edi
1 sys_exit int - - - -
2 sys_fork struct pt_regs - - - -
3 sys_read int không dấu char * size_t - -
4 sys_write int không dấu const char * size_t - -
5 sys_open const char * int int - -
6 sys_close int không dấu - - - -

Thí dụ

Ví dụ sau đây đọc một số từ bàn phím và hiển thị nó trên màn hình -

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Please enter a number:
1234  
You have entered:1234