october 29, 2011 分類:技術
作為乙個愛折騰的大好青年,補番之餘還要補一些 linux 下的基礎,比如 gdb 的正確使用方法。但無論是看gdb
還是gcc -s
裡的彙編,感覺都不能一下子接受這種設定。
後來發現,雖然同為 x86 彙編,但語法也分兩大流派:之前上學時學的 intel 語法,以及流行於 unix/linux 平台上的 at&t 語法。
首先,兩者最讓人糾結的區別就是源運算元、目標運算元的順序。at&t 語法先寫源運算元,再寫目標運算元;intel 語法先寫目標運算元,再寫源運算元:
at&t
movl %esp, %ebp
intel
mov ebp, esp
然後,另乙個明顯的區別就是指令的命名(或者說,運算元大小的指定方式)。at&t 語法將運算元的大小表示在指令的字尾中(b、w、l);intel 語法將運算元的大小表示在運算元的字首中(byte ptr、word ptr、dword ptr):
at&t
decw (%eax)
intel
dec word ptr [ebx]
再者,各種取址方式的表示。at&t 語法總體上是offset(base, index, width)
的格式;intel 語法總體上是[index * width + base + offset]
的格式:
at&t
movl 0x0100, %eax
movl (%esi), %eax
movl -8(%ebp), %eax
movl 0x0100(,%ebx,4), %eax
movl 0x8(%edx,%ebx,4), %eax
intel
mov eax, [0100]
mov eax, [esi]
mov eax, [ebp-8]
mov eax, [ebx*4+0100]
mov eax, [edx+ebx*4+8]
另外,各種非十進位制數制下數字的表示方法。at&t 語法用字首表示數制(0x、0、0b);intel 語法用字尾表示數制(h、o、b):
at&t
movl 0x8 , %eax
movl 010 , %eax
movl 0b1000, %eax
intel
mov eax, 8h
mov eax, 10o
mov eax, 1000b
最後就是零碎的東西的表示方法了。at&t 語法要在常數前加 $、在暫存器名前加 % 符號;intel 語法沒有相應的東西要加:
at&t
subl $0x30, %eax
intel
sub eax, 30
於是,以上就是 at&t 和 intel 彙編語法的主要區別了……吧
AT T彙編和Intel彙編語法主要區別
at t使用 表示立即運算元,而intel的立即運算元是不需要界定的。因此,使用at t語法引用十進位制值4時,使用 4,使用intel語法時只需使用4。at t在暫存器名稱前加上字首 而intel不這樣做。因此,使用at t語法引用eax暫存器寫為 eax。at t語法處理源和目標運算元時使用相反...
ATT 彙編語法
在研華的pc104上使用看門狗要使用彙編。使用彙編來修改cmos裡面的引數。也就是內聯彙編。linux下gcc只支援att彙編。所以這兒有必要將att語法學習學習。以後需要的時候翻出來溫習溫習。1,運算元的長度 運算元的長度用加在指令後的符號表示 b byte,8 bit w word,16 bit...
AT T與intel彙編格式區分
在intel語法中,第乙個運算元表示目的運算元,第二個運算元表示源運算元,賦值方向從右向左。而在at t語法中,第乙個運算元表示源運算元,第二個運算元表示目的運算元,賦值方向從左到右。例 將ebx賦值給eax intel at t mov eax,ebx movl ebx,eax 在intel語法中...