gcc採用的是at&t的彙編格式, 也叫gas格式(gnu asembler gnu彙編器), 而微軟採用intel的彙編格式.
一 基本語法
語法上主要有以下幾個不同.
1、暫存器命名原則
at&t
intel
說明%eax
eaxintel的不帶百分號
2、源/目的運算元順序
at&t
intel
說明movl %eax, %ebx
mov ebx, eax
intel的目的運算元在前,源運算元在後
3、常數/立即數的格式
at&t
intel
說明movl $_value,%ebx
mov eax,_value
intel的立即數前面不帶$符號
movl $0xd00d,%ebx
mov ebx,0xd00d
規則同樣適用於16進製制的立即數
4、運算元長度標識
at&t
intel
說明movw %ax,%bx
mov bx,ax
intel的彙編中, 運算元的長度並不通過指令符號來標識
在at&t的格式中, 每個操作都有乙個字元字尾, 表明運算元的大小. 例如:mov指令有三種形式:movb 傳送位元組
movw 傳送字
movl 傳送雙字
因為在許多機器上, 32位數都稱為長字(long word), 這是沿用以16位字為標準的時代的歷史習慣造成的.
---------摘自《深入理解計算機系統》
5、定址方式
at&t
intel
imm32(basepointer,indexpointer,indexscale)
[basepointer + indexpointer*indexscale + imm32)
兩種定址的實際結果都應該是
imm32 + basepointer + indexpointer*indexscale
at&t的彙編格式中, 跳轉指令有點特殊.直接跳轉, 即跳轉目標是作為指令的一部分編碼的.
例如: jmp label_1
間接跳轉, 即跳轉目標是從暫存器或儲存器位置中讀出的. 寫法是在" * "後面跟乙個運算元指示符.
例如: jmp *%eax 用暫存器%eax中的值作為跳轉目標
jmp *(%eax) 以%eax中的值作為讀入的位址, 從儲存器中讀出跳轉目標
--------摘自《深入理解計算機系統》
下面是一些定址的例子:
at&t: `
-4(%ebp)' 相當於 intel: `
[ebp - 4]'
at&t: `
foo(,%eax,4)' 相當於 intel: `
[foo + eax*4]'
at&t: `
foo(,1)' 相當於 intel `
[foo]'
at&t: `
%gs:foo'相當於 intel`
gs:foo'
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彙編格式區分
在intel語法中,第乙個運算元表示目的運算元,第二個運算元表示源運算元,賦值方向從右向左。而在at t語法中,第乙個運算元表示源運算元,第二個運算元表示目的運算元,賦值方向從左到右。例 將ebx賦值給eax intel at t mov eax,ebx movl ebx,eax 在intel語法中...