MOV src, dest (或) MOV dest, src?

Posted

技术标签:

【中文标题】MOV src, dest (或) MOV dest, src?【英文标题】:MOV src, dest (or) MOV dest, src? 【发布时间】:2011-01-24 17:56:41 【问题描述】:

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

刚才我遇到了一本书Assembly Language Programming in GNU/Linux for IA32 Architectures By Rajat Moona,上面写着:(断开的链接已删除)

但我得知它是MOV dest, src。它就像“用src加载dest”。甚至Wiki 也这么说。

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

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

【问题讨论】:

我应该读过第一章的前言和第一段。我跳过了它们。 :( 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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 系统上接受什么”。【参考方案3】:

是的,as/gas 使用使用 src,dest 顺序的 AT&T 语法。 MASM、TASM、NASM 等都使用“dest, src”顺序。碰巧的是,AT&T 语法不太适合英特尔处理器,而且(至少在 IMO)是一个几乎无法阅读的混乱。例如movzx结果特别糟糕。

【讨论】:

【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章

MOV src, dest (或) MOV dest, src?

mov-[地址值]-call

MOV与LEA

汇编指令MOV

mov指令用法

在没有 UIWebView 或 MPMoviePlayer 的情况下播放 .mov 文件