问题描述
当一个进程处于运行状态时,例如假设我们要添加两个数字,因此指令寄存器将具有添加两个数字的指令(在寄存器组中添加两个寄存器)。
我的问题是谁将数据加载到寄存器组中以供 ALU 添加?
解决方法
硬件是一个指令集解释器。
你可以把用 C 语言编写的解释器想象成一个这样的循环:
unsigned int *PC = START_ADDRESS;
while ( 1 ) {
unsigned ir = *PC++;
switch ( ir >> 24 ) {
...
case 0 :
unsigned regA = (ir & 0x1F0) >> 5;
unsigned regB = (ir & 0x7E) >> 10;
unsigned answer = registerFile[regA] + registerFile[regB];
unsigned regC = (ir & 0x1F00) >> 15;
registerFile[regC] = answer;
break;
...
}
}
硬件类似,只是它可以并行做很多事情。
因此,ir = *PC++
的操作通常被视为“指令获取”的一部分。其复杂性差异很大,从早期 MIPS 的简单指令大小固定为 32 位和流水线只有 5 个阶段,到非常复杂的 x64 上具有可变长度指令、长流水线、指令解码的中间缓存(微操作),以及其他并行性和复杂性。
answer = registerFile[regA] + registerFile[regB]
中的 + 操作是 ALU 操作的一部分,而操作数的获取(如 registerFile[regA]
中)有时被称为“指令解码”的一部分。
将有线路进行寄存器文件索引以获取寄存器中保存的值并将它们提供给 ALU。
因为 ALU 可以来自寄存器或立即数,所以有一些控制信号只允许正确的信号源通过 ALU。