$ 符号
本课属于 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' 和换行符)每个字符串的长度都会自动计算。每次计算时,$ 都会重置,因为它始终指向每个字符串后面紧接着的当前位置。
挑战
简单创建一个名为 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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器