【问题标题】:What does the dollar sign ($) mean in x86 assembly when calculating string lengths like "$ - label"? [duplicate]在 x86 汇编中计算“$ - label”之类的字符串长度时,美元符号 ($) 是什么意思? [复制]
【发布时间】:2012-05-08 19:51:26
【问题描述】:

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

section .data

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

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

【问题讨论】:

  • @James:不,他们在那里谈论$ 符号的不同用法。

标签: assembly x86 intel-syntax


【解决方案1】:

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

【讨论】:

  • 我不太清楚汇编程序所指的“当前地址”是什么。 “当前地址”是指“编译的最后一条语句”(即msg db 'Enter something: ')?
  • @Terribad - 汇编器计算到目前为止放入该部分的字节数。 $ 是下一个要去的地方。
【解决方案2】:

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】:

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

    示例:

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

    对于第 3 行 $ 指的是行本身的地址,而 $$ 指的是第 1 行的地址(我们的部分开始的地方)。 这个约定在 nasm 中适用于我。

    来源:nasm.us

    【讨论】:

    • 这是不正确的。双美元符号 ($$) 指的是当前部分的开头,不是之前的语句。
    • 感谢您指出。我现在已经更正了。
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2018-03-25
    • 2020-01-20
    • 2016-06-20
    • 1970-01-01
    • 2018-07-14
    • 2013-12-13
    相关资源
    最近更新 更多