AT T組合語言

2021-07-09 04:34:09 字數 2357 閱讀 4709

at&t彙編和8086組合語言雖然兩者很相似,但是還是不能根據8086的語法規則來讀at&t彙編的吧,所以還是要看看at&t彙編的語法規則,因為在讀核心**時,跟硬體打交道的部分**是用at&t彙編編寫的,所以不可避免的會遇到at&t彙編,下面先來看看at&t彙編的語法規則吧。

一、 大小寫 

intel格式的指令使用大寫字母,而at&t格式的使用小寫字母。 

例: intel  at&t 

mov eax,ebx  movl %ebx,%eax 

二、 運算元賦值方向 

在intel語法中,第乙個表示目的運算元,第二個表示源運算元,賦值方向從右向左。

at&t語法第乙個為源運算元,第二個為目的運算元,方向從左到右,合乎自然。 

例: intel                        at&t 

mov eax,ebx  movl %ebx,%eax 

三、字首 

在 intel 語法中暫存器和立即數不需要字首;at&t 中暫存器需要加字首「%」 ;立即數

需要加字首「$」 。 

例: intel  at&t 

mov eax,1  movl $1,%eax 

符號常數直接引用,不需要加字首,如:movl value , %ebx,value為一常數;在符

號前加字首$表示引用符號位址, 如movl $value, %ebx,是將value的位址放到 ebx中。 

匯流排鎖定字首「lock」 :匯流排鎖定操作。 「lock」字首在linux 核心**中使用很多,特

別是smp**中。當匯流排鎖定後其它cpu不能訪問鎖定位址處的記憶體單元。

遠端跳轉指令和子過程呼叫指令的操作碼使用字首「l「,分別為 ljmp,lcall,與之

相應的返回指令偽lret。 

例: intel  at&t 

call far section:offset  lcall $secion:$offset 

jmp far section:offset  ljmp $secion:$offset 

ret far satck_adjust  lret $stack_adjust 

在at&t格式中,絕對轉移或者呼叫指令jump/call的運算元(也即轉移或呼叫的目標位址),要加上「 *」作為字首(不要以為是c語言中的指標,哈哈),而在intel格式中則不帶。

四、間接定址語法 

intel 中基位址使用「[」 、「]」 ,而在 at&t 中使用「(」、「)」 ;另外處理複雜運算元的

語法 也 不同 , intel 為 segreg:[base+index*scale+disp] , 而在 at&t 中為

%segreg:disp(base,index,sale),其中segreg,index,scale,disp都是可選的,在指定

index而沒有顯式指定scale的情況下使用預設值 1。scale和 disp不需要加字首「&」 。 

intel  at&t 

instr 

foo,segreg:[base+index*scale+disp] 

instr

%segreg:disp(base,index,scale),foo 

五、 字尾 

at&t 語法中大部分指令操作碼的最後乙個字母表示運算元大小, 「b」表示 byte(乙個

位元組) ;「w」表示 word(2 個位元組) ;「l」表示 long(4 個位元組) 。intel 中處理記憶體運算元

時也有類似的語法如:byte ptr、word ptr、dword ptr。 

例: intel  at&t 

mov al, bl  movb %bl,%al 

mov ax,bx  movw %bx,%ax 

mov eax, dword ptr [ebx]  movl (%ebx), %eax 

在 at&t 彙編指令中,運算元擴充套件指令有兩個字尾,乙個指定源運算元的字長,另乙個

指定目標運算元的字長。at&t 的符號擴充套件指令的為「movs」 ,零擴充套件指令為「movz」 (相應

的 intel指令為「movsx」和「movzx」) 。因此, 「movsbl %al,%edx」表示對暫存器 al 中的

位元組資料進行位元組到長字的符號擴充套件,計算結果存放在暫存器edx中。下面是一些允許的操

作數擴充套件字尾:  

bl: 位元組->長字  ,8位

bw: 位元組->字   ,16位

wl: 字->長字     ,32位

跳轉指令標號後的字尾表示跳轉方向, 「f」 表示向前 (forward) , 「b」 表示向後 (back) 。  

例: jmp 1f 

1:       jmp 1f 

1:有了上面內容做基礎,在接下來我們講解gcc內嵌彙編時就好多了。

組合語言 AT T組合語言

這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...

AT T組合語言筆記

1。在gcc產生的彙編中,0x80498d4表示立即數,而0x80498d4表示記憶體位址0x80498d4對應的內容。對於lable,比如value,則 value表示value的位址,value表示value的值。設函式func的位址 func 0x8048828 這兩種呼叫都是一樣的 1 ca...

AT T與Intel組合語言的比較

at t與intel組合語言的比較 我們知道,linux是unix家族的一員,儘管linux的歷史不長,但與其相關的很多事情都發源於unix。就linux所使用的386組合語言而言,它也是起源於unix。unix最初是為pdp 11開發的,曾先後被移植到vax及68000系列的處理器上,這些處理器上...