Menu
CoddyTech

Địa chỉ bộ đệm (rsi)

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

Trong syscall write, sau khi cho hệ điều hành biết nơi gửi đầu ra (file descriptor trong rdi), bạn cần cho hệ điều hành biết nội dung cần in ra. Bạn thực hiện việc này bằng cách truyền địa chỉ của chuỗi trong bộ nhớ.

Thanh ghi lưu địa chỉ bộ đệm là rsi.

Bộ đệm là gì?

Bộ đệm đơn giản là một khối bộ nhớ lưu trữ dữ liệu. Trong trường hợp này, bộ đệm là chuỗi mà chúng ta muốn in ra.

Tại sao cần địa chỉ, không phải chính giá trị?

Lệnh gọi hệ thống write cần biết chuỗi bắt đầu ở đâu trong bộ nhớ. Nó sẽ đọc các byte từ địa chỉ đó cho đến khi đạt độ dài bạn chỉ định trong rdx. Bạn không gửi các ký tự thực tế cho lệnh gọi hệ thống. Bạn gửi vị trí của chúng.

Ví dụ:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi chứa địa chỉ của msg

msg thực sự là gì:

msg là một nhãn. Trình hợp dịch thay nhãn này bằng một số: địa chỉ bộ nhớ nơi chuỗi 'Hello' được lưu trữ. Khi viết mov rsi, msg, bạn đưa số địa chỉ đó vào rsi.

Điều gì xảy ra nếu bạn quên địa chỉ?

Nếu bạn không đặt rsi, thanh ghi sẽ chứa giá trị rác còn sót lại từ trước. Hệ điều hành cố đọc chuỗi từ địa chỉ đó. Nếu địa chỉ không hợp lệ, lệnh gọi hệ thống write sẽ không in ra gì, đặt mã lỗi vào rax và chương trình của bạn tiếp tục với lệnh tiếp theo. Nếu giá trị còn sót lại tình cờ là địa chỉ của vùng nhớ có thể đọc được, lệnh gọi hệ thống sẽ in ra bất kỳ byte nào được lưu ở đó.

Ví dụ hoàn chỉnh với lời gọi hệ thống write:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; Lời gọi hệ thống write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; Địa chỉ của chuỗi
    mov rdx, len        ; Số byte
    syscall
challenge icon

Thử thách

Bạn được cho một chuỗi tên là greeting có giá trị 'Hi' theo sau là một ký tự xuống dòng. Hãy viết dòng code nạp địa chỉ của greeting vào rsi.

Chỉ viết lệnh mov cho rsi.

Tự làm thử

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi đã chứa địa chỉ (từ đoạn code của bạn)
    mov rdx, greetingLen
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
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