更深入地了解汇编语言的寄存器间接模式

时间:2013-06-20 00:30:58

标签: assembly cpu-registers addressing-mode

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

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

add eax, [edx] ; 03 02

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

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

好吧我输入了那个小部分,因为我不理解它,它说使用EDX中的地址来定位第二个dword,但它说第二个数字不是在EDX中,而是它的地址是。什么??所以我们采用EDX的地址,但是它如何在内存中给我们一个数字呢?我认为地址只是解决EDX,以及寄存器中包含的内容,那么如何从EDX中获取数字并仅使用内存地址?地址指向EDX及其包含的内容,因此如果您使用的地址不是,您通常会在EDX中获得该值?所以下面这个陈述不一样吗?:

add eax, edx

如果有人能够给我一些关于注册间接模式的更多见解,我会非常感谢上面提到的一些例子,解释和答案。

1 个答案:

答案 0 :(得分:1)

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

eax = eax + *(uint32_t *)edx;

EDX作为一个寄存器,本身并没有地址 - 这个概念毫无意义。

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

eax = eax + edx;

根本无法访问内存。