RISC访问地址大于最大整数寄存器

问题描述 投票:1回答:2

假设您正在运行32位RISC系统。您将使用什么指令来访问64位内存地址?

在CISC指令集中,您可以简单地使用多字指令传递多余的字。例如:

1a) JMP
1b) loAddress
1c) hiAddress

鉴于RISC指令每个仅一个字,您将如何访问一个多字地址?

假定ALU是32位的并且有一个进位标志。

而且,在CISC系统(例如8080)中,loAddress和hiAddress字都将存储在程序存储器中。即JMP指令知道要查看程序存储器中的下一个项以检索loAddress,然后是该项之后的项以检索hiAddress。 RISC中会发生什么?

assembly cpu-architecture memory-address addressing-mode risc
2个回答
3
投票

即使在CISC上,您所描述的也很不寻常。 不是因为是CISC,而是因为使用了比寄存器宽的地址。通常只能在8位CPU中找到。 (尽管x86分段也符合条件,间接远距离跳转将指向m16:32段/偏移量对的指针。或者在16位模式下,m16:16。作为低位字节序,偏移量是第一个。)在64-外位模式,jmp ptr16:32也是可编码的,并且绝对segment:offset是指令流的一部分。)

通常,当您要设计具有更大地址空间的CPU时,还需要使寄存器变宽,以便可以有效地处理地址。当您只想通过使用8位寄存器/ ALU来节省晶体管时,它只是处于最低端,但是不能将您的地址空间限制为256字节,在这种情况下您可以找到这种设计。


即使地址大小与单词大小匹配,这里也存在一个实际问题。 构造任意的32位(或64位)常量是不同的ISA解决不同方式的问题。 ARM经常使用附近“文字池”的PC相对负载,而其他人则经常使用lui或等效值来设置高16位,将其余16位清零,然后使用16位立即数设置ori。 (ARM具有一些巧妙的技巧,可以通过使用移位/旋转的立即数来对仅设置几位的立即数进行编码。)

通常在RISC上,如果您需要跳转得很远,则可能需要使用多条指令在寄存器中构造地址。然后使用跳转到寄存器指令。

MIPS分支指令很有趣:它具有相对的分支,这些分支在相当大的范围内向程序计数器添加了带符号的位移,还有绝对跳转指令,用新地址替换了PC的低28位。 (由26位立即左移构成,因为MIPS要求将指令对齐,因此不需要存储低2位。)How to Calculate Jump Target Address and Branch Target Address?。但是,如果从这些位置无法从当前位置到达目标,则需要jr,其地址在寄存器中。

x86-64也缺少64位相对跳转指令。如果您需要跳得比+ -2GiB更远(而不是新CS段中的far),则需要间接跳。正常的跳转/分支指令仍然使用rel8rel32位移,从而使机器代码紧凑。唯一可以立即执行64位的指令是mov到寄存器。常规代码模型假定相同的库或可执行文件中的所有代码都位于彼此的2GiB之内,因此链接器将能够填充32位位移。


8位RISC

我知道的唯一一个程序计数器比寄存器宽的RISC ISA是AVR,它是具有8位寄存器的微控制器。 它可以将成对的寄存器视为16位地址,并且其PC是16位。 IJMP (indirect jump) instruction设置PC = Z(其中IJMP是一对8位寄存器)。在具有22位程序计数器而不是16位程序计数器的AVR上,其[0]为零。

[Z(扩展的间接跳转)从I / O空间获取EIND寄存器以获取PC的高位,而低位仍来自PC(21:16)

[AVR指令几乎全都是2个字节长,但是某些版本的EIJMP的跳转目标的绝对地址为0..4M。


具有32位寄存器的主流RISC机器也具有32位程序计数器和虚拟地址空间

。 (可能有超过4GiB的物理内存,但是您不能在一个进程中同时映射所有内存)。

他们中的大多数人在设计中都以文字为导向,因此,他们所需要的只是Z(MIPS)或等同于分支到任何可能地址的任何东西,因为它适合一个寄存器。这是RISC真正代表的简化的complexity

的一部分。

在像MIPS,SPARC或PowerPC这样的普通RISC上,64位地址仅​​在64位ISA扩展中可用

,其中有64位整数寄存器。因此,您将使用MIPS a 4-byte jmp instruction之类的指令,以jmp作为64位基址来执行64位(双字)加载。参见此jr reg。 (MIPS-III添加了64位扩展名,并带有ld $2, 0($3)$3之类的指令。显然,MIPS-I保留了许多未使用的操作码编码空间,因此,新操作码有足够的空间来完成完整的64位ALU操作。)

某些32位CPU添加了扩展,以支持大型物理

地址,而无需增加虚拟地址空间。例如,x86的PAE定义了具有36位物理地址的新页表格式。但是,即使进行分段,单个进程一次也不能处理超过4GiB的虚拟内存。 (x86段的基址+偏移发生在[[before virt-> phys转换中,创建了32位线性地址。因此,它对于线程本地存储仍然有用,例如,根据线程的不同,MIPS-IV ISA manual是不同的线性地址ld细分受众群。)
在32位RISC ISA上的扩展寻址

保罗·克莱顿评论:

PA-RISC具有提供扩展寻址的“空间寄存器”。 32位PowerPC具有段寄存器,这些段寄存器是根据16项表(提供52位虚拟地址空间)中有效地址的最高4位来选择的。对于PA-RISC,“只能通过以最高特权级别执行的代码来修改SR 5至7。”对于PowerPC,任何段寄存器都需要更改特权。

因此,显然,某些RISC ISA在扩展为完全64位之前确实扩展了其寻址。但是我不知道细节,也不打算花时间研究这个问题。欢迎其他答案!


1
投票
鉴于RISC指令每个只有一个字
© www.soinside.com 2019 - 2024. All rights reserved.