Linux環境組合語言程式設計初步——AT&T語法(轉)

ba發表於2007-08-15
Linux環境組合語言程式設計初步——AT&T語法(轉)[@more@]目前正在學習Linux彙編,寫寫文章共享一下心得

組合語言作為一種高效的,而且緊密結合硬體平臺的程式語言,在作業系統,嵌入式開發等領域都有著十分重要的作用。正因為彙編依賴於硬體結構(CPU指令碼),因此不同體系結構上的組合語言也大相徑庭。目前國內大學的組合語言課程大多以Intel平臺的語法格式來講述,而市面上講述其他體系結構組合語言的書籍也是寥寥無幾,這就給系統程式設計師研究其他平臺彙編程式碼帶來了很大的困難。本文簡單介紹了Linux下的AT&T語法,以及在Linux下彙編的基本方法。

AT&T語法起源於AT&T貝爾實驗室,是在當時用於實現Unix系統的處理器操作碼語法之上而形成的,AT&T語法和Intel語法主要區別如下:
AT&T使用$表示立即數,Intel不用,因此表示十進位制2時,AT&T為$2,而Intel就是2
AT&T在暫存器前加%,比如eax暫存器表示為%eax
AT&T 處理運算元的順序和Intel相反,比如,movl %eax, %ebx是將eax中的值傳遞給ebx,而Intel是這樣的mov ebx, eax
AT&T在助記符的後面加上一個單獨字元表示操作中資料的長度,比如movl $foo, %eax等同於Intel的mov eax, word ptr foo
長跳轉和呼叫的格式不同,AT&T為ljmp $section, $offset,而Intel為jmp section:offset
主要的區別就是這些,其他的細節還有很多,下面給出一個具體的例子來說明
CODE:
#cpuid.s Sample program

.section .data

output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx' "

.section .text
.globl _start

_start:

movl $0, %eax

cpuid

movl $output, %edi

movl %ebx, 28(%edi)

movl %edx, 32(%edi)

movl %ecx, 36(%edi)

movl $4, %eax

movl $1, %ebx

movl $output, %ecx

movl $42, %edx

int $0x80

movl $1, %eax

movl $0, %ebx

int $0x80

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-959715/,如需轉載,請註明出處,否則將追究法律責任。

Linux環境組合語言程式設計初步——AT&T語法(轉)
請登入後發表評論 登入
全部評論

相關文章