在intel語法中,第乙個運算元表示目的運算元,第二個運算元表示源運算元,賦值方向從右向左。而在at&t語法中,第乙個運算元表示源運算元,第二個運算元表示目的運算元,賦值方向從左到右。
例:將ebx賦值給eax
intel
at&t
mov eax,ebx
movl %ebx,%eax
在intel語法中暫存器和立即數不需要字首,而at&t語法中暫存器需要加字首%
,立即數需要加字首$
intel與at&t字首的區別
intel
at&t
mov eax,8
movl $8,%eax
mov ebx,0ffffh
movl $0xffff,%ebx
int 80h
int $0x80
在intel語法中偏移位址使用,而在at&t語法中偏移位址使用
()
。更具體來說,intel的指令格式是segreg:[base+index*scale+disp]
,而at&t的格式是%segreg:disp(base,index,scale)
。其中index/scale/disp/segreg都是可選的,如果沒有指定scale而制定了index,則scale的預設值為1.
定址語法比較例子(第一行是通用語法):
intel語法
at&t語法
指令 foo,segreg:[base+index*scale+disp]
%segreg:disp(base,index,scale),foo
mov eax,[ebx+20h]
movl 0x20(%ebx),%eax
add eax,[ebx+ecx*2h]
addl (%ebx,%ecx,0x2),%eax
lea eax,[ebx+ecx]
leal (%ebx,%ecx),%eax
sub eax,[ebx+ecx*4h-20h]
subl -0x20(%ebx,%ecx,0x4),%eax
在at&t語法中,操作碼後面有乙個字尾,其含義就是指出操作碼的大小,l
表示32位,w
表示word-16位,b
表示byte-8位。而在intel語法中,則要在記憶體單元運算元的前面加上byte ptr、word ptr和dword ptr等來指定運算元的長度。
操作碼的字尾舉例:
intel語法
at&t語法
mov al,bl
movb %bl,%al
mov ax,bx
movw %bx,%ax
mov eax,ebx
movl %ebx,%eax
mov eax,dword ptr [ebx]
movl (%ebx),%eax
參考
AT T彙編格式與Intel彙編格式的比較
gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...
AT T彙編格式與Intel彙編格式的比較
gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...
AT T彙編格式與Intel彙編格式的比較
gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...