1

我正在阅读 Richard C. Detmer 撰写的一本关于 80x86 汇编语言的书,题为“80x86 汇编语言和计算机体系结构第二版简介”。我很难理解注册间接模式,我的书是这样说的:

“我们的示例程序没有带有寄存器间接内存操作数的指令。这是一个样子。注释给出了您将在列表文件中看到的目标代码。

add eax, [edx] ; 03 02

第一个操作数 EAX 显然是寄存器模式,第二个操作数是寄存器间接模式。请注意,目标代码只有 2 个字节,不足以包含 32 位内存地址。相反,第二个字节包含表示使用 EDX 寄存器中的地址来定位第二个双字操作数的位。换句话说,第二个数字不在 EDX 中,但它的地址在。方括号符号 ([ ]) 表示汇编语言中的间接寻址。” - 底部的第 65 页(如果您可能有教科书)。

这本书显示了内存插槽的图片和 EDX 在内存中的地址(操作数的地址)位置及其突出显示。

好的,我输入了那个小部分,因为我不明白,它说使用 EDX 中的地址来定位第二个 dword,但它说第二个数字不在 EDX 中,但它的地址是。什么??所以我们获取了 EDX 的地址,但是这如何给我们一个内存中的数字呢?我认为地址只是针对 EDX,以及寄存器中包含的任何内容,那么你怎么能不从 EDX 获得一个数字而只使用内存地址呢?地址指向 EDX 及其包含的内容,所以如果您使用地址而不是通常在 EDX 中获得值?那么下面的这个说法不一样吗?:

add eax, edx

如果有人能给我更多关于寄存器间接模式的见解,并提供一些示例、解释和对我上面问题的答案,我将非常感激。

4

1 回答 1

1

就是说 EDX包含 address。也就是说,EDX 是一个指向内存的指针。这[]表明汇编器应该选择指令操作码/寻址模式,该指令操作码/寻址模式将取消引用 EDX并将内存中该位置的数据字加载到 EAX 中。在类 C 的伪代码中:

eax = eax + *(uint32_t *)edx;

EDX,作为一个寄存器,本身没有地址——这个概念是没有意义的。

您的第二个示例 ( add eax, edx) 类似于:

eax = eax + edx;

内存根本不被访问。

于 2013-06-20T00:37:08.740 回答