我正在尝试找出如何编码指令MOV DS, AX,但是我对操作码表感到困惑,如下所示:

字节,或者MOV是一个字节,DS是第二个字节,AX是第三个字节?
该表是否暗示源寄存器前缀DS的二进制值为011?如果是这样,我将如何将其编码为整个指令的一部分?

我无法理解表的列出方式如何有意义;他们应该更具体!任何人都可以解决这个问题吗?

我只想将值从AX寄存器移到数据段DS。没有任何站点可以完美地说明操作码中寄存器的编码是如何正确工作或重新分配的。 。

我想知道是否有100%详细,详尽的教程介绍了每个字节的编码,每个寄存器的值,地址截断,偏移量等如何以二进制形式工作,以及如何用正确的方式对其进行编码。

#1 楼

如果您熟悉编码的工作原理,那么该站点将是一个不错的选择,但是如果您只是刚开始,我现在就跳过它。请参阅第2卷中的第2章指令格式,以及附录,尤其是附录B指令格式和编码以及附录A操作码图。他们详细描述了如何解码指令。

一旦您对指令编码的某些部分有所了解,指令列表页面中的符号就会变得有意义。例如,让我们检查您需要的一个。

MOV的页面上,找到所需的变体。看起来像这样:

Hex     Mnemonic          Encoding   Description
8E /r   MOV Sreg,r/m16**  RM         Move r/m16 to segment register.


在下表中查找“ RM”,我们得到: br />这样我们就可以开始组装操作码。

第一个字节固定为8E

第二个字节是ModRM字节。它由三个字段组成:modregr/m。让我们在Sandpile的这张漂亮表的帮助下组装它。

首先是mod字段。由于我们的第二个操作数是一个寄存器,而不是一个内存引用,因此它对应于mod=11

RM编码行中,我们看到reg对第一个操作数进行编码,在本例中为DS。在表中查找,我们可以看到DS编码为011。最后是r/m字段编码操作数2,即AX。它被编码为000

,所以我们的ModRM字节是11:011:000D8。这使完整的操作码为8E D8。您可以使用自己喜欢的反汇编程序进行检查,例如XED:

Op/En Operand 1     Operand 2     Operand 3 Operand 4
RM    ModRM:reg (w) ModRM:r/m (r) NA        NA


(顺便说一句,编码行中的/r表示我们ModMod字节的reg字段对寄存器进行了编码,而不是操作码扩展。在后一种情况下,该表示将具有/<digit>表示法,其中reg字段的值是) 。

评论


我想学习编码,而不是解码!您能具体一点吗?抱歉,我只能详细解释详细的内容!

–乔纳斯河
2014年2月12日在22:25



编码和解码紧密相连。如果您不知道处理器如何解码指令,就不会弄清楚如何编码指令。

–伊戈尔·斯科钦斯基♦
2014年2月12日在22:29

@ Jonas'River表示解码是正确性的证明。伊戈尔,很好的解释!可能更容易解释,我们在表的下部查找字节值,“有效地址”下的AX对应行,表上半部分的DS下方的列。还是我读错了?

–代码
2014年2月23日下午5:07