[中英对照]INTEL与AT&T汇编语法对比
本文首先对文章Intel and AT&T Syntax做一个中英文对照翻译,然后给出一个简单的例子,再用gdb反汇编后,对INTEL与AT&T的汇编语法进行对照从而加深理解。
Intel and AT&T syntax Assembly language are very different from each other in
appearance, and this will lead to confusion when one first comes across AT&T
syntax after having learnt Intel syntax first, or vice versa. So lets start
with the basics. Intel汇编语言和AT&T汇编语言在语法外观上存在着很大的差异,这会让那些从前学过Intel汇编语法
的人在首次接触AT&T语法的时候感到困惑,反之亦然。 因此,我们接下来对基本的语法做一个对比。
1. Prefixs. 前缀
In Intel syntax there are no register prefixes or immed prefixes. In AT&T
however registers are prefixed with a '%' and immed's are prefixed with a '$'.
Intel syntax hexadecimal or binary immed data are suffixed with 'h' and 'b'
respectively. Also if the first hexadecimal digit is a letter then the value
is prefixed by a '0'. 在Intel语法中,不存在寄存器前缀或立即数前缀。但是在AT&T语法中,寄存器以'%'为前缀,立即数则
以'$'为前缀。 在Intel语法中,十六进制立即数以'h'结尾,二进制立即数则以'b'结尾。另外,如果
十六进制立即数的首个数字是字符(a-f),则需要在此十六进制立即数的前缀上冠以'0'。
Example:
| Intel Syntax | AT&T Syntax |
| mov eax, 1 | movl $1, %eax |
| mov ebx, 0ffh | movl $0xff, %ebx |
| int 80h | int $0x80 |
2. Direction of Operands. 运算方向
The direction of the operands in Intel syntax is opposite from that of
AT&T syntax. In Intel syntax the first operand is the destination, and
the second operand is the source whereas in AT&T syntax the first operand
is the source and the second operand is the destination. The advantage
of AT&T syntax in this situation is obvious. We read from left to right,
we write from left to right, so this way is only natural. 在运算方向上,Intel语法与AT&T语法正好相反。 在Intel语法中,第一个操作数是目标,第二个
操作数为源,然而在AT&T语法中,第一个操作数为源,第二个操作数为目标。在这种情形下,AT&T
的语法优势是显而易见的,(因为)我们读的时候从左至右读,写的时候从左至右写。因此,AT&T的
方式才是自然而然的,符合人的读写习惯。
Example:
| Intel Syntax | AT&T Syntax |
| instr dest, source | instr source, dest |
| mov eax, [ecx] | movl (%ecx), %eax |
3. Memory Operands. 内存运算
Memory operands as seen above are different also. In Intel syntax the base
register is enclosed in '[' and ']' whereas in AT&T syntax it is enclosed
in '(' and ')'. 从上面的例子可以看出,Intel语法和AT&T语法在内存运算方面也不相同。 在Intel语法中,基址寄存器
是被'['和']' (方括号)括起来的,而在AT&T语法中,它是被'('和')'(圆括号)括起来的。
Example:
| Intel Syntax | AT&T Syntax |
| mov eax, [ebx] | movl (%ebx), %eax |
| mov eax, [ebx+3] | movl 3(%ebx), %eax |
The AT&T form for instructions involving complex operations is very obscure
compared to Intel syntax. The Intel syntax form of these is
segreg:[base+index*scale+disp]. The AT&T syntax form is
%segreg:disp(base,index,scale). 与Intel语法相比,AT&T语法格式在涉及到复杂操作的汇编指令上是相当晦涩的。
Intel语法格式是 segreg:[base + index * scale + disp],
AT&T语法格式则是%segreg:disp(base, index, scale)。 Index/scale/disp/segreg are all optional and can simply be left out. Scale,
if not specified and index is specified, defaults to 1. Segreg depends on
the instruction and whether the app is being run in real mode or pmode.
In real mode it depends on the instruction whereas in pmode its unnecessary.
Immediate data used should not '$' prefixed in AT&T when used for scale/disp. index/scale/disp/segreg都是可选的,可以简单地给省略掉。scale, 如果未指定并且指定了索引,
则默认为1. segreg取决于指令以及应用是否以实模式或保护模式运行。在实模式下,它取决于指令,
而在保护模式下它是不必要的。使用立即数时,在用于scale/disp的时候,不应在AT&T语法中使用'$'前缀。
Example:
| Intel Syntax | AT&T Syntax |
| instr foo, segreg:[base + index * scale + disp] | instr %segreg:disp(base, index, scale), foo |
| mov eax, [ebx + 20h] | movl 0x20(%ebx), %eax |
| add eax, [ebx + ecx * 2h] | addl (%ebx, %ecx, 0x2), %eax |
| lea eax, [ebx + ecx] | leal (%ebx, %ecx), %eax |
| sub eax, [ebx + ecx * 4h - 20h] | subl -0x20(%ebx, %ecx, 0x4), %eax |
As you can see, AT&T is very obscure. [base + index * scale + disp]
makes more sense at a glance than disp(base, index, scale). 从上面的例子可以看出, AT&T语法格式是十分晦涩的。 快速一瞄,Intel的
[base + index * scale + disp]就比AT&T的disp(base, index, scale)
好懂得多。 [速记: a DB IS BiSD ; a: at&t, i: intel | D: Disp, B: Base, I: Index, S: Scale]
4. Suffixes. 后缀
As you may have noticed, the AT&T syntax mnemonics have a suffix.
The significance of this suffix is that of operand size.
'l' is for long, 'w' is for word, and 'b' is for byte.
Intel syntax has similar directives for use with memory operands,
i.e. byte ptr, word ptr, dword ptr. "dword" of course corresponding to "long".
This is similar to type casting in C but it doesnt seem to be necessary since
the size of registers used is the assumed datatype. 你可能已经注意到了,AT&T语法助记符有一个后缀。 后缀的意义是操作数的大小。
'l'代表long(4字节), 'w'代表word(2字节), 和'b'代表byte(1字节)。
Intel语法具有与内存操作数一起使用的类似指令,例如:byte ptr, word ptr,
dword ptr。 当然,"dword"对应于"long"(4字节)。这类似于C语言里的类型转换,
但似乎没有什么必要,因为所用的寄存器的大小就是假定的数据类型。
【注】这句话不完全正确,当操作的对象是内存和立即数时(也就是不涉及到寄存器时),
还是有必要的。例如
mov BYTE PTR [esp+0x21], 12h
Example:
| Intel Syntax | AT&T Syntax |
| mov al, bl | movb %bl, %al |
| mov ax, bx | movw %bx, %ax |
| mov eax, ebx | movl %ebx, %eax |
| mov eax, dword ptr [ebx] | movl (%ebx), %eax |
注: nasm采用的是Intel的语法。关于[base + index * scale + disp], 下面给出一个截图以详细说明。

