64位存储空间中的32位固定指令长度

时间:2017-11-06 16:40:48

标签: cpu-architecture instruction-set risc

我目前正在阅读ARM的AArch64架构。它们使用类似RISC的指令集,其固定指令长度为32位,同时在64位地址上运行。我仍然是ISA主题的新手,所以我的问题是:当你的指令中只有32位长度时,如何使用64位长地址?

2 个答案:

答案 0 :(得分:1)

32位是指令的长度,以字节为单位,而不是操作数大小或地址大小。

ARM 32位(与使用32位固定宽度指令字的所有其他32位RIS)一样,不能将32位地址作为一个直接插入单个指令:没有空间一个操作码说出它是什么指令。

指令的宽度限制了您可以拥有的寄存器的数字。每个指令有3个寄存器(dst,src1,src2),AArch64从16个寄存器增加到32个寄存器意味着每个指令需要3 * log2(32) = 3* 5 = 15位来编码寄存器。或者只有2个或1个寄存器的指令更少。 (例如mov-immediate或add-immediate)。剩余的空间用于可能的操作码数量和即时数量。

要将地址输入寄存器,ARM编译器通常会从附近的常量池中加载它(使用PC相对寻址模式)。

另一个选项是大多数RISC CPU的作用:使用2指令序列将16位立即数置于寄存器的上半部分,然后将16位立即数置入低半部分。 (或者使用静态地址的下半部分作为使用寄存器+ 16位偏移等寻址模式的加载/存储指令的位移。)

MIPS是一个非常简单的RISC的一个很好的例子,见it's ISA with binary encoding。其lui reg, imm16imm16 <<16放入注册表中。 (立即加载上限)。然后lw dst, imm16(base_reg)就像我在上一段中所说的一样。

即使在64位代码中,大多数数字仍然很小,因此不需要更宽的立即操作数(地址除外)。例如x86仍然为add r64, imm使用32位或8位立即数操作数。 x86是一个可变长度的ISA,在很多情况下,当临时值介于-128+127之间时,可以节省空间。

答案 1 :(得分:0)

你可以拥有一个4位CPU,可以在4096位值上运行,但这样做的速度不会非常快。任何带有"bignum" type的编程语言都会以这种方式工作,但通常不会达到同样的极端。

32位CPU可以在64位值上运行的方式是因为硬件或软件允许它,没有其他原因。

在我们拥有64位CPU之前,我们无法操纵64位整数值。即使是旧的Intel 80386也可以支持64位操作,它于1985年发布。