本文首先对文章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汇编语法对比的更多相关文章

  1. [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理

    [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理   Introduction to DPDK: ...

  2. eclipse菜单解释及中英对照《二》

    上篇文章主要介绍了eclipse中每个大的标题下的中英文及其用法. 感谢http://blog.csdn.net/li_jinjian2005/article/details/2831641这个博主. ...

  3. eclipse菜单解释及中英对照

    在使用Eclipse作为开发工具的时候,建议使用英文版本的(直接百度从官网下就行,这里不详细描述,如果有问题,咱们私聊).虽然中文版本的对于和我一样对英文是小白的看起来特别爽,但是公司大多是英文版本的 ...

  4. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

  5. webstorm快捷键 webstorm keymap内置快捷键英文翻译、中英对照说明

    20160114参考网络上的快捷键,整理自己常用的: 查找/代替shift+shift 快速搜索所有文件,简便ctrl+shift+N 通过文件名快速查找工程内的文件(必记)ctrl+shift+al ...

  6. 知识:CSS 词汇表(中英对照)_CSS Vocabulary

    注释(Comment) 语句(Statement) 规则集(Rule-set) At 规则(At-rule) 媒体查询(Media query) 媒体查询列表(Media query list) 媒体 ...

  7. HALCON中的算子大全(中英对照)

    HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...

  8. 【论文翻译】NIN层论文中英对照翻译--(Network In Network)

    [论文翻译]NIN层论文中英对照翻译--(Network In Network) [开始时间]2018.09.27 [完成时间]2018.10.03 [论文翻译]NIN层论文中英对照翻译--(Netw ...

  9. PCMM(人力资源能力成熟度模型)V2.0中英对照版发布

    PCMM中英版终于发布 时光荏苒,从当初的回眸到如今的回头,这才发现:坚守一份承诺是多么的不易! 一年多了,这份承载殷切期待的作品--<PCMM(人力资源能力成熟度模型)V2.0 (中英文对照版 ...

随机推荐

  1. [leetcode] 12. Merge Sorted Array

    这道题的无聊之处在于题目其实给了一些很奇怪的测试用例.比如他会给一些空的数组来,但是这个是不科学的,因为在C++中不允许定义一个空的列表,我们用的又不是那种糙又快的python,所以在这里我遇到了一些 ...

  2. 后台web请求代码(含https,json提交)

    后台web请求 namespace XXXX.Utilites { using System; using System.Collections.Generic; using System.IO; u ...

  3. visual studio code中使用emmet插件在.vue文件失效

    使用visual studio code编辑.vue文件时,emmet插件无法使用,可以通过以下两种试解决: 1.文件→设置,在右侧窗口添加以下代码: "emmet.syntaxProfil ...

  4. 使用Team Explorer Everywhere (TEE) 2015 SDK获取团队项目的签入策略

    TFS的代码签入策略与IDE工具紧密相关,例如Visual Studio中设置的签入策略,只会影响Visual Studio的团队资源管理器:如果需要在Eclipse的TEE中启用签入策略,你还需要在 ...

  5. driver.get()和driver.navigate().to()到底有什么不同?-----Selenium快速入门(四)

    大家都知道,这两个方法都是跳转到指定的url地址,那么这两个方法有什么不同呢?遇到这种情况,第一反应就是查查官方的文档. 官方文档的说法是:Load a new web page in the cur ...

  6. ES6摘抄

    1.函数可选参数function log(x, y = 'World') {} 只能作为尾参数使用,因为如果不是尾参数还是要输入的.2.函数参数默认值与解构赋值结合使用.(注意对象冒号解构等号)fun ...

  7. mysql 添加索引 mysql 如何创建索引

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  8. 用css做出来一个三角形

    用css做出来一个三角形      <!--不设置宽高  转换行内块  边线设置成宽度-->       <div class="triangle"> 三角 ...

  9. [Objective-C语言教程]复合对象(33)

    在Objective-C中,可以在类集群中创建子类,该类集合定义了一个嵌入在其中的类. 这些类对象是复合对象.你可能想知道什么是类集群,下面首先了解什么是类集群. 1. 类集群 类集群是基础框架广泛使 ...

  10. day01 --class --home

    # 1.简述变量命名规范# 2.name = input(“>>>”) name变量是什么数据类型?# 3.if条件语句的基本结构? # 4.用print打印出下面内容:# ⽂能提笔 ...