【问题标题】:mov instructions with byte destination for immediate to memory带有字节目标的 mov 指令,用于立即到内存
【发布时间】:2013-06-20 18:47:26
【问题描述】:

我正在阅读 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 的操作码总体上是这样的?

【问题讨论】:

    标签: assembly x86 opcode mov addressing-mode


    【解决方案1】:

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

    要修改的内存地址在指令执行之前是未知的。操作码说,“从 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

    这有助于澄清事情吗?

    【讨论】:

    • 谢谢,我现在明白了:)
    • 绝对地址链接时常量,除非您要制作 PIE 可执行文件或共享库。正常的 ELF 可执行文件是位置相关的,并且确实使用 mov edx, imm32 而无需加载时修复。 (或者对于 PIE/PIC,他们从 GOT 加载地址以避免加载时修复。)
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2015-11-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多