2013-06-20 111 views
0

我读了题为“介绍80x86汇编语言与计算机体系结构”,由理查德·C·德默教科书MOV指令 - 大会

我有一个关于立即到内存“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代表字节大小的十六进制版本的ModR/M字节05为00 000 101,Mod = 00和R/M = 101,用于不需要Reg字段并设置为000的直接存储器寻址。作为另一示例,考虑mov BYTE PTR [edx],-1内存目标使用寄存器间接模式。操作码仍然是C6,而立即字节(总是最后一个)现在为FF。第二个字节是ModR/M字节,对于寄存器间接来说,Mod = 00,对于EDX,Reg = 000(未使用)和R/M = 010,使得00 000 010或02.对象代码在那里对于C6 02 FF。 “-page 92,第4章,第1节 - 复制数据

图4.1 - 题为与字节目的地MOV指令 - 是与四列的图表,第一个列出的目的地,所述第二列表的源极,所述第三。列出操作码,和第四列表的目标代码的字节以上部分参照太图表中的行是: 目的地:存储器字节来源:立即字节操作码:对象代码的C6字节: 3 +

原谅我把所有这些放在一边,但我希望你和我能够在我的书所说的同一页上。我理解smallCounter的部分,但是让我困惑的是mov BYTE PTR [edx],-1的目标代码在内存中没有地址。它处于间接模式,所以edx将作为一个指针,为什么目标代码不包含它所指向的内存中的地址?这只适用于像smallCounter的操作码具有地址的变量吗?为什么总体操作码与smallCounter与其他语句相比的方式是?

谢谢 -Dan

回答

3

的目标代码不包含在内存中的地址,因为该地址不能在装配/链接时是已知的。

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

这有助于澄清事情?

+0

谢谢,我现在明白了:) –