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

Assembly RISC访问地址大于最大整数寄存器,assembly,cpu-architecture,memory-address,addressing-mode,risc,Assembly,Cpu Architecture,Memory Address,Addressing Mode,Risc,假设您运行的是32位RISC系统。您将使用什么指令访问64位内存地址 在CISC指令集中,您可以使用多字指令简单地传递额外的字。例如: 1a) JMP 1b) loAddress 1c) hiAddress 鉴于RISC指令每个只有一个字,您如何访问多字地址 假设ALU是32位的,并且有一个进位标志 此外,在CISC系统(例如)中,LoadAddress和hiAddress字都将存储在程序内存中。也就是说,JMP指令知道查看程序内存中的下一项以检索loadAddress,然后查看该项以检索hi

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

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

1a) JMP
1b) loAddress
1c) hiAddress
鉴于RISC指令每个只有一个字,您如何访问多字地址

假设ALU是32位的,并且有一个进位标志


此外,在CISC系统(例如)中,LoadAddress和hiAddress字都将存储在程序内存中。也就是说,
JMP
指令知道查看程序内存中的下一项以检索
loadAddress
,然后查看该项以检索
hiAddress
。RISC中发生了什么?

即使在CISC上,您所描述的情况也很不寻常这不是因为是CISC,而是因为使用了比寄存器更宽的地址。这通常只能在8位CPU中找到。(虽然x86分段也符合条件,间接远跳将指针指向
m16:32
段/偏移对。或者在16位模式下,
m16:16
。作为小端,偏移量是第一位的。)在64位模式之外,
jmp ptr16:32
也可以编码,使用绝对段:偏移量作为指令流的一部分。)

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


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

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

MIPS分支指令很有趣:它有相对分支,向程序计数器添加一个范围相当大的有符号位移,还有绝对跳转指令,用一个新地址替换PC的低28位。(由26位立即左移构成,因为MIPS要求指令对齐,所以低2位不需要存储。)。但是,如果无法从当前位置使用这些设备访问目标,则需要在寄存器中带有地址的
jr

x86-64还缺少64位相对跳转指令。如果您需要跳转到+-2GiB以外的地方(而不是像在新的CS段中那样远),则需要间接跳转。正常的跳转/分支指令仍然使用
rel8
rel32
位移,保持机器代码紧凑。唯一可以采用64位立即数的指令是
mov
-进行注册。普通代码模型假设同一库或可执行文件中的所有代码彼此之间的距离在2GiB以内,因此链接器将能够填充32位位移


8位RISC 我所知道的唯一一个程序计数器比寄存器宽的RISC ISA是AVR,一个带有8位寄存器的微控制器它可以将寄存器对视为16位地址,其PC为16位。它设置PC=Z(其中
Z
是一对8位寄存器)。在具有22位程序计数器(而不是16位)的AVR上,它将PC(21:16)归零

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

AVR指令几乎都有2字节长,但有些版本的跳转目标的绝对地址为0..4M


带有32位寄存器的主流RISC机器也有32位程序计数器和虚拟地址空间。(拥有超过4GB的物理内存是可能的,但您不能在一个进程中同时映射所有内存)

它们中的大多数在设计上都非常面向字,所以它们所需要的只是
jr reg
(MIPS)或任何等效于分支到任何可能地址的东西,因为它适合于一个寄存器。这是RISC字面上所代表的降低复杂性的一部分


在常规RISC(如MIPS、SPARC或PowerPC)上,64位地址仅在64位ISA扩展中可用,其中有64位整数寄存器。因此,您可以使用MIPS
ld$2,0($3)
等指令,使用
$3
作为64位基址进行64位(双字)加载。看这个。(MIPS-III增加了64位扩展,指令包括
ld
daddu
。显然,MIPS-I留下了大量未使用的操作码编码空间,因此有足够的空间让新操作码执行完整的64位ALU操作。)

一些32位CPU添加了扩展以支持大型物理地址,而不增加虚拟地址空间。例如,x86的PAE定义了一种具有36位物理地址的新页表格式。但即使使用分段,单个进程一次也不能处理超过4GB的虚拟内存。(x86段基址+偏移量发生在virt->phys转换之前,创建了一个32位线性地址。因此它对于线程本地存储仍然很有用,例如,
[fs:0]
是一个不同的线性地址,这取决于该线程的
fs
段基址。)


32位RISC-ISAs的扩展寻址 保罗·克莱顿评论:

帕里