按道理说,取指的过程如下:
[MAR] <- [PC] 同时 [PC] <- [PC] + 1字长
[MBR] <- [[MAR]] 同时 [PC] <- [PC] + 1字长
[IR] <- [MBR] 同时 [PC] <- [PC] + 1字长
此时 IR 获取到指令时,应该是 [PC] <- [PC] + 3字长 啊?
按道理说,取指的过程如下:
[MAR] <- [PC] 同时 [PC] <- [PC] + 1字长
[MBR] <- [[MAR]] 同时 [PC] <- [PC] + 1字长
[IR] <- [MBR] 同时 [PC] <- [PC] + 1字长
此时 IR 获取到指令时,应该是 [PC] <- [PC] + 3字长 啊?
根据问题描述,关于为什么在取指令过程中,PC 值增加的字长数是两个而不是三个,可以从程序计数器(PC)的角度进行解释。
在传统的指令周期中,PC的更新是在取指令阶段的末尾进行的,也就是在指令执行的最后一个字节之后。因此,在指令执行的每个循环中,PC会增加一个字长,即一个指令的长度。
根据问题描述的取指过程,可以简单理解为从内存中读取指令,每次读取一个字长,然后将PC增加一个字长。在这种情况下,PC的更新是在指令执行的过程中进行的,而不是在指令执行之后。
因此,在该设计下,PC会在指令执行的最后一个字节之前就被增加一个字长,以便读取下一条指令。因此,PC值比当前指令地址多两个字长。
具体代码示例如下所示:
int PC = getCurrentPC();
int instructionLength = getInstructionLength(PC);
// 读取指令的逻辑
int MAR = PC;
int MBR = readMemory(MAR);
int IR = MBR;
// 更新PC
PC += instructionLength;
updatePC(PC);
根据以上分析,PC值比当前指令地址多两个字长,而不是三个字长是因为PC的更新在指令执行过程中进行的,而不是在指令执行之后。这种设计可以更高效地实现指令的连续执行,减少了取指令和执行指令之间的等待时间。