目录
Intel 语法和 AT&T 语法的汇编语言在外观上截然不同;如果先学习了其中一种语法,初次接触另一种时往往会感到困惑。因此,让我们从基础知识开始。
1. 前缀
在 Intel 语法中,寄存器和立即数都不使用前缀;而在 AT&T 语法中,寄存器前缀为“%”,立即数前缀为“$”。Intel 语法中的十六进制或二进制立即数分别以“h”和“b”作为后缀;此外,如果十六进制数的首位数字是字母,则需在数值前加上 “0” 作为前缀。
例如:

2. 操作数方向
Intel 语法中操作数的顺序与 AT&T 语法截然相反。在 Intel 语法中,第一个操作数是目标,第二个操作数是源;而在 AT&T 语法中,第一个操作数是源,第二个操作数是目标。在这种情况下,AT&T 语法的优势显而易见:既然我们的读写习惯都是从左到右,那么这种顺序也就显得顺理成章了。
例如:

3. 内存操作数
如上所示,内存操作数也有所不同。在 Intel 语法中,基址寄存器包含在 `[` 和 `]` 之间,而在 AT&T 语法中,它则包含在 `(` 和 `)` 之间。
例如:

与 Intel 语法相比,AT&T 语法中涉及复杂寻址操作的指令格式显得相当晦涩难懂。Intel 语法的形式为 segreg:[base+index*scale+disp],而 AT&T 语法的形式则为 %segreg:disp(base,index,scale)。
Index、scale、disp 和 segreg 均为可选参数,可以直接省略。若指定了 index 但未指定 scale,则 scale 默认为 1。Segreg 的使用取决于具体指令以及程序是在实模式(real mode)还是保护模式(pmode)下运行:在实模式下它取决于指令,而在保护模式下则无需使用。在 AT&T 语法中,用于 scale 或 disp 的立即数不应加“$”前缀。
例如:

如你所见,AT&T 语法非常晦涩难懂。相比`disp(base, index, scale),[base + index * scale + disp] 这种写法让人一眼就能看明白。
4. 后缀
你可能已经注意到,AT&T 语法的助记符带有后缀。这些后缀用于标识操作数的大小:'l' 代表 long(长字/双字),'w' 代表 word(字),'b' 代表 byte(字节)。Intel 语法在处理内存操作数时也有类似的修饰符,例如 `byte ptr`、`word ptr` 和 `dword ptr`,其中 "dword" 对应于 "long"。这类似于 C 语言中的类型转换,但实际上似乎并不总是必要,因为所使用的寄存器大小通常就隐含了数据类型。
例如:

887

被折叠的 条评论
为什么被折叠?



