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

Cod*_*ggo 1 x86 assembly 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表示内存中的地址,64表示字节大小的十六进制版本100 .00 000 101对于直接存储器寻址,ModR/M字节05是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指令 - 是一个包含四列的图表:

  • 第一个列出目的地
  • 第二个上市的来源
  • 第三个上市的Opcode
  • 第四个列出了对象字节代码

上述部分中图中的线也是:

目的地:存储器字节源:立即字节操作码:对象代码的C6字节:3+

请原谅我把所有这些,但我希望你和我在我的书所说的同一页上.我理解smallCounter的部分,但令我困惑的是,目标代码mov BYTE PTR [edx], -1是没有内存中的地址.它处于间接模式,因此edx将其作为指针,所以为什么对象代码不包含它指向的内存中的地址呢?这只是对于像smallCounter的操作码有地址的变量吗?为什么整个操作码与smallCounter相比,与其他语句相比?

Jim*_*hel 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
Run Code Online (Sandbox Code Playgroud)

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

另一件需要考虑的事情.这段代码:

mov edx, offset smallCounter
mov byte ptr [edx], 100
Run Code Online (Sandbox Code Playgroud)

做同样的事情

mov byte ptr [smallCounter], 100
Run Code Online (Sandbox Code Playgroud)

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

那有助于澄清事情吗?