Assembly 我如何解释这个指令?

Assembly 我如何解释这个指令?,assembly,nasm,semantics,Assembly,Nasm,Semantics,试图了解cmp如何与NASM协同工作,我发现了以下几点: CMP r/m32,reg32 ; o32 39 /r [386] 还有更多类似的。然而,我不明白这句话的意思 我认为[386]指的是处理器/体系结构。有人能解释一下ASM语句的含义吗?r/m32和reg32是操作数规范。第一个表示32位寄存器或内存操作数,第二个表示32位寄存器。您链接到的页面的B.1操作数规范的键部分解释了这一点: 寄存器:reg8表示8位通用寄存器,reg16表示1

试图了解cmp如何与NASM协同工作,我发现了以下几点:

CMP r/m32,reg32               ; o32 39 /r            [386]
还有更多类似的。然而,我不明白这句话的意思


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

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

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

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

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

类似地,操作码说明的
B.2键部分显示了操作码/操作数的编码方式:

代码o16和o32表示给定形式的指令应与操作数大小为16或32位的指令组合。换句话说,o16表示位32状态的66前缀,但在位16状态下不生成代码;o32表示位16状态中的66前缀,但在位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谢谢!相信我,我正在通读它们。。。这么多的CRO推荐信让我陷入了困境。我漏掉了B1部分。对此很抱歉。@itsols,我已经用相关页面中的更多引用更新了答案,但我发现最好是将一条指令输入汇编程序,然后查看结果(机器代码),然后使用该指令以及详细说明有效地址和寄存器编码的部分,尝试将其转换回汇编代码。一旦您对一些不同的变体完成了这项工作,您将更加了解编码。事实上,我会把它加到答案中。@paxdiablo我正在测试它们。事实上,这个问题是由于我的程序没有给出预期的结果。请原谅我的无知,但我尝试使用cmp指令进行比较,结果很奇怪。也许我做错了。这里是我的另一个问题:我建议您使用英特尔的官方指令集参考,不要忘记阅读第3.1节解释指令参考页。