2

我正在阅读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表示内存中的地址,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。​​目标代码用于C6 02 FF.

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

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

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

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

目标:内存字节源:立即字节操作码:C6目标代码字节:3+

请原谅我说了这么多,但我希望你和我能在我的书所说的内容上保持一致。我理解smallCounter的部分,但令我困惑的是,它的目标代码mov BYTE PTR [edx], -1在内存中没有地址。它处于间接模式,因此edx将位置作为指针,那么为什么目标代码不包含它指向的内存中的地址呢?这仅适用于smallCounter的操作码具有地址的变量吗?与其他语句相比,为什么总体操作码与smallCounter的方式相同?

4

1 回答 1

8

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

要修改的内存地址在指令执行之前是未知的。操作码说,“从 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

这有助于澄清事情?

于 2013-06-20T19:06:46.223 回答