5

我在试卷中遇到过这个问题。它指出,哪种给定的寻址模式更快?为什么?

  1. 寄存器寻址方式
  2. 直接寻址方式

现在根据我的说法,寄存器寻址模式应该更快,因为寄存器是计算机中最快的内存位置。这是正确的答案吗?

请帮忙。谢谢

4

2 回答 2

8

两种寻址模式的区别是……地址的来源……对于直接寻址模式,要访问的项目的地址是指令中的立即数编码,因此指令更大,在某些情况下更大所以它需要更多的时钟周期来访问,理想情况下它在缓存中,因为它是紧跟在操作码之后的字节,并且操作码的获取通常会导致至少在它后面的一个缓存行被获取,除了最旧的 x86 平台如果没有其余指令以及已经获取并在管道中的接下来的几条/多条指令,我看不出你将如何到达执行指令的位置。即使是旧的 x86 处理器也有一定大小的预取队列。

寄存器寻址意味着正在访问的项目的地址在寄存器中。假设地址已经在那里,那么这会更快,因为您不会产生更大的指令、额外的周期、更多的缓存线为指令而烧毁。你必须小心这个参数的地方就是例如之前的指令将立即地址加载到寄存器中。

mov ax,[1000h]


mov ax,[bx]

第二个比第一个快(对于可以在这个级别比较的东西),因为指令大小和额外的缓存烧毁和周期。

mov ax,[1000h]


mov bx,1000h    
mov ax,[bx]

直接寻址更快,因为总体而言它需要更少的周期来获取和执行(对于可以比较的东西)。

我所说的可以比较的东西是什么意思?寻址模式与地址来自哪里有关。一旦您开始执行该指令并执行一个内存周期,那么两者相等,它是总线上的一个地址,比较两条指令的数据大小是相同的。对于某些测试程序,直接寻址可能更快,这很可能是因为对于该测试程序,数据始终在数据缓存中,而对于该测试程序,寄存器寻址版本不是或有时不是。所以两条指令之间可以比较的东西是指令的大小,这导致它烧毁的周期和缓存线。一个高速缓存行可以保存许多基于寄存器的指令,但只有少数基于直接/立即数的指令,因此,通过使用直接/立即,您在执行程序时会产生机会成本并总体上会产生更多的内存周期。是的,这些周期中的许多在任何远程现代的东西上都是并行的。

所以这些类型的问题与你是否理解指令集有关,​​取决于你返回了多少细节,你是否理解超出了实际成本是多少。同样,如果没有经验,简单地尝试一个实验可能会失败或没有任何区别,因为您必须围绕缓存进行实验。

我强烈推荐 Michael Abrash 的《汇编语言之禅》一书

http://www.amazon.com/Zen-Assembly-Language-Knowledge-Programming/dp/0673386023/ref=sr_1_1?ie=UTF8&qid=1335971069&sr=8-1

不是一本不完整的黑色大图形编程书随附的免费书。你可以得到一个完好的二手副本(买了第二个,它比我在商店买的原版更好,并且一直住在书架上)。8088和8086的细节在出书的时候就已经过时了,那不是书的重点,重要的是要明白如何攻克问题,如何思考问题,初步了解什么是问题在幕后进行。今天要复杂得多,仍然可以理解,但我建议先从这样的基础开始,然后再进入您今天看到的内容。Esp 与 x86(我强烈建议您在开始研究总线和缓存等时首先学习 x86 以外的任何东西)。 http://github.com/dwelch67/amber_samples。我已经清理并使用开源工具使 amber 处理器(arm2 克隆)可用,以便您可以看到处理器内部运行的东西。一个版本的琥珀有一个缓存。再次作为垫脚石,添加 mmus 和多核等只会增加复杂性。

超级简短的回答,当仅将两条指令相互比较时,直接寻址使用更长的指令进行编码,比寄存器寻址更多的周期。内存副作用、缓存等可能会混淆或抵消差异。

于 2012-05-02T15:11:10.713 回答
5

寄存器访问是最快的。但是,如果您正在访问的内存数据已经在 CPU 的数据缓存中,则内存访问速度可能会一样快。

于 2012-05-02T09:09:48.260 回答