AT&T使用$表示立即操作数,而Intel的立即操作数是不需要界定的。因此,使用 AT&T语法引用十进制值4时,使用$4,使用Intel语法时只需使用4;
AT&T16进制立即数使用0x前缀,Intel16进制的立即数使用h后缀;
AT&T在寄存器名词前面加上前缀%,而Intel不这样做。因此,使用AT&T语法引用EAX寄存器为%eax;
AT&T语法处理源和目的操作时使用相反的顺序。把十进制值4传送给EAX寄存器,AT&T语法是movl $4, %eax,而Intel语法是 mov eax,4;
AT&T在助记符后面使用一个单独的字符来引用操作中使用的数据长度,而Intel语法中数据长度被声明位单独的操作数。AT&T的指令movl $test, %eax等同于Intel语法的mov eax,doword ptr test;
长调用和跳转使用不同语法定义段和偏移值,AT&T语法使用 ljmp $section, $offset,而Intel语法使用 jmp section:offset;
AT&T间接寻址使用小括号(),Intel间接寻址使用中括号[];
AT&T间接寻址完整格式:%sreg:disp(%base,index,scale),Intel间接寻址完整格式:sreg:[base+index*scale+disp]
表格形式
| AT&T风格 | Intel风格 |
|---|---|
立即数前加$ |
立即数无需另加符号 |
| 16进制立即数使用0x前缀 | 16进制的立即数使用h后缀 |
| 寄存器前加% | 寄存器前无需另加符号 |
| 源操作数在前,目的操作数在后 | 目的操作数在前,源操作数在后 |
| 操作位数:指令加l、w、b | 指令加dword ptr、word ptr、byte ptr |
长跳转 ljmp $section,$offset |
长跳转 jmp section:offset |
| 间接寻址使用小括号() | 间接寻址使用中括号[] |
间接寻址完整格式:%sreg:disp(%base,index,scale) |
间接寻址完整格式:sreg:[base+index*scale+disp] |


