Menu
CoddyTech

Ghép các phần lại

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 39 trên 45.

Bạn đã học đủ bốn thành phần của lệnh gọi hệ thống write:

Thanh ghiChứa gìGiá trị khi xuất ra màn hình
raxSố lệnh gọi hệ thống1 (write)
rdiBộ mô tả tệp1 (stdout)
rsiĐịa chỉ bộ đệmĐịa chỉ chuỗi của bạn
rdxSố byteĐộ dài chuỗi của bạn

Bây giờ là lúc ghép tất cả lại với nhau.

Mẫu syscall write hoàn chỉnh:

mov rax, 1          ; số hiệu syscall cho write
mov rdi, 1          ; bộ mô tả tệp (stdout)
mov rsi, msg        ; địa chỉ của chuỗi
mov rdx, msgLen     ; số byte cần in ra
syscall             ; yêu cầu OS in ra

Một chương trình hoàn chỉnh có thể chạy:

section .data
    msg db 'Hello, World!', 0x0a
    msgLen equ $ - msg

section .text
    global _start

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

    mov rax, 60
    mov rdi, 0
    syscall

Chương trình này làm gì:

BướcĐiều gì xảy ra
1In "Hello, World!" ra màn hình
2Chuyển sang dòng mới
3Thoát bình thường với mã 0

Thứ tự rất quan trọng:

Bạn phải thiết lập các thanh ghi trước khi thực thi syscall. Thứ tự của các lệnh mov không quan trọng, miễn là bạn thiết lập đủ cả bốn trước khi thực thi syscall.

challenge icon

Thử thách

Viết một chương trình hoàn chỉnh để in ra thông điệp "Assembly is fun", theo sau là một ký tự xuống dòng, rồi thoát gọn gàng.

Chuỗi và độ dài của chuỗi đã được định nghĩa sẵn. Bạn chỉ cần viết code bên trong _start:.

Tự làm thử

section .data
    msg db 'Assembly is fun', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    ; TODO: Thiết lập và gọi lời gọi hệ thống write
    ; Dùng rax=1, rdi=1, rsi=msg, rdx=msgLen

    ; TODO: Thoát đúng cách với mã 0
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