at&t與intel組合語言的比較
我們知道,linux是unix家族的一員,儘管linux的歷史不長,但與其相關的很多事情都發源於unix。就linux所使用的386組合語言而言,它也是起源於unix。unix最初是為pdp-11開發的,曾先後被移植到vax及68000系列的處理器上,這些處理器上的組合語言都採用的是at&t的指令格式。當unix被移植到i386時,自然也就採用了at&t的組合語言格式,而不是intel的格式。儘管這兩種組合語言在語法上有一定的差異,但所基於的硬體知識是相同的,因此,如果你非常熟悉intel的語法格式,那麼你也可以很容易地把它「移植「到at&t來。下面我們通過對照intel與at&t的語法格式,以便於你把過去的知識能很快地「移植」過來。
1.字首
在intel的語法中,暫存器和和立即數都沒有字首。但是在at&t中,暫存器前冠以「%」,而立即數前冠以「$」。在intel的語法中,十六進製制和二進位制立即數字尾分別冠以「h」和「b」,而在at&t中,十六進製制立即數前冠以「0x」,表2.2給出幾個相應的例子。
表2.2 intel與at&t字首的區別
intel語法
at&t語法
mov eax,8
movl $8,%eax
mov ebx,0ffffh
movl $0xffff,%ebx
int 80h
int $0x80
2. 運算元的方向
intel與at&t運算元的方向正好相反。在intel語法中,第乙個運算元是目的運算元,第二個運算元源運算元。而在at&t中,第乙個數是源運算元,第二個數是目的運算元。由此可以看出,at&t 的語法符合人們通常的閱讀習慣。
例如:在intel中, mov eax,[ecx]
在at&t中,movl (%ecx),%eax
3.記憶體單元運算元
從上面的例子可以看出,記憶體運算元也有所不同。在intel的語法中,基暫存器用「[]」括起來,而在at&t中,用「()」括起來。
例如: 在intel中,mov eax,[ebx+5]
在at&t,movl 5(%ebx),%eax
4.間接定址方式
與intel的語法比較,at&t間接定址方式可能更晦澀難懂一些。intel的指令格式是segreg:[base+index*scale+disp],而at&t的格式是%segreg:disp(base,index,scale)。其中index/scale/disp/segreg全部是可選的,完全可以簡化掉。如果沒有指定scale而指定了index,則scale的預設值為1。segreg段暫存器依賴於指令以及應用程式是執行在實模式還是保護模式下,在實模式下,它依賴於指令,而在保護模式下,segreg是多餘的。在at&t中,當立即數用在scale/disp中時,不應當在其前冠以「$」字首,表2.3給出其語法及幾個相應的例子。
表2.3 記憶體運算元的語法及舉例
intel語法
at&t語法
指令 foo,segreg:[base+index*scale+disp]
指令 %segreg:disp(base,index,scale),foo
mov eax,[ebx+20h]
movl 0x20(%ebx),%eax
add eax,[ebx+ecx*2h
addl (%ebx,%ecx,0x2),%eax
lea eax,[ebx+ecx]
leal (%ebx,%ecx),%eax
sub eax,[ebx+ecx*4h-20h]
subl -0x20(%ebx,%ecx,0x4),%eax
從表中可以看出,at&t的語法比較晦澀難懂,因為[base+index*scale+disp]一眼就可以看出其含義,而disp(base,index,scale)則不可能做到這點。
這種定址方式常常用在訪問資料結構陣列中某個特定元素內的乙個字段,其中,base為陣列的起始位址,scale為每個陣列元素的大小,index為下標。如果陣列元素還是乙個結構,則disp為具體欄位在結構中的位移。
5.操作碼的字尾
在上面的例子中你可能已注意到,在at&t的操作碼後面有乙個字尾,其含義就是指出操作碼的大小。「l」表示長整數(32位),「w」表示字(16位),「b」表示位元組(8位)。而在intel的語法中,則要在記憶體單元運算元的前面加上byte ptr、 word ptr,和dword ptr,「dword」對應「long」。表2.4給出幾個相應的例子。
表2.4 操作碼的字尾舉例
intel語法
at&t語法
mov al,bl
movb %bl,%al
mov ax,bx
movw %bx,%ax
mov eax,ebx
movl %ebx,%eax
mov eax, dword ptr [ebx]
movl (%ebx),%eax
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
AT T組合語言
at t彙編和8086組合語言雖然兩者很相似,但是還是不能根據8086的語法規則來讀at t彙編的吧,所以還是要看看at t彙編的語法規則,因為在讀核心 時,跟硬體打交道的部分 是用at t彙編編寫的,所以不可避免的會遇到at t彙編,下面先來看看at t彙編的語法規則吧。一 大小寫 intel格式...
AT T組合語言筆記
1。在gcc產生的彙編中,0x80498d4表示立即數,而0x80498d4表示記憶體位址0x80498d4對應的內容。對於lable,比如value,則 value表示value的位址,value表示value的值。設函式func的位址 func 0x8048828 這兩種呼叫都是一樣的 1 ca...