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

Assembly 寄存器寻址模式与直接寻址模式,assembly,x86-16,addressing-mode,Assembly,X86 16,Addressing Mode,我在一份试卷上遇到了这个问题。它说,, 哪种给定的寻址模式更快?为什么? 寄存器寻址方式 直接寻址方式 现在根据我的说法,寄存器寻址模式应该更快,因为寄存器是计算机中最快的内存位置。这是正确的答案吗 请帮忙。谢谢寄存器访问速度最快。但是,如果您正在访问的内存数据已经在CPU的数据缓存中,那么内存访问的速度可能会一样快。两种寻址模式之间的区别是…地址的来源…对于直接寻址模式,要访问的项的地址是指令中的即时编码,因此指令更大,在某些情况下更大,因此需要更多的时钟周期来访问,理想情况下,它位于缓存中,

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

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


    请帮忙。谢谢

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

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

    寄存器寻址指被访问项的地址在寄存器中。假设地址已经存在,那么这会更快,因为您不会产生更大的指令、额外的周期,也不会为指令烧掉更多的缓存线。例如,在将立即地址加载到寄存器之前的指令,必须小心处理此参数

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

    但是

    直接寻址速度更快,因为总的来说,获取和执行(对于可以比较的东西)所需的周期更少

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

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

    我强烈推荐迈克尔·艾布拉什的《汇编语言的禅宗》

    不是免费的一本大的黑色图形编程书,这本书是不完整的。你可以买到一本状态良好的二手书(买了第二本,比我在书店买的、一直住在书架上的原版书要好)。关于8088和8086的细节在这本书出版时已经过时了,这不是这本书的重要性,重要的是理解如何解决问题,如何思考问题,并对幕后发生的事情有一个初步的了解。这是非常复杂的今天,仍然是可以理解的,但我建议先从这样的基础,然后跳进你今天看到的。Esp与x86(我强烈建议在开始研究总线和缓存等时,首先学习一些东西,任何东西,而不是x86)。我已经清理并使用开源工具提供了琥珀色处理器(arm2克隆),以便您可以看到处理器内部运行的东西。琥珀色的一个版本具有缓存。再次强调,添加MMU和多核等只是增加了复杂性


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

    oth,寄存器寻址可能会更快,因为它可能通过寄存器重命名完成。另外,如果您明确指出我提供的直接值将存储在主内存中,我将非常感谢,对吗?第一次搜索命中:,。@Alex:我知道缓存命中。即使是缓存命中,由于缓存内存的大小,它也比寄存器内存慢,所以寄存器寻址在任何情况下都应该更好。这是寄存器和不仅是内存,而且是作为解码指令一部分的内存之间的比较(并且存在于代码缓存而不是数据缓存中,因此这个答案不太深入,而且在我看来是无用的,而不是有用的)
    mov ax,[1000h]
    
    
    mov bx,1000h    
    mov ax,[bx]