两种寻址模式之间的区别是...地址的来源...对于直接寻址模式,要访问的项目的地址是指令中编码的立即数,因此指令更大,在某些情况下更大因此它需要更多的时钟周期来访问,理想情况下它位于高速缓存中,因为它是紧随操作码之后的字节,并且操作码的获取通常会导致至少在其后面的高速缓存行被获取,除了最旧的 x86 平台之外的任何平台我不知道如果没有指令的其余部分以及已经提取并在管道中的接下来的几个/许多指令,您将如何到达正在执行指令的位置。即使是旧的 x86 处理器也有一定大小的预取队列。
寄存器寻址意味着正在访问的项目的地址位于寄存器中。假设地址已经存在,那么这会更快,因为您不会产生更大的指令、额外的周期、为指令烧毁更多的高速缓存行。必须小心这个参数的地方是,例如之前的指令将立即地址加载到寄存器中。
mov ax,[1000h]
mov ax,[bx]
由于指令大小以及额外的缓存烧毁和周期占用,第二个比第一个更快(对于可以在这个级别进行比较的东西)。
BUT
mov ax,[1000h]
mov bx,1000h
mov ax,[bx]
直接寻址速度更快,因为总体而言,获取和执行所需的周期更少(对于可以比较的事物)。
我所说的可比较的事物是什么意思?寻址模式与地址的来源有关。一旦你开始执行该指令并执行一个内存周期,那么两者就相等,它是总线上的地址,要比较两条指令,数据大小是相同的。很可能的情况是,对于某些测试程序来说,直接寻址更快,仅仅是因为对于该测试程序来说,数据总是在数据高速缓存中,而对于该测试程序来说,寄存器寻址版本不是或有时不是。因此,两条指令之间可以比较的是指令的大小,这导致了它烧毁的周期和缓存行。一个高速缓存行可以容纳许多基于寄存器的指令,但只能容纳一些基于直接/立即的指令,因此通过使用直接/立即,您会产生机会成本,并在执行程序时总体上产生更多的内存周期。是的,许多这样的周期在任何遥远现代的事物上都是并行的。
因此,这些类型的问题与您是否理解指令集有关,并且取决于您返回的详细程度,以及您是否了解超出实际成本的内容。同样,如果没有经验,简单地尝试实验可能会失败或没有显示出任何差异,因为您必须围绕缓存精心设计实验。
我强烈推荐 Michael Abrash 的《The Zen of Assembly Language》一书
不是一本不完整的黑色大图形编程书附带的免费书。你可以买一本状态良好的二手书(买了第二本,它比我在商店买的原版好,一直放在书架上)。关于8088和8086的细节在本书印刷时已经过时了,这不是这本书的重要性,重要的是了解如何解决问题,如何思考问题并初步了解什么是问题正在幕后进行。今天它要复杂得多,仍然可以理解,但我建议先从这样的基础开始,然后再进入您今天看到的内容。特别是 x86(当您开始研究总线和缓存等时,我强烈建议先学习一些东西,除了 x86 之外的任何东西)。http://github.com/dwelch67/amber_samples http://github.com/dwelch67/amber_samples。我已经使用开源工具清理并提供了 amber 处理器(arm2 克隆),以便您可以看到处理器内运行的内容。琥珀的一种版本有缓存。再次强调,添加 mmus 和多核等只会增加复杂性。
超简短的答案,当仅将两条指令相互比较时,直接寻址使用比寄存器寻址更长的指令和更多的周期进行编码。内存副作用、缓存等可能会混淆或抵消差异。