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

fud*_*din 4 assembly addressing-mode x86-16

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

  1. 注册寻址模式
  2. 直接寻址模式

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

请帮忙.谢谢

old*_*mer 7

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

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

mov ax,[1000h]


mov ax,[bx]
Run Code Online (Sandbox Code Playgroud)

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

mov ax,[1000h]


mov bx,1000h    
mov ax,[bx]
Run Code Online (Sandbox Code Playgroud)

直接寻址更快,因为总体来说,获取和执行的周期较少(对于可以比较的事物).

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

因此,这些类型的问题与您是否理解指令集有关,​​并且取决于您返回的详细程度,您是否了解实际成本之外的内容.同样没有经验,只是尝试实验可能会失败或显示没有差异,因为你必须围绕缓存进行实验.

我强烈推荐Michael Abrash撰写的The Zen of Assembly Language一书

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和多核等等只会增加复杂性.

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


Ale*_*nze 5

寄存器访问是最快的。但是,如果您正在访问的内存数据已经在 CPU 的数据缓存中,那么内存访问也可以同样快。

  • OTOH,寄存器寻址我会更快,因为它可以通过寄存器重命名来完成 (2认同)