为什么有必要在AT&T组装中使用"$"符号?

Pan*_*der 2 x86 assembly gnu-assembler x86-16

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

head.h

#define _Length_ 0x0A
Run Code Online (Sandbox Code Playgroud)

电源

movw $_LENGTH_, %ax
movw _LENGTH_, %ax
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢

Pet*_*des 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),但在链接时失败.