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