我正在阅读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 相比?
答案 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
的内存中。
这有助于澄清事情吗?