具有字节目标的mov指令,用于即时存储器

时间:2013-06-20 18:47:27

标签: assembly x86 opcode mov addressing-mode

我正在阅读Richard C. Detmer撰写的一本名为 80x86汇编语言和计算机体系结构的介绍的教科书

我对即时内存mov操作码有疑问。这里也是我所指的文字部分:

  

继续向下图4.1,下一行是针对即时到内存的移动。这些指令中的每一个都具有操作码C6,ModR / M字节,附加地址字节(如果需要),最后是包含立即操作数的字节。如上所述对地址进行编码以用于存储器到寄存器移动。例如,如果smallCounter引用内存中的一个字节并且汇编了指令mov smallCounter, 100,汇编器将生成7(3 + 4)个字节的目标代码C6 05 xx xx xx xx 64,其中xx xx xx xx 1}表示内存中的地址,64是100的字节大小十六进制版本.ModR / M字节05是00 000 101,Mod = 00和R / M = 101,用于使用Reg进行直接存储器寻址字段不需要并设置为000。

     

作为另一个示例,请使用寄存器间接模式考虑mov BYTE PTR [edx], -1内存目标。操作码仍然是C6,而立即字节(总是最后一个)现在是FF为-1。第二个字节是ModR / M字节,其中Mod = 00用于寄存器间接,Reg = 000(未使用),R / M = 010用于EDX,使00 000 010或02.目标代码用于{{ 1}}。

     

第92页,第4章,第1节 - 复制数据

图4.1 - 带有字节目标的 mov指令 - 是一个包含四列的图表:

  • 第一个列出目的地
  • 第二个列出来源
  • 第三个列出操作码
  • 和第四个列出对象字节代码

上面部分所指的图表中的线是:

  

目的地:内存字节来源:立即字节操作码: C6 对象代码的字节数: 3 + < / p>

请原谅我把所有这些,但我希望你和我在我的书所说的同一页上。我理解 smallCounter 的部分,但令我困惑的是,C6 02 FF的目标代码在内存中没有地址。它处于间接模式,因此 edx 取代了指针,那么为什么对象代码不包含它指向的内存中的地址呢?仅适用于 smallCounter 的操作码具有地址的变量吗?与其他语句相比,为什么 smallCounter 的操作码总体上与 smallCounter 相比?

1 个答案:

答案 0 :(得分:6)

目标代码不包含内存中的地址,因为在汇编/链接时无法知道该地址。

直到执行指令时才知道要修改的存储器地址。操作码说:“从EDX寄存器中获取要修改的地址,而不是从操作码字节中获取。”

让我们看一下操作码字节。

C6 05 xx xx xx xx FF  <-- store the value at address xx xx xx xx
C6 02 FF              <-- store FF at the address held in the EDX register

因此,CPU不是从操作码中获取地址,而是从EDX寄存器获取目标地址。

要考虑的另一件事。这段代码:

mov edx, offset smallCounter
mov byte ptr [edx], 100

做同样的事情
mov byte ptr [smallCounter], 100

好吧,除了前者修改了EDX寄存器。但两者都将值100存储在smallCounter的内存中。

这有助于澄清事情吗?