AT&T彙編格式與Intel彙編格式的比較

來源:互聯網
上載者:User

GCC採用的是AT&T的彙編格式, 也叫GAS格式(Gnu ASembler GNU彙編器), 而微軟採用Intel的彙編格式.
一 基本文法
文法上主要有以下幾個不同.
1、寄存器命名原則

AT&T Intel 說明
%eax eax Intel的不帶百分比符號

2、源/目的運算元順序

AT&T Intel 說明
movl %eax, %ebx mov ebx, eax Intel的目的運算元在前,源運算元在後

3、常數/立即數的格式

AT&T Intel 說明
movl $_value,%ebx mov eax,_value Intel的立即數前面不帶$符號
movl $0xd00d,%ebx mov ebx,0xd00d 規則同樣適用於16進位的立即數

4、運算元長度標識

AT&T Intel 說明
movw %ax,%bx mov bx,ax Intel的彙編中, 運算元的長度並不通過指令符號來標識

在AT&T的格式中, 每個操作都有一個字元尾碼, 表明運算元的大小. 例如:mov指令有三種形式:

movb  傳送位元組

movw  傳送字

movl   傳送雙字

因為在許多機器上, 32位元都稱為長字(long word), 這是沿用以16位字為標準的時代的曆史習慣造成的.

---------摘自《深入理解電腦系統》

5、定址方式

AT&T Intel
imm32(basepointer,indexpointer,indexscale) [basepointer + indexpointer*indexscale + imm32)

兩種定址的實際結果都應該是

imm32 + basepointer + indexpointer*indexscale

AT&T的彙編格式中, 跳轉指令有點特殊.

直接跳轉, 即跳轉目標是作為指令的一部分編碼的.

        例如: jmp Label_1

間接跳轉, 即跳轉目標是從寄存器或儲存空間位置中讀出的. 寫法是在" * "後面跟一個運算元指示符.

        例如: jmp *%eax 用寄存器%eax中的值作為跳轉目標

                 jmp *(%eax) 以%eax中的值作為讀入的地址, 從儲存空間中讀出跳轉目標

--------摘自《深入理解電腦系統》

 

下面是一些定址的例子:

AT&T: `-4(%ebp)'         相當於 Intel: `[ebp - 4]'
AT&T: `foo(,%eax,4)' 相當於 Intel: `[foo + eax*4]'
AT&T: `foo(,1)'           相當於 Intel `[foo]'
AT&T: `%gs:foo'           相當於 Intel`gs:foo'
例子摘自http://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.