X86汇编语言风格比较: AT&T 和 Intel 风格

  |   0 评论   |   1,493 浏览

大学期间使用Windows平台的研究较多. 基本接触的程序是Win平台的. IDE用Visual C++ , 自然一般也只会接触到$MS的编译器. 而微软家使用的是Intel 风格的汇编语言. 而在开源界,特别是基于GCC的编译器是使用的是AT&T风格的汇编 . 这里简单记录下两者的区别. 以备查. Linux小白. 如有纰漏, 大家请轻拍.
注: 这里是为了研究语言底层的实现机制,同时研究一些JVM的底层实现逻辑需要. 所以需要对栈帧的结构进行较细致的研究. 因此需要了解编译后的语言的反汇编.

差异对比

寄存器命名

AT&T风格中,寄存器会加上%作为前缀.而Intel汇编中寄存器名是不需要加前缀的.可以直接使用.

AT&T风格Intel风格说明
push %eaxpush eax这是一条入栈指令,把寄存器eax中的值压入栈中

立即数格式

  • AT&T 汇编中 , 用$前缀表示一个立即数.
  • Intel 汇编中 , 立即数没有任何前缀. 直接用一个数字表示. (当然有不同的进制. 比如 0x01 , 10 等)
AT&T风格Intel风格说明
push $1push 1把一个立即数压入栈中

操作数顺序

AT&T和Intel格式中的源操作数和目标操作数的位置正好相反
下面是给寄存器EAX 赋一个初值1.

  • AT&T风格: 操作符 源操作数 , 目的操作数
    mov $1 , %eax
  • Intel 风格: 操作符 目的操作数 , 源操作数
    mov eax , 1
AT&T风格Intel风格说明
push $1push 1把一个立即数压入栈中

内存操作数的寻址方式

  • AT&T寻址格式: section:disp(base, index, scale)
  • Intel 寻址格式: section:[base + index*scale + disp]

无论形式如何,都是实现如下的地址计算:(其中base和index必须是寄存器,disp和scale可以是常数)
disp + base + index * scale
中文释义: 地址或偏移 (%基址或偏移量寄存器, %索引寄存器, 比例因子)
计算方法: 最终地址 = 地址或偏移 + %基址或偏移量寄存器 + %索引寄存器 * 比例因子
寻址参考: AT&T汇编语言及其寻址方式

AT&T格式Intel格式
movl -4(%ebp), %eaxmov eax, [ebp - 4]
movl array(, %eax, 4), %eaxmov eax, [eax*4 + array]
movw array(%ebx, %eax, 4), %cxmov cx, [ebx + 4*eax + array]
movb $4, %fs:(%eax)mov fs:eax, 4

注: 关于寻址中的段寻址知识参考:
目前在Linux环境上,不管是32位还是64位操作系统段寻址都被废弃. 直接使用的线性地址. 不过fsgs在特殊情况下还有使用.

数据宽度表示

  • 在AT&T汇编格式中,操作数的字长由操作符的最后一个字母决定,
    后缀bwl分别表示操作数为字节(byte,8比特)、字(word,16比特)和长字(long,32比特);
  • 而在Intel汇编格式中,操作数的字长是用byte ptrword ptr等前缀来表示的
AT&T格式Intel格式
movb val, %almov al, byte ptr val

反汇编示例

源代码如下:

int add(int x , int y)
{
        int sum = 0;
        sum = x + y;
        return sum;
}

下面是一段C语言函数的反汇编表示.

注: 这些代码都是GCC编译的. 编译后的结果可以使用如下命令来分别输出不同风格的反汇编代码.

AT&T风格

000000000040056a <add>:
  40056a:	55                   	push   %rbp
  40056b:	48 89 e5             	mov    %rsp,%rbp
  40056e:	89 7d ec             	mov    %edi,-0x14(%rbp)
  400571:	89 75 e8             	mov    %esi,-0x18(%rbp)
  400574:	c7 45 fc 00 00 00 00 	movl   $0x0,-0x4(%rbp)
  40057b:	8b 55 ec             	mov    -0x14(%rbp),%edx
  40057e:	8b 45 e8             	mov    -0x18(%rbp),%eax
  400581:	01 d0                	add    %edx,%eax
  400583:	89 45 fc             	mov    %eax,-0x4(%rbp)
  400586:	8b 45 fc             	mov    -0x4(%rbp),%eax
  400589:	5d                   	pop    %rbp
  40058a:	c3                   	retq   
  40058b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)

Intel风格

000000000040056a <add>:
  40056a:	55                   	push   rbp
  40056b:	48 89 e5             	mov    rbp,rsp
  40056e:	89 7d ec             	mov    DWORD PTR [rbp-0x14],edi
  400571:	89 75 e8             	mov    DWORD PTR [rbp-0x18],esi
  400574:	c7 45 fc 00 00 00 00 	mov    DWORD PTR [rbp-0x4],0x0
  40057b:	8b 55 ec             	mov    edx,DWORD PTR [rbp-0x14]
  40057e:	8b 45 e8             	mov    eax,DWORD PTR [rbp-0x18]
  400581:	01 d0                	add    eax,edx
  400583:	89 45 fc             	mov    DWORD PTR [rbp-0x4],eax
  400586:	8b 45 fc             	mov    eax,DWORD PTR [rbp-0x4]
  400589:	5d                   	pop    rbp
  40058a:	c3                   	ret    
  40058b:	0f 1f 44 00 00       	nop    DWORD PTR [rax+rax*1+0x0]

参考文档

  1. can-i-print-the-gdtr-and-gdt-descriptor-under-gdb
  2. GDB调试指南
  3. # linux下gdb常用的调试命令
  4. # Linux从头学11:理解了这三个概念,才能彻底理解任务管理和任务切换
  5. Intel 64/x86_64/IA-32/x86处理器段寄存器 - 32位段寄存器/64位段寄存器
  6. x86段寄存器和分段机制
  7. 汇编语言如何注释?at&t注释为#号
  8. ## objdump反汇编对于小白的一个坑
  9. # gdb,objdump显 intel语法
  10. Differences in Intel (NASM) vs AT&T (GAS) Syntax.
  11. # Linux assemblers: A comparison of GAS and NASM
  12. Red Hat Enterprise Linux 3: Using as, the Gnu Assembler - # AT&T Syntax versus Intel Syntax
  13. # Intel vs. AT&T syntax
  14. CSCI 223 Computer Organisation and Assembly Language
  15. https://stackoverflow.com/questions/972602/limitations-of-intel-assembly-syntax-compared-to-att
  16. [中英对照]INTEL与AT&T汇编语法对比
  17. # GCC汇编语法与Intel汇编语法的几个差异点
  18. Intel汇编指令格式解析
  19. # Linux下AT&T汇编语法格式与Intel汇编语法格式异同
  20. Linux下AT&T汇编语法格式与Intel汇编语法格式异同
  21. AT&T汇编语言及其寻址方式
  22. # gcc命令objdump用法----反汇编
  23. # AT&T与Intel汇编语言的比较
  24. 汇编格式 AT&T 与 Intel

评论

发表评论


取消