Menu
CoddyTech

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ông

Như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 $ - message

Cách hoạt động:

  • message là đị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.

challenge icon

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
    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