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

Inv*_*ion 32 x86 assembly intel-syntax

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

section .data

msg     db      'Enter something: '
len     equ     $ - msg
Run Code Online (Sandbox Code Playgroud)

这个例子中的$代表什么,为什么$ - msg等于字符串的长度?

Ale*_*nze 24

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

  • 假设我没有在msg之后立即声明len.然后"here"将不再指向字符串的结尾,对吗? (8认同)
  • 那是正确的. (2认同)

Wil*_*ung 14

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

  • 我不太清楚汇编程序所说的"当前地址"."当前地址"是指"编译的最后一个语句"(这将是`msg db'输入内容:'`)? (3认同)
  • @Terribad - 汇编程序计算到目前为止放入该部分的字节数.`$`是下一个要去的地方. (2认同)

Sah*_*ngh 7

$ 用于引用当前地址,$$ 用于引用汇编中当前节的起始地址。

例子:

section .text
  Mov A,0x0000
  Mov B,0x0000
  Mov C,0x0000
Run Code Online (Sandbox Code Playgroud)

对于第三行,$ 指的是该行本身的地址,而 $$ 指的是第一行的地址(我们的部分开始的地方)。这个约定对我在 nasm 来说很有效。

来源:nasm.us

  • 这是不正确的。双美元符号(`$$`)指的是当前节的开始,而不是前一个语句。 (4认同)

Cir*_*四事件 5

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
Run Code Online (Sandbox Code Playgroud)

定义msglen为常数12