1.在intel格式中大多使用大写字母(小写也行),而在AT&T格式中都使用小写字母。
2.在AT&T格式中,寄存器名要加上“%”作为前缀,而在intel中则不需要。
3.指令的原操作上和目的操作数的顺序不同。例如把eax值传入ebx的指令,在intel中是目标在前,而原操作数在后(MOV EBX,EAX),而AT&T则刚好相反(mov %eax,ebx)。他们一个思想是:EBX=EAX,一个是:%eax->%ebx。
4.访问指令的操作数大小表示不同:AT&T是b(表示8位),w(表示16位),l(表示32位)。intel格式是在表示内存操作数的前面加 BYTE PTR(WORD PTR,DWORD PTR)。例如,将FOO所指向的内存单元的直接取8位给寄存器AL:mov al,byte ptr FOO(INTEL 格式),movb FOO,%al(AT&T格式)
5.在AT&T格式中,直接操作数前要加"$",而intel格式不需要。例如:PUSH 4(INTEL格式),pushl $4(AT&T格式)。
6.在AT&T格式,绝对专业或调用指令 jump/call的操作数要加上"*".
7.远程转移和调用指令的操作码差异:AT&T格式(lcall $section,$offset, ljmp $section,$offset),Intel格式(CALL FAR SECTION:OFFSET, JMP FAR SECTION:OFFSET).
8. 间接寻址方式格式:
SECTION:[BASE+INDEX*SCALE+DISP] (Intel格式)
section:disp(base,index,scale) (AT&T格式)
这种寻址方式常用于在数据结构数组中访问特定元素内的一个字段,base为数组的其实地址,scale为每个数组元素的大小,index为下标,如果数组元素是数据结构,那么DISP为具体字段的位移。
例如当index为eax,scale为4,disp为foo:
[foo+eax*4] (intel格式),foo(,%eax,4) (AT&T格式)。注意当AT&T格式括号内只有BASE时,逗号是可以省略的。
阅读全文
类别:Linux 查看评论