为什么在 AT&T 汇编中必须使用“$”符号?

Why is it necessary to use '$' sign in AT & T assembly?

我是汇编语言的新手。我最近遇到了一些悲惨的事情。 我创建了一个示例汇编程序,如下所示:

head.h

#define _Length_ 0x0A

main.S

movw $_LENGTH_, %ax
movw _LENGTH_, %ax

现在这两个MOV语句有什么区别? ax 的价值是多少?

我正在使用 Ubuntu 和 GAS 汇编程序(AT & T 语法)。

提前致谢

AT&T 语法中的

$% 装饰器使其更易于解析(对于 assembler,不一定对人类而言)。


我假装你写的是 #define _LENGTH_ 0x0A 而不是 #define _Length_ 0x0A

如果不是,则 _LENGTH_ 被 assembler 视为外部符号,而 _Length_ 是您定义的宏,永远不会在任何地方被替换,因此 assembler 永远不知道它的存在。 C 预处理器与 assembler 完全分开,就像在 C 中一样。


$总是表示立即数。所以 movw [=17=]x0A, %ax 将 0xA 放入 AX。

没有 $ 作为操作数的数字或符号始终表示内存操作数。 movw 0x0A, %ax 是从地址 [ds:0xA] 加载到 AX(对有效地址使用 NASM 表示法)。这几乎不是你想要的。


movw $undefined_symbol, %ax 将 assemble(使用 objdump -drwC 查看 .o 中的重定位信息),但在 link 时失败。