刚才我遇到了一本书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
来汇编这些指令。但这不应该改变指令语法吗?
答案 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
。