Đị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 msgmsg 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
syscallThử 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
syscallBà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
3Lệnh đầu tiên: MOV
MOV là gì?MOV với giá trị tức thờiMOV từ thanh ghi sang thanh ghiMOV từ bộ nhớ sang thanh ghiMOV từ thanh ghi vào bộ nhớLEA: nạp địa chỉMOV với các kích thước khác nhauLuyện tập: hoán đổi thanh ghiÔn tập: thử thách MOV6Lời gọi hệ thống write
Lời gọi hệ thống write (1)Bộ mô tả tệp (rdi)Địa chỉ bộ đệm (rsi)Số byte (rdx)Ghép các phần lạiIn hai chuỗiKý tự xuống dòng rất quan trọngÔn tập: thiết lập writeTự luyện tập: Playground Assembly