另外,在gdb中,默认的汇编格式是AT&T,可以使用如下命令更改其为Intel语法格式。
(gdb) set disassembly-flavor intel
最后,给出一个例子和对比图。
o foo.c
#include <stdio.h>
static long long
add(char a, short b, long c, long long d)
{
return a + b + c + d;
} int
main(int argc, char *argv[])
{
char a = 0x12;
short b = 0x1234;
long c = 0x12345678;
long long d = 0x1234567812345678;
long long x = add(a, b, c, d);
return (x & 0x7f);
}
o 使用"gcc -g -m32 -o foo foo.c"编译,然后使用gdb反汇编,对比图如下:

[中英对照]INTEL与AT&T汇编语法对比的更多相关文章
- [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理
[中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理 Introduction to DPDK: ...
- eclipse菜单解释及中英对照《二》
上篇文章主要介绍了eclipse中每个大的标题下的中英文及其用法. 感谢http://blog.csdn.net/li_jinjian2005/article/details/2831641这个博主. ...
- eclipse菜单解释及中英对照
在使用Eclipse作为开发工具的时候,建议使用英文版本的(直接百度从官网下就行,这里不详细描述,如果有问题,咱们私聊).虽然中文版本的对于和我一样对英文是小白的看起来特别爽,但是公司大多是英文版本的 ...
- [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)
这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...
- webstorm快捷键 webstorm keymap内置快捷键英文翻译、中英对照说明
20160114参考网络上的快捷键,整理自己常用的: 查找/代替shift+shift 快速搜索所有文件,简便ctrl+shift+N 通过文件名快速查找工程内的文件(必记)ctrl+shift+al ...
- 知识:CSS 词汇表(中英对照)_CSS Vocabulary
注释(Comment) 语句(Statement) 规则集(Rule-set) At 规则(At-rule) 媒体查询(Media query) 媒体查询列表(Media query list) 媒体 ...
- HALCON中的算子大全(中英对照)
HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...
- 【论文翻译】NIN层论文中英对照翻译--(Network In Network)
[论文翻译]NIN层论文中英对照翻译--(Network In Network) [开始时间]2018.09.27 [完成时间]2018.10.03 [论文翻译]NIN层论文中英对照翻译--(Netw ...
- PCMM(人力资源能力成熟度模型)V2.0中英对照版发布
PCMM中英版终于发布 时光荏苒,从当初的回眸到如今的回头,这才发现:坚守一份承诺是多么的不易! 一年多了,这份承载殷切期待的作品--<PCMM(人力资源能力成熟度模型)V2.0 (中英文对照版 ...
随机推荐
- eclipse中配置server中选择tomcat8无法进行下一步处理
在创建server的时候,选择tomcat8后,server name为空,并且无法手动输入,同时无法进行下一步操作. 解决方案如下: 1.退出eclipse. 2.找到eclipse[工作空间][当 ...
- SQL字符串分割转列,Sql列转字符串
declare @strVar varchar(2000)declare @ResultVar varchar(2000)set @ResultVar='[薄饼],[点心],[海鲜],[酒吧],[楼面 ...
- sql 常用基础查询
*查询第一条记录:select top 1 * from tablename *随机查询N条记录:select top N * from table order by newid( ...
- 1-初步了解C#-语言基础
本篇博客对应视频讲解 前言 终于开始讲语言了,我选择讲C#.为什么呢?因为C#是很好的入门语言,简洁.全面,面向对象类型安全,开发体验好,上手容易.而其他的语言也已经有人讲了很多了,C#相对来说要少一 ...
- Python3.5 学习五
心灵鸡汤电影推荐: 阿甘正传.辛德勒名单.肖申克的救赎.勇敢的心.角斗士.美国丽人.教父.钢琴师.指环王.西雅图不眠夜.廊桥遗梦.可可西里的美丽传说.放牛班的春天.血钻.战争之王.上帝之城.中央车站. ...
- Python3.5 学习一
初期学习,离不了环境搭建及语言的基本语法等. Python属于动态解析.跨平台. 前期了解了Pyhon环境搭建,在Linux(ubuntu)和windows上都有所学习了解,由于不再当前所学资料教程内 ...
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- JAVA Double去掉科学计数"E"
当Double的值很大时,显示的结果会变成带E的科学计数法显示,在报表的数据显示的时候不方便阅读,需要去掉E,将原数据显示 public static void main(String[] args) ...
- 【BZOJ2440】[中山市选2011]完全平方数
题意描述 原题 一句话描述: 求第K个不是完全平方数的倍数的数. K≤$10^{9}$ ------------------------------------------ 题解: 首先,直接求第$k ...
- Elasticsearch基础知识
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口Elasticsearch是用Java开发的,并作为Apache ...