Linux下AT T彙編語法格式簡介

2021-05-22 18:59:34 字數 2160 閱讀 3736

一、at&t 格式linux 彙編語法格式

在 at&t 彙編格式中,暫存器名要加上 '%' 作為字首;而在 intel 彙編格式中,暫存器名不需要加字首。例如:

at&t格式

intel格式

pushl %eax

push eax

在 at&t 彙編格式中,用 '$' 字首表示乙個立即運算元;而在 intel 彙編格式中,立即數的表示不用帶任何字首。例如:

at&t格式

intel格式

pushl $1

push 1

at&t 和 intel 格式中的源運算元和目標運算元的位置正好相反。在 intel 彙編格式中,目標運算元在源運算元的左邊;而在 at&t 彙編格式中,目標運算元在源運算元的右邊。例如:

at&t格式

intel格式

addl $1, %eax

add eax, 1

在 at&t 彙編格式中,運算元的字長由操作符的最後乙個字母決定,字尾'b'、'w'、'l'分別表示運算元為位元組(byte,8 位元)、字(word,16 位元)和長字(long,32位元);而在 intel 彙編格式中,運算元的字長是用 "byte ptr" 和 "word ptr" 等字首來表示的。例如:

at&t格式

intel格式

movb val, %al

mov al, byte ptr val

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

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

at&t格式

intel格式

ljump $section, $offset

jmp far section:offset

lcall $section, $offset

call far section:offset

與之相應的遠端返回指令則為:

at&t格式

intel格式

lret $stack_adjust

ret far stack_adjust

在 at&t 彙編格式中,記憶體運算元的定址方式是

section:disp(base, index, scale)

而在 intel 彙編格式中,記憶體運算元的定址方式為:

section:[base + index*scale + disp]

由於 linux 工作在保護模式下,用的是 32 位線性位址,所以在計算位址時不用考慮段基址和偏移量,而是採用如下的位址計算方法:

disp + base + index * scale

下面是一些記憶體運算元的例子:

at&t格式

intel格式

movl -4(%ebp), %eax

mov eax, [ebp - 4]

movl array(, %eax, 4), %eax

mov eax, [eax*4 + array]

movw array(%ebx, %eax, 4), %cx

mov cx, [ebx + 4*eax + array]

movb $4, %fs:(%eax)

mov fs:eax, 4

Linux下AT T彙編語法格式簡介

絕大多數linux程式設計師以前只接觸過dos windows下的組合語言,這些彙編 都是intel風格的。但在unix和linux系統中,更多採用的還是at t格式,兩者在語法格式上有著很大的不同 在at t彙編格式中,暫存器名要加上 作為字首 而在intel彙編格式中,暫存器名不需要加字首。例如...

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下彙編語法

mov long 32bits mov word 16bits mov byte 8bits 取有效位址 偏移量 lea ignore int,edx 表示把ignore int處的有效位址傳給edx note 是去ignore int處的偏移量,而不是ignore int處儲存的內容 使用方法 l...