gpt4 book ai didi

cpu-architecture - 索引寻址模式和隐式寻址模式

转载 作者:行者123 更新时间:2023-12-02 17:39:18 27 4
gpt4 key购买 nike

索引寻址模式通常用于访问数组,因为数组是连续存储的。我们有一个索引寄存器,该寄存器在每次迭代中都会递增,当添加到基地址时,它会给出数组元素的地址。
我不了解此寻址模式的实际需求。为什么我们不能直接寻址呢?我们有基本地址,每次访问时都可以在其中添加1。为什么需要索引寻址的索引寻址模式呢?

我不确定隐式寻址模式的指令格式。假设我们有一条指令INC AC。指令中指定了交流电的地址,还是有一个特殊的操作码,表示“ INC AC”,我们不包括交流电(累加器)的地址?

最佳答案

我不了解此寻址模式的实际需求。为什么我们不能直接寻址呢?


您可以; MIPS只有一种寻址模式,编译器仍然可以为其生成代码。但是有时它必须使用额外的shift + add指令来计算地址(如果它不只是遍历数组)。

寻址模式的重点是保存指令和保存寄存器,尤其是在诸如x86之类的2操作数指令集中,其中的add eax, ecx用结果(eax)覆盖eax += ecx,这与MIPS或其他3指令ISA不同,其中< cc>执行addu $t2, $t1, $t0。在x86上,这需要一个副本(t2 = t1 + t0)和一个mov。 (或者在特殊情况下,add:x86可以使用与内存操作数相同的指令编码进行复制和添加(和移位)。)

考虑一个直方图问题:您以不可预测的顺序生成数组索引,并且必须对数组进行索引。在x86-64上,lea edx, [eax+ecx]将使用单个4字节指令来递增内存中的32位计数器,该指令解码为前端仅2 oups即可发布到现代Intel CPU的乱序内核中。 (http://agner.org/optimize/)。 (add dword [rbx + rdi*4], 1是基址寄存器,rbx是缩放的索引)。具有缩放索引非常强大。 x86 16位寻址模式支持2个寄存器,但不支持缩放索引。

经典MIPS仅具有单独的移位和加法指令,尽管MIPS32确实为地址计算添加了定标加法指令。这样可以在此处保存说明。作为装载存储机器,装载和存储始终必须是单独的指令(与x86上的方法不同,x86的添加和解码是微融合的装载+添加和存储。请参见INC instruction vs ADD 1: Does it matter?)。

对于MIPS,也许ARM是更好的比较:它也是一台负载存储RISC计算机。但是它确实可以选择寻址模式,包括使用桶形移位器的缩放索引。因此,您无需为每个数组索引单独进行移位/添加,而可以使用具有相同寻址模式的rdiLDR R0, [R1, R2, LSL #2] / add r0, r0, #1

通常在遍历数组时,最好仅递增x86上的指针。但这也是使用索引的一种选择,尤其是对于具有多个使用相同索引的数组的循环,例如str。但是,索引寻址模式有时可以为slightly less efficient in hardware,因此,当编译器展开循环时,它通常应使用指针,即使它必须分别递增所有3个指针而不是一个索引。



指令集设计的重点不仅在于图灵完善,还在于使高效代码能够以更少的时钟周期和/或更小的代码大小完成更多的工作,或者为程序员提供针对这些目标的选择。

可编程计算机的最低阈值非常低,例如,请参见各种One instruction set computer体系结构。 (没有真正实现的,只是在纸上设计的,目的是表明可以编写程序,仅用减法和分支运算法则(如果小于零),并在指令中编码内存操作数。

在易于解码(尤其是并行解码)与紧凑之间需要权衡。 x86令人恐惧,因为它是作为一系列扩展而演变的,通常没有太多计划为将来的扩展留出空间。如果您对ISA设计决策感兴趣,请访问Agner Fog的博客,以有趣的讨论方式为结合高性能x86的高性能CPU设计ISA(很多工作与一条指令结合在一起,例如,内存操作数作为一个指令的一部分)。具有RISC最佳功能(易于解码,寄存器很多)的ALU指令:Proposal for an ideal extensible instruction set

在如何使用指令字中的位上也要权衡,尤其是在像大多数RISC一样的固定指令宽度ISA中。不同的ISA做出了不同的选择。


PowerPC使用许多编码空间来存储功能强大的位域指令,例如C[i] = A[i] + B[i](向左旋转并掩盖位窗口)和大量操作码。 IDK,如果通常不可发音且难以记忆的助记符与此有关...
ARM使用高4位基于条件码来执行任何指令。它为the barrel shifter使用更多位(第二个源操作数可以有选择地移位或旋转另一个寄存器的立即数或计数)。
MIPS具有相对较大的立即操作数,并且基本上很简单。


x86 32/64位寻址模式使用可变长度编码,当有索引时带有一个额外的字节SIB(比例/索引/基数)字节,以及可选的disp8或disp32立即位移。 (例如,rlwinm需要2 +1 + 4字节进行编码,而add esi, [rax + rdx + 12340]需要2字节。

x86 16位寻址模式受到更多限制,并将除可选的disp8 / disp16位移以外的所有内容打包到ModR / M字节中。




假设我们有一条指令INC AC。指令中指定了交流电的地址,还是有一个特殊的操作码,表示“ INC AC”,我们不包括交流电(累加器)的地址?


是的,某些ISA中某些指令的机器代码格式包括隐式操作数。许多机器都有add esi, [rax] / push指令,这些指令隐式地将特定寄存器用作堆栈指针。例如,在x86-64的pop中,RAX是显式寄存器操作数(encoded in the low 3 bits of the one-byte opcode using the push rax short form),而RSP是隐式操作数。

较早的8位CPU通常具有诸如DECA(减法累加器A)之类的指令。即该寄存器有一个特定的操作码。这可能与使用DEC指令以及在操作码字节中的某些位指定哪个寄存器(例如x86在x86-64将short INC/DEC encodings用作REX前缀之前使用x86所做的操作)相同:请注意64中的“ NE”(不可编码)位模式列(push r64)。但是,如果没有常规模式,则可以肯定将其视为隐式操作数。

有时将事情归为整洁的类别会失败,因此不必担心使用带操作码字节的位是x86的隐式还是显式。这是一种花费更多操作码空间以节省常用指令的代码大小,同时仍允许与其他寄存器一起使用的方法。

一些ISA按照约定只使用某个寄存器作为堆栈指针,而没有隐式使用。 MIPS就是这样。

ARM32(在ARM中,不是Thumb模式)在push / pop中也使用显式操作数。它的push / pop助记符只是实现多个存储递减-之前/存储多个递减-的别名(LDMIA / STMDB)。有关LDM / STM的说明,请参见ARM's docs,其中说明了这一点,以及您可以使用这些说明的一般情况做什么,例如LDMDB递减指针,然后加载(与POP相反)。

关于cpu-architecture - 索引寻址模式和隐式寻址模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47868145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com