我正在阅读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的方式相同?