MOV src dest(或)MOV dest src?

时间:2010-03-07 19:10:35

标签: assembly x86 nasm masm gas

MOV可能是每个人在学习ASM时学到的第一条指令。

刚才我遇到了一本书Assembly Language Programming in GNU/Linux for IA32 Architectures By Rajat Moona,上面写着:

alt text http://i.imagehost.org/0897/mov.gif

但我了解到它是MOV dest, src。就像“使用dest加载src”。即使Wiki也是如此。

我不是说作者错了。我知道他是对的。但是我在这里错过了什么?

btw ..他正在使用GCC的as来汇编这些指令。但这不应该改变指令语法吗?

4 个答案:

答案 0 :(得分:38)

mov dest, src称为 Intel语法

mov src, dest称为 AT& T语法

包括GNU汇编程序的UNIX汇编程序使用AT& T语法,我所知道的所有其他x86汇编程序都使用Intel语法。您可以阅读差异on wikipedia

答案 1 :(得分:6)

是的,因为/ gas使用AT& T语法,它使用命令src,dest。 MASM,TASM,NASM等都使用'dest,src'命令。碰巧,AT& T语法不适合英特尔处理器,并且(至少IMO)是一个几乎难以理解的混乱。例如{ {1}}特别糟糕。

答案 2 :(得分:1)

有两种不同类型的汇编语言语法 - 英特尔和AT& T语法。 您可以在Wikipedia's assembly language page找到两者的比较。

您的书可能会使用AT& T语法,其中源操作数位于目标之前。

答案 3 :(得分:1)

正如Jerry Coffin的答案中已经提到的那样,Intel语法更适合x86体系结构的指令编码。作为调试器反汇编程序状态的注释,“ the operands appear in the instruction in the same order as they appear in the disassembly output”。例如,考虑以下说明:

-a
1772:0100 test word [AA55], 1234
1772:0106
-u 100 l 1
1772:0100 F70655AA3412      test    word [AA55], 1234
-

正如您可以在操作码十六进制转储中看到的那样,首先是指令操作码0F7h,然后是ModR / M字节06h,然后是小端偏移量字0AA55h,然后是最后是直接词1234h。 Intel语法与程序集源中的顺序匹配。在AT&T语法中,它看起来像testw $0x1234, (0xAA55),与编码相比,它交换了顺序。

另一个遵守Intel语法顺序的示例是比较条件。例如,考虑以下顺序:

cmp ax, 26
jae .label

如果.label 高于或等于 26(无符号比较),它将跳至ax。此助记符仅适用于cmp dest, src操作数顺序,该顺序将标志设置为dest -= src