例如,如果我们正在编写一个简单的 hello world 类型程序,.data 部分可能包含如下内容:
section .data
msg db 'Enter something: '
len equ $ - msg
这个例子中的 $ 代表什么,为什么$ - msg
等于字符串的长度?
例如,如果我们正在编写一个简单的 hello world 类型程序,.data 部分可能包含如下内容:
section .data
msg db 'Enter something: '
len equ $ - msg
这个例子中的 $ 代表什么,为什么$ - msg
等于字符串的长度?
在这种情况下,$ 表示根据汇编程序的当前地址。$ - msg 是汇编程序的当前地址减去 msg 的地址,即字符串的长度。
NASM 文档
http://www.nasm.us/doc/nasmdoc3.html#section-3.5
NASM 支持表达式中的两个特殊标记,允许计算涉及当前装配位置:$ 和 $$ 标记。$ 计算为包含表达式的行首的装配位置;因此您可以使用 JMP $ 编写无限循环。
http://www.nasm.us/doc/nasmdoc3.html#section-3.2.4
EQU 为给定的常量值定义了一个符号:当使用 EQU 时,源代码行必须包含一个标签。EQU 的作用是将给定的标签名称定义为其(唯一)操作数的值。这个定义是绝对的,以后不能改变。所以,例如,
message db 'hello, world' msglen equ $-message
将 msglen 定义为常数 12
$ 用于引用当前地址,$$ 用于引用汇编中当前节的开始地址。
例子:
section .text
Mov A,0x0000
Mov B,0x0000
Mov C,0x0000
对于第 3 行,$ 指的是行本身的地址,而 $$ 指的是第一行的地址(我们的部分开始的地方)。这个约定在 nasm 中对我有用。
来源:nasm.us