【问题标题】:How do I interpret this instruction?我如何解释这个指令?
【发布时间】:2014-04-22 03:01:18
【问题描述】:

试图了解 cmp 如何与 NASM 一起工作,在 this page 我发现以下内容:

CMP r/m32,reg32               ; o32 39 /r            [386]

还有更多这样的。但是,我无法理解这条线的含义。

我认为 [386] 是指处理器/架构。有人可以解释一下 ASM 语句的含义吗?

【问题讨论】:

  • 我推荐你使用intel的官方指令集参考,别忘了阅读3.1解释指令参考页。

标签: assembly nasm semantics


【解决方案1】:

r/m32 和 reg32 是操作数规范。第一个表示 32 位寄存器或内存操作数,第二个是 32 位寄存器。您链接到的页面的B.1 Key to operand specifications 部分解释了这一点:

寄存器:reg8表示8位通用寄存器,reg16表示16位通用寄存器,reg32表示32位寄存器。 fpureg表示8个FPU堆栈寄存器之一, mmxreg 表示八个 64 位 MMX 寄存器之一,而 segreg 表示一个段寄存器。此外,一些寄存器(如 AL、DX 或 ECX)可以明确指定。

内存引用:mem 表示通用内存引用;当操作数需要特定大小时,使用 mem8、mem16、mem32、mem64 和 mem80。 同样,在某些情况下需要说明符:DEC [地址] 不明确,将被 NASM 拒绝。您必须指定 DEC BYTE [地址]、DEC WORD [地址] 或 DEC DWORD [地址]。

寄存器或内存选择:许多指令可以接受寄存器或内存引用作为操作数。 r/m8 是 reg8/mem8 的简写; r/m16 和 r/m32 类似。 r/m64 与 MMX 相关,是 mmxreg/mem64 的简写。

同样,B.2 Key to opcode descriptions 部分显示了操作码/操作数的编码方式:

代码 o16 和 o32 表示给定形式的指令应使用 16 位或 32 位的操作数进行组装。 换句话说,o16 表示 BITS 32 状态下的 66 前缀,但生成BITS 16 状态下没有代码; o32 表示 BITS 16 状态下的 66 前缀,但在 BITS 32 中不生成任何内容。

这就解释了o32。

十六进制数字,例如 3F,表示包含该数字的固定字节。

这涵盖了39,一个固定的操作码。

代码/r ...表示其中一个操作数是内存地址或r/m,另一个是寄存器,并且应该使用ModR/中的备用(寄存器)字段生成有效地址M 字节等于寄存器操作数的“寄存器值”。

这详细说明了其他操作数的存储方式,尽管这不是一个简单的过程,因为通常需要一些小技巧。我建议按照该部分中给出的链接到详细说明有效地址和寄存器如何编码的部分。

[386] 是引入操作码/操作数集的级别。


如果您真的想了解编码,请组合cmp 语句的几个不同变体,并查看它们生成的机器代码。然后尝试使用 B.1、B.2、B.2.1 和 B.2.5 部分将它们反汇编回源代码。

这有望大大加快您对其工作原理的理解。

【讨论】:

  • 谢谢。但是为什么评论有一些奇怪的数字 - o32 39 /r ?
  • @itsols 你至少应该阅读你链接的页面......正如paxdiablo所说,所有这些都从B1部分开始解释。 o32 表示 32 位操作数,39 是操作码,/r 是编码修饰符。
  • @Jester 谢谢!相信我,我正在通读它们……如此多的交叉引用使我陷入困境。我错过了B1部分。对此感到抱歉。
  • @itsols,我已经用相关页面中的更多引号更新了答案,但我发现最好将指令打入汇编程序并查看结果(机器代码),然后使用它以及详细介绍有效地址和寄存器编码的部分,以尝试将其转换回汇编代码。一旦你完成了几个不同的变体,你就会对编码有更多的了解。事实上,我会将其添加到答案中。
  • @paxdiablo 我 AM 测试它们。事实上,这个问题是我的程序没有给出预期结果的结果。请原谅我的无知,但我尝试使用 cmp 指令进行比较,得到了一个奇怪的结果。也许我做错了。这是我的另一个问题:stackoverflow.com/questions/22440613/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2017-03-11
  • 1970-01-01
  • 2010-10-10
  • 2015-06-11
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多