Ký hiệu $
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 29 trên 45.
Khi in một chuỗi bằng syscall write (Chương 5), bạn cần cho CPU biết số byte cần in ra.
Bạn có thể tự đếm các ký tự:
message db 'Hello', 0x0a ; 6 byte (H e l l o ký tự xuống dòng)
mov rdx, 6 ; Đếm thủ côngNhưng việc đếm thủ công chậm và dễ mắc lỗi. Nếu bạn thay đổi chuỗi, bạn phải đếm lại và cập nhật con số.
Lời giải: tự động tính độ dài bằng $
$ là bộ đếm vị trí (location counter). Nó biểu thị địa chỉ bộ nhớ hiện tại, nơi byte tiếp theo sẽ được đặt.
Ví dụ 1: Chuỗi đơn giản
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageCách hoạt động:
messagelà địa chỉ bắt đầu (ví dụ: 1000)- Sau khi lưu 6 byte,
$trở thành 1006 $ - message= 1006 − 1000 = 6 (độ dài)
Lưu ý: equ là viết tắt của equate. Từ khóa này tạo ra một hằng số: tên đại diện cho một giá trị.
Ví dụ 2: Nhiều chuỗi
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', ký tự xuống dòng)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', ký tự xuống dòng)Độ dài của mỗi chuỗi được tự động tính toán. $ được đặt lại sau mỗi lần tính vì nó luôn chỉ vị trí hiện tại ngay sau mỗi chuỗi.
Thử thách
DễTạo một chuỗi có tên city với giá trị 'Paris', theo sau là ký tự xuống dòng (0x0a). Sau đó tạo một hằng số có tên cityLen để tự động tính độ dài bằng $ - city.
Tự làm thử
%include "data.asm"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, city
mov rdx, cityLen
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