mov指令与字节目的地立即到内存

我正在阅读由Richard C. Detmer编写的题为“80x86汇编语言和计算机体系结构导论”的教科书

我有一个关于即时到内存'mov'e操作码的问题。 这里我也提到的那部分文字:

“继续下图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 =作为另一个例子,考虑使用寄存器间接模式的存储器目标的mov BYTE PTR [edx],-1 ,操作码仍然是C6,并且紧接着的字节(它是总是出现在最后)现在FF为-1,第二个字节为ModR / M字节,Mod = 00,用于寄存器间接寄存器,Reg = 000(未使用) ,EDX的R / M = 010,使得00 000 010或02.对于C6 02 FF,目标代码在那里。“ - 第92页第4章第1节 - 复制数据

图4.1 - 带字节目标的mov指令 - 是一个包含四列的图表,第一列出目标,第二列列出源,第三列出操作码,第四列列出对象代码的字节。 上面部分中的行也是指的是:目的地:存储器字节来源:立即字节操作码:C6字节对象代码:3+

原谅我把所有这些放在一起,但我希望你和我能够在我的书所说的内容上保持一致。 我理解smallCounter的部分,但困扰我的是, mov BYTE PTR [edx],-1的目标代码在内存中没有地址。 它处于间接模式,所以edx将这个位置作为指针,为什么目标代码不包含它所指向的内存中的地址? 那只适用于像smallCounter的操作码有地址的变量吗? 为什么整体操作码与其他语句相比,小型计数器的操作方式如此呢?

谢谢你,丹


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

直到执行指令时才会知道要修改的存储器地址。 操作码说:“从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

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

还有一件事要考虑。 此代码:

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

做同样的事情

mov byte ptr [smallCounter], 100

那么,除了前者修改EDX寄存器。 但是两者都将值100存储在smallCounter内存中。

这有助于澄清事情?

链接地址: http://www.djcxy.com/p/72435.html

上一篇: mov instructions with byte destination for immediate to memory

下一篇: A simple x86 disassembler open source for kernel use