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系列的處理器上,這些處理器上...