爱技术 & 爱分享
爱蛋蛋 & 爱生活

AT&T和Intel的x86汇编语法差异

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]
赞(3)
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。墨影 » AT&T和Intel的x86汇编语法差异