请问,为什么 PC 值比 当前指令地址多 两个字长,而不是 三字长?

按道理说,取指的过程如下:

[MAR] <- [PC] 同时 [PC] <- [PC] + 1字长

[MBR] <- [[MAR]] 同时 [PC] <- [PC] + 1字长

[IR] <- [MBR] 同时 [PC] <- [PC] + 1字长

此时 IR 获取到指令时,应该是 [PC] <- [PC] + 3字长 啊?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    根据问题描述,关于为什么在取指令过程中,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的更新在指令执行过程中进行的,而不是在指令执行之后。这种设计可以更高效地实现指令的连续执行,减少了取指令和执行指令之间的等待时间。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^