AT T的彙編格式和inter彙編格式比較

2021-08-18 10:38:07 字數 2325 閱讀 6920

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位字為標準的時代的歷史習慣造成的.

果沒有指定運算元長度的話,編譯器將按照目標運算元的長度來設定。比如指令「mov %ax, %bx」,由於目標運算元bx的長度為word,那麼編譯器將把此指令等同於「movw %ax, %bx」。同樣道理,指令「mov $4, %ebx」等同於指令「movl $4, %ebx」,「push %al」等同於「pushb %al」。對於沒有指定運算元長度,但編譯器又無法猜測的指令,編譯器將會報錯,比如指令「push $4」。

5、定址方式

at&t

intel

imm32(basepointer,indexpointer,indexscale)

[basepointer + indexpointer*indexscale + imm32)

兩種定址的實際結果都應該是

imm32 + basepointer + indexpointer*indexscale

例如: 下面是一些定址的例子:

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: movl -4(%ebp), %eax                  相當於 intel: mov eax, [ebp - 4]

at&t:movl array(, %eax, 4), %eax          相當於 intel: mov eax, [eax*4 + array]

at&t:movw array(%ebx, %eax, 4), %cx  相當於 intel: mov cx, [ebx + 4*eax + array]

at&t:movb $4, %fs:(%eax)                   相當於 intel: mov fs:eax, 4

6.跳轉方式

6.1在 at&t 彙編格式中,絕對轉移和呼叫指令(jump/call)的運算元前要加上'*'作為字首,而在 intel 格式中則不需要。

at&t:

jmp *%eax 用暫存器%eax中的值作為跳轉目標

jmp *(%eax) 以%eax中的值作為讀入的位址, 從儲存器中讀出跳轉目標

intel:不需要*作為字首

jmp %eax

jmp (%eax)

6.2遠端轉移指令和遠端子呼叫指令的操作碼,在 at&t 彙編格式中為 "ljump" 和 "lcall",而在 intel 彙編格式中則為 "jmp far" 和 "call far",即:

at&t:

ljump $section, $offset

lcall $section, $offset

intel:

jmp far section:offset

call far section:offset

att格式彙編指令 關於ATT彙編

att 彙編大體格式是 指令 源運算元 目的運算元 比如將 10 移動到 eax 暫存器的寫法 movl 10,eax 1.att 彙編的源運算元和目的運算元和 intel 正好相反,也就是資料流向是從左到右 2.att 中立即數前需要加 符號,暫存器前加 符號 3.att 的指令加字尾 b w l...

AT T彙編語法格式

1.暫存器的引用要在暫存器前加 如mov eax,ebx 2.運算元排列是左源右目的,如上例表示把值從eax暫存器mov到ebx暫存器 3.常數 立即數前面要加 如mov 4,ebx 4.對於變數加 表示取位址。如mov value,ebx表示傳值給ebx,而mov value,ebx表示傳位址給e...

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

gcc採用的是at t的彙編格式,也叫gas格式 gnu asembler gnu彙編器 而微軟採用intel的彙編格式.一 基本語法 語法上主要有以下幾個不同.1 暫存器命名原則 at t intel 說明 eax eaxintel的不帶百分號 2 源 目的運算元順序 at t intel 說明m...