AT&T汇编格式与Intel汇编格式的比较
2016-06-06 11:28
141 查看
GCC采用的是AT&T的汇编格式, 也叫GAS格式(Gnu ASembler GNU汇编器), 而微软采用Intel的汇编格式.
一 基本语法
语法上主要有以下几个不同.
1、寄存器命名原则
2、源/目的操作数顺序
3、常数/立即数的格式
4、操作数长度标识
在AT&T的格式中, 每个操作都有一个字符后缀, 表明操作数的大小. 例如:mov指令有三种形式:
movb 传送字节
movw 传送字
movl 传送双字
因为在许多机器上, 32位数都称为长字(long word), 这是沿用以16位字为标准的时代的历史习惯造成的.
---------摘自《深入理解计算机系统》
5、寻址方式
两种寻址的实际结果都应该是
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
一 基本语法
语法上主要有以下几个不同.
1、寄存器命名原则
AT&T | Intel | 说明 |
%eax | eax | Intel的不带百分号 |
AT&T | Intel | 说明 |
movl %eax, %ebx | mov ebx, eax | Intel的目的操作数在前,源操作数在后 |
AT&T | Intel | 说明 |
movl $_value,%ebx | mov eax,_value | Intel的立即数前面不带$符号 |
movl $0xd00d,%ebx | mov ebx,0xd00d | 规则同样适用于16进制的立即数 |
AT&T | Intel | 说明 |
movw %ax,%bx | mov bx,ax | Intel的汇编中, 操作数的长度并不通过指令符号来标识 |
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
相关文章推荐
- JS类数组转数组(Array.prototype.slice.call(arrayLike,0))
- typedef void far *LPVOID
- android http 通讯相关
- C++ 实现DLL注入(一)实现
- 调试出现一大堆错误···
- vs2008 error C2440
- fatal error LNK1168: 无法打开 xxx.exe 进行写入
- "EIPAbstractError" exception with "No peer with the interface with guid [...] has been registered".
- CString sring char* char[]之间的转换
- MFC中CString转换成char数组【转】
- VS2008如何打开VS2010创建的项目
- 跑马灯效果的TextView之singLine 和maxLines
- vc90.pdb 不是创建此预编译头时使用的 pdb 文件,请重新创建预编译头
- pat-函数编程题5-2(然后是几点)
- 天书夜读:入手篇 熟悉汇编
- VS2008编译错误:fatal error C1902: 程序数据库管理器不匹配;请检查安装
- xp和Ubantu双系统删掉Ubantu (mbrfix工具)
- 修改android签名证书keystore
- android 网络编程基础
- win7制作U盘引导安装Ubantu12.04