gpt4 book ai didi

assembly - 带有字节目标的 mov 指令立即到内存

转载 作者:行者123 更新时间:2023-12-05 09:24:01 26 4
gpt4 key购买 nike

我正在阅读 Richard C. Detmer 的80x86 汇编语言和计算机体系结构简介教科书

我有一个关于立即到内存 mov 操作码的问题。这里也是我所指的文本部分:

Continuing down figure 4.1, the next row is for immediate-to-memory moves. Each of these instructions has opcode C6, a ModR/M byte, additional address bytes (if needed), and finally a byte containing the immediate operand. The address is encoded as described above for memory-to-register moves. If, for example, smallCounter references a byte in memory and the instruction mov smallCounter, 100 is assembled, the assembler will generate 7 (3+4) bytes of object code, C6 05 xx xx xx xx 64, where xx xx xx xx represents the address in memory, and 64 is the byte-size hex version of 100. The ModR/M byte 05 is 00 000 101, Mod=00 and R/M=101 for direct memory addressing with the Reg field not needed and set to 000.

As another example, consider mov BYTE PTR [edx], -1 with the memory destination using register indirect mode. The opcode is still C6 and the immediate byte (which always comes last) is now FF for -1. The second byte is the ModR/M byte with Mod=00 for register indirect, Reg=000 (unused), and R/M=010 for EDX, making 00 000 010 or 02. The object code is there for C6 02 FF.

page 92, chapter 4, section 1 - Copying Data

图 4.1 - 标题为带有字节目标的 mov 指令 - 是一个包含四列的图表:

  • 第一个列出目的地
  • 第二个列出来源
  • 第三个列出Opcode
  • 第四个列出了目标代码的字节数

上面部分所指的图表中的线是:

Destination: memory byte Source: immediate byte Opcode: C6 Bytes of Object Code: 3+

请原谅我说了那么多,但我希望你和我能在同一页上了解我的书所说的内容。我理解 smallCounter 的部分,但令我困惑的是,mov BYTE PTR [edx], -1 的目标代码在内存中没有地址。它处于间接模式,所以 edx 正在作为一个指针,那么为什么目标代码不包含它所指向的内存中的地址呢?这是否仅适用于具有地址的 smallCounter 操作码之类的变量?为什么与其他语句相比,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

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

另一件事要考虑。这段代码:

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

做同样的事情

mov byte ptr [smallCounter], 100

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

这有助于澄清事情?

关于assembly - 带有字节目标的 mov 指令立即到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17221452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com