在linux内核编写中, 为了维持与gcc输出汇编程序的兼容性, as汇编器使用AT&T系统的V的汇编语法(下面简称为AT&T语法). 这种语法与Intel汇编程序使用的语法(简称Intel语法)很不一样, 他们之间的主要区别有以下几点:
- AT&T语法中立即操作数前面要加一个字符"$";寄存器操作数名前要加字符百分号"%", 绝对跳转/调用(相对于与程序计数器有关的跳转/调用)操作数前面要加"*". 而Intel汇编语法没有这些限制
- AT$T语法与Intel语法使用的源和目的操作数次序正好相反. AT&T的源和目的操作数是从左到右, “源, 目的”
- AT&T语法中内存操作数的长度(宽度)由操作码最后一个字符来确定. 操作码后缀b, w和l分别指示内存引用宽度为8位字节(byte), 16位字(word)和32位长字(long). Intel语法则通过在内存操作数前使用前缀byte ptr, word ptr和dword ptr来达到同样的目的. 因此, Intel的语句mov al, byte ptr foo对应于AT&T的语句movb $foo, %al.
- AT&T语法中立即形式的远跳转和远调用为ljmp/lcall $section, $offset, 而Intel的是jmp/call far section:offset. 同样, AT&T语法中远返回指令lret $stack-adjust对应Intel的ret far stack-adjust
- AT&T汇编器不提供对多代码段程序的支持, UNIX类操作系统要求所有代码在一个段中