为什么有必要使用' $'登录AT& T组装?

时间:2016-12-13 20:58:15

标签: assembly x86 x86-16 gas

我是汇编语言的新手。我最近陷入了悲惨的境地。 我创建了一个示例汇编程序,如下所示:

head.h

#define _Length_ 0x0A

main.S

movw $_LENGTH_, %ax
movw _LENGTH_, %ax

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

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

提前致谢

1 个答案:

答案 0 :(得分:5)

AT& T语法中的

$%修饰符使解析更简单(对于汇编程序,不一定是人类)。

我假装你实际上写了#define _LENGTH_ 0x0A而不是#define _Length_ 0x0A

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

$始终意味着立即不变。所以movw $0x0A, %ax将0xA放入AX。

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

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