MOV src, dest (或) MOV dest, src?
Posted
技术标签:
【中文标题】MOV src, dest (或) MOV dest, src?【英文标题】:MOV src, dest (or) MOV dest, src? 【发布时间】:2010-03-07 19:10:35 【问题描述】:MOV 可能是每个人在学习 ASM 时学习的第一条指令。
刚才我遇到了一本书Assembly Language Programming in GNU/Linux for IA32 Architectures By Rajat Moona,上面写着:(断开的链接已删除)
但我得知它是MOV dest, src
。它就像“用src
加载dest
”。甚至Wiki 也这么说。
我并不是说作者错了。我知道他是对的。但是我在这里错过了什么?
btw.. 他正在使用 GCC 的 as
来汇编这些指令。但这不应该改变指令语法吧?
【问题讨论】:
我应该读过第一章的前言和第一段。我跳过了它们。 :( 【参考方案1】:mov dest, src
被称为 Intel syntax。 (例如mov eax, 123
)
mov src, dest
被称为 AT&T syntax。 (例如mov $123, %eax
)
包括 GNU 汇编器在内的 UNIX 汇编器使用 AT&T 语法,我所知道的所有其他 x86 汇编器都使用 Intel 语法。您可以阅读差异on wikipedia。
【讨论】:
有些人只想看着世界燃烧。 请注意,GNU 汇编器默认使用 AT&T 语法,而不是无条件地使用。您可以使用.intel_syntax noprefix
指令将其切换为 Intel 语法。
YASM 具有气体语法模式。 clang 的内置汇编器是 gas 兼容的,并且只支持 GAS 指令,所以我猜你会认为它是一个“Unix”汇编器,即使它在 Windows 上运行,@fuz。我猜 Windows 上的 GAS 也一样?它们起源于 Unix。
@PeterCordes 我在思考“as
二进制文件在 UNIX 系统上接受什么”。【参考方案2】:
是的,as/gas 使用使用 src,dest 顺序的 AT&T 语法。 MASM、TASM、NASM 等都使用顺序“dest, src”。碰巧的是,AT&T 语法不太适合英特尔处理器,而且(至少在 IMO)是一个几乎无法阅读的混乱。例如 movzx
结果特别糟糕。
【讨论】:
【参考方案3】:有两种不同类型的汇编语言语法 - Intel 和 AT&T 语法。 您可以在 Wikipedia's assembly language page 上找到两者的比较。
您的书可能使用 AT&T 语法,其中源操作数位于目标之前。
【讨论】:
【参考方案4】:正如 Jerry Coffin 的回答中已经提到的,英特尔语法更适合 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
-
正如您在操作码 hexdump 中看到的那样,首先是指令操作码 0F7h
,然后是 ModR/M 字节 06h
,然后是小端偏移字 0AA55h
,最后是立即字 @987654326 @。 Intel 语法与汇编源代码中的顺序相匹配。在 AT&T 语法中,这看起来像 testw $0x1234, (0xAA55)
,与编码相比,它交换了顺序。
另一个遵循 Intel 语法顺序的例子是比较条件。例如,考虑这个序列:
cmp ax, 26
jae .label
如果ax
高于或等于 26(在无符号比较中),这将跳转到.label
。此助记符仅适用于 cmp dest, src
操作数顺序,它设置标志为 dest -= src
。
【讨论】:
更重要的是 Intel 语法与 Intel 和 AMD 手册中的所有内容都匹配,而使用 AT&T 语法你将很难找到许多指令,例如 movsbl... @phuclv:有(并且可以)引用等也涉及 AT&T 语法。但我的观点是机器代码编码只适合英特尔语法,所以有一个客观的理由喜欢它。大多数材料使用 Intel 语法这一事实也是正确的,但只是偶然的。以上是关于MOV src, dest (或) MOV dest, src?的主要内容,如果未能解决你的问题,请参考以下文章