寄存器寻址模式与直接寻址模式

时间:2012-05-02 08:58:19

标签: assembly x86-16 addressing-mode

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

  1. 注册寻址模式
  2. 直接寻址模式
  3. 现在根据我的寄存器寻址模式应该更快,因为寄存器是计算机中最快的内存位置。这是正确答案吗?

    请帮忙。感谢

2 个答案:

答案 0 :(得分:7)

两种寻址模式之间的区别是......地址源...对于直接寻址模式,要访问的项的地址是在指令中立即编码的,所以指令更大,在某些因为它需要更多的时钟周期才能访问,理想情况下它位于高速缓存中,因为紧跟在操作码之后的字节和操作码的取出通常会导致至少有一个高速缓存行被提取,除了最古老的x86平台我没看到你如何在没有剩余指令的情况下到达执行指令的地方,以及已经取出的下一些/很多指令和管道。即使是旧的x86处理器也有一些大小的预取队列。

寄存器寻址表示正在访问的项目的地址在寄存器中。假设地址已经存在,那么这就更快了,因为你不会产生更大的指令,额外的周期,更多的高速缓存行被烧毁用于指令。你需要小心这个参数的地方就是说例如之前的指令就是把直接地址加载到寄存器中。

mov ax,[1000h]


mov ax,[bx]

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

BUT

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。我已经清理并使用开源工具制作了琥珀色处理器(arm2 clone),以便您可以看到处理器内部运行的东西。一个版本的琥珀有一个缓存。再次成为垫脚石,添加mmus和多核等等只会增加复杂性。

超短答案,直接寻址使用更长的指令进行编码,比只有两个指令相互比较时的寄存器寻址更多的周期。记忆副作用,缓存等可能会混淆或消除差异。

答案 1 :(得分:3)

注册访问速度最快。但是,如果您正在访问的内存数据已经存在于CPU的数据缓存中,则内存访问速度可以很快。