为什么在 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 时失败。
我是汇编语言的新手。我最近遇到了一些悲惨的事情。 我创建了一个示例汇编程序,如下所示:
head.h
#define _Length_ 0x0A
main.S
movw $_LENGTH_, %ax
movw _LENGTH_, %ax
现在这两个MOV语句有什么区别? ax 的价值是多少?
我正在使用 Ubuntu 和 GAS 汇编程序(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 时失败。