加载/存储体系结构
机器代码指令必须对正在执行的信息进行编码,例如它是在执行ADD、SUB还是MUL。它还必须对输入的信息进行编码。输入寄存器和输出寄存器是什么。一些指令需要对要加载数据的地址进行编码。在RISC-V指令中是这样编码的:
我们执行的特定指令称为操作码(上图黄色),它消耗7位。我们指定的每个寄存器输入或输出都需要5位。从这里应该很清楚,挤入一个32位地址是不可能的。即使是一个较短的地址也是困难的,因为你需要位来指定在操作中使用的寄存器。对于CISC处理器,这不是一个问题,因为您可以自由地使用超过32位的指令。
这种紧凑的空间要求使得RISC处理器具有我们所说的加载/存储架构。只有专用的加载和存储指令,如RISC-V上的LW和SW,才能用于访问内存。
对于CISC处理器,如68k,几乎任何操作,如ADD、SUB、AND和OR,都可以使用内存地址作为操作数(参数)。在下面的例子中,4(A2)计算到一个内存地址,我们使用它来读取一个操作数(参数)到ADD指令。最终的结果也存储在那里(在68k上destination是右参数)。; 68k assembly
ADD.L D3, 4(A2) ; D3 + mem[4 + A2] → mem[4 + A2]
典型的RISC处理器(如基于RISC- v指令集的处理器)需要将加载(LW)和存储(SW)作为单独的指令进行存储。# RISC-V assembly
LW x4, 4(x2) # x4 ← mem[x2+4]
ADD x3, x4, x3 # x3 ← x4 + x3
SW x3, 4(x2) # x3 → mem[x2+4]
你不需要通过结合地址寄存器(A0到A7)来计算地址。你可以直接指定一个内存地址,比如400:; 68k assembly
ADD.L 400, D4 ; mem[400] + D4 → D4
但即使是这样一个看似简单的操作也需要多个RISC指令。# RISC-V assembly
LW x2, 400(x0) # x3 ← mem[x0 + 400]
ADD x4, x4, x3 # x4 ← x4 + x3
|