Số byte (rdx)
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 38 trên 45.
Bạn đã cho OS biết cần in ra ở đâu (rdi) và cần in ra nội dung gì (rsi). Bây giờ bạn cần cho hệ điều hành biết cần in ra bao nhiêu byte.
Thanh ghi dùng để lưu số byte là rdx.
Tại sao hệ điều hành cần biết độ dài?
Hệ điều hành không biết chuỗi của bạn kết thúc ở đâu. Nếu không có độ dài, hệ điều hành sẽ đọc bộ nhớ mãi mãi. Độ dài cho hệ điều hành biết chính xác khi nào cần dừng.
Ví dụ:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = số byte cần in raĐiều gì xảy ra nếu độ dài không chính xác?
| Nếu bạn đặt | Kết quả |
|---|---|
| Quá ngắn | Chỉ một phần của chuỗi được in ra |
| Quá dài | Hệ điều hành tiếp tục đọc vượt quá chuỗi của bạn, đến vùng nhớ rác: có thể in ra ký tự ngẫu nhiên hoặc gặp sự cố |
| Bằng không | Không có gì được in ra |
Tự động tính độ dài:
Ở chương 3, bạn đã học mẫu $ - label:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + ký tự xuống dòng)Điều này giúp độ dài luôn chính xác, ngay cả khi bạn thay đổi chuỗi.
Ví dụ hoàn chỉnh:
section .data
msg db 'Hello', 0x0a
msgLen 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, msgLen ; Số byte
syscallThử thách
Bạn được cung cấp một chuỗi có tên color với giá trị 'Red', theo sau là một ký tự xuống dòng. Một hằng số có tên colorLen đã được định nghĩa bằng cách dùng $ - color.
Viết dòng code đặt rdx thành độ dài của chuỗi bằng hằng số colorLen.
Chỉ viết lệnh mov cho rdx.
Tự làm thử
section .text
global _start
_start:
; Code của bạn chạy trước (thiết lập rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx đã chứa độ dài (do code của bạn thiết lập)
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
Tự luyện tập: Playground Assembly