AT&T
使用$
表示立即操作数,而Intel的立即操作数是不需要界定的。因此,使用 AT&T
语法引用十进制值4
时,使用$4
,使用Intel
语法时只需使用4
;
AT&T
16进制立即数使用0x
前缀,Intel
16进制的立即数使用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] |