在计算像“$ - label”这样的字符串长度时,美元符号($)在x86汇编中的含义是什么?

时间:2012-04-28 06:32:50

标签: assembly x86 intel-syntax

例如,如果我们编写一个简单的hello world类型程序,.data部分可能包含以下内容:

section .data

msg     db      'Enter something: '
len     equ     $ - msg

此示例中的$表示什么,为什么$ - msg等于字符串的长度?

4 个答案:

答案 0 :(得分:24)

表示“此处”的地址。在这里“here”是msg字符串结尾之后的字节。任何汇编文档都会描述这一点。阅读文档。

答案 1 :(得分:13)

在这种情况下,$表示根据汇编程序的当前地址。 $ - msg是汇编程序的当前地址减去msg的地址,这将是字符串的长度。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

$用于表示当前地址,$$用于表示汇编中当前部分的起始地址。

示例:

section .text
  Mov A,0x0000
  Mov B,0x0000
  Mov C,0x0000

表示第3行$表示行本身的地址,而$$表示第1行(本节开始的地址)的地址。 这个约定适用于我。

源:nasm.us