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...