Menu
CoddyTech

Lời gọi hệ thống thoát (60)

Thuộc phần Kiến thức nền tảng trong hành trình Assembly của Coddy. Bài học 32 trên 45.

System call quan trọng nhất đối với mọi chương trình là exit. Nếu không có nó, chương trình của bạn sẽ chạy mãi hoặc gặp sự cố khi chạm đến cuối vùng nhớ.

Số system call exit là 60.

Cú pháp:

mov rax, 60    ; Số hiệu syscall để thoát
mov rdi, 0     ; Mã thoát (0 = thành công)
syscall        ; Yêu cầu hệ điều hành thoát

Điều gì xảy ra khi bạn thực thi syscall với rax = 60:

  1. CPU chuyển sang nhân Linux
  2. Nhân thấy: "exit syscall with code 0"
  1. Kernel kết thúc chương trình của bạn
  2. Kernel trả quyền điều khiển lại cho shell hoặc hệ điều hành

Mã thoát 0 nghĩa là thành công: chương trình đã chạy xong mà không gặp lỗi. Mã thoát từ 1 đến 255 cho biết các lỗi khác nhau. Bạn có thể chọn bất kỳ số nào để báo hiệu điều gì đã xảy ra.

Vì sao mã thoát quan trọng:

Sau khi chương trình thoát, shell (terminal) lưu mã thoát. Bạn có thể kiểm tra mã này bằng lệnh:

./myprogram
echo $?    ; Prints the exit code

Điều này hữu ích cho:

  • Các tập lệnh kiểm tra xem chương trình có chạy thành công hay không
  • Gỡ lỗi (mã khác nhau cho các lỗi khác nhau)
  • Kết nối các chương trình với nhau

Một chương trình tối giản hoàn chỉnh:

section .text
    global _start

_start:
    mov rax, 60    ; lệnh gọi hệ thống để thoát
    mov rdi, 0     ; mã thoát 0 (thành công)
    syscall

Chương trình này không làm gì hiển thị được. Nó chỉ thoát thành công. Nhưng đây là một chương trình hoàn chỉnh và hợp lệ.

Hãy cùng tìm hiểu global _start và _start: là gì.

CodeNó là gìTại sao bạn cần nó
global _startCho trình liên kết biết chương trình của bạn bắt đầu ở đâuNếu thiếu dòng này, trình liên kết không biết nhãn nào là điểm vào
_start:Nhãn đánh dấu điểm bắt đầu đoạn code của bạnCPU bắt đầu thực thi tại đây

Bạn không cần ghi nhớ các chi tiết. Chỉ cần biết rằng mọi main.asm đều phải có hai dòng này trước đoạn code của bạn. Bạn sẽ dùng chúng trong mọi chương trình.

Điều gì xảy ra nếu bạn quên syscall thoát?

Nếu bạn không thêm syscall thoát, CPU sẽ tiếp tục thực thi dữ liệu rác tình cờ nằm trong bộ nhớ sau đoạn code của bạn. Điều này thường gây ra lỗi phân đoạn (crash) hoặc hành vi hoàn toàn không mong đợi. Chương trình của bạn sẽ không kết thúc gọn gàng.

Luôn kết thúc chương trình bằng một lời gọi hệ thống thoát.

challenge icon

Thử thách

Thêm syscall thoát với mã thoát 5.

Code để in ra thông báo "Exiting with code 5" đã được cung cấp sẵn. Bạn chưa cần hiểu đoạn code này. Nội dung này sẽ được học trong chương 5.

Việc duy nhất bạn cần làm là thêm syscall thoát vào cuối.

Tự làm thử

section .data
    msg db 'Exiting with code 5', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msgLen
    syscall

; TODO: Thêm lời gọi hệ thống exit với mã thoát 5
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Playground Assembly