[中英对照]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 (中英文对照版 ...
随机推荐
- 一个hql语句
在hql语句里面,in的使用方法比较特别. from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' ) in后面是一个list,我写的 ...
- Javascript设计模式理论与实战:单例模式
在Javascript中,单例模式是一种最基本又经常用到的设计模式,可能在不经意间就用到了单例模式. 本文将从最基础的理论开始,讲述单例模式的基本概念和实现,最后用一个例子来讲述单例模式的应用. 理论 ...
- Jmeter+Ant生成结果报告时,MinTime、MaxTime显示NaN的问题
将apache-jmeter-2.13\lib中的serializer-2.7.2.jar.xalan-2.7.2.jar复制到apache-ant-1.9.6\lib中即可: 复制前生成:
- poj 1006 Biorhythms (中国剩余定理模板)
http://poj.org/problem?id=1006 题目大意: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这 ...
- django系列6--Ajax06 使用插件,Sweet-Alert插件
使用SweetAlert插件 GitHub上的下载链接 下载完成后放入django项目静态目录下,在html文件中引入静态文件,下面是script部分 $(".btn-danger" ...
- delphi 在字符串中输出单引号'
在程序代码里,用单引号 引起来的两个单引号,经过编译后是一个单引号.'''ok''':编译后表示'ok';
- pymongo 学习
查看一条记录,返回一条 dict 记录 db.Account.find_one({"UserName":"keyword"}) 查看某一列的一条记录(此时的1, ...
- 【文文殿下】后缀自动机(SAM)求最长公共子串的方法
首先,在A 串上建立一个SAM,然后用B串在上面跑.具体跑的方法是: 从根节点开始,建立一个指针 p ,指着B串的开头,同步移动指针,沿着SAM的边移动,如果可以移动(即存在边)那么万事皆好,直接le ...
- Substr函数助你免杀php脚本
主要利用substr函数和url编解码 本文作者:i春秋签约作家Laimooc 1]安全狗: 新研究的php脚本木马:最新版安全狗扫描如下: 成功看到:扫描已完成,未发现网页木马以及其他威胁(开心吗, ...
- 架构师养成记--35.redis集群搭建
前记:redis哨兵经验之谈.哨兵做主从切换可能要花费一两秒,这一两秒可能会丢失很多数据.解决方法之一是在java代码中做控制,try catch 到 链接断开的异常就sleep 一两秒钟再conti ...