Menu
CoddyTech

$ 符号

本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 29 课,共 45 课。

使用 write 系统调用(第 5 章)打印字符串时,你需要告诉 CPU 要打印多少字节。

你可以手动数一下字符:

message db 'Hello', 0x0a    ; 6 字节(H e l l o 换行符)
mov rdx, 6                  ; 手动计数

但手动计数很慢,而且容易出错。如果你更改了字符串,就必须重新计数并更新数字。

答案:使用 $ 自动计算长度

$ 是位置计数器。它表示下一个字节将被放置的当前内存地址。

示例 1:简单字符串

section .data
    message db 'Hello', 0x0a
    msgLen equ $ - message

工作原理:

  • message 是起始地址(例如:1000)
  • 存储 6 个字节后,$ 变为 1006
  • $ - message = 1006 − 1000 = 6(长度)

注意:equ 表示 相等。它会创建一个常量:一个表示某个值的名称。

示例 2:多个字符串

section .data
    first db 'Hi', 0x0a
    len1 equ $ - first      ; len1 = 3('H','i' 和换行符)
    second db 'Hello', 0x0a
    len2 equ $ - second     ; len2 = 6('H','e','l','l','o' 和换行符)

每个字符串的长度都会自动计算。每次计算时,$ 都会重置,因为它始终指向每个字符串后面紧接着的当前位置。

challenge icon

挑战

简单

创建一个名为 city 的字符串,值为 'Paris',后面跟一个换行符(0x0a)。然后创建一个名为 cityLen 的常量,使用 $ - city 自动计算长度。

亲手试试

%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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器