AT T彙編格式與Intel彙編格式的比較

2021-09-05 22:00:41 字數 1643 閱讀 5025

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語法中...