学习目标

  • 理解取指-译码-执行循环
  • 实现指令执行引擎
  • 掌握 PC 更新

6.1 思考:CPU 是如何工作的?

想象 CPU 是一个永不停歇的工人:

while (true) {
    1. 取指令 (Fetch)
    2. 译码 (Decode)
    3. 执行 (Execute)
    4. 更新 PC
}

这就是著名的 取指-译码-执行循环

6.2 取指令

uint32_t inst_fetch() {
    uint32_t inst = mem_read(cpu.pc, 4);
    return inst;
}

问题:为什么是 4 字节?

因为 RISC-V 的指令长度是 32 位(4 字节)!

6.3 执行引擎

void cpu_exec_once() {
    // 1. 取指
    uint32_t inst = inst_fetch();

    // 2. 译码
    Decode d = decode(inst);

    // 3. 执行
    switch (d.opcode) {
        case 0x13: exec_I_type(d); break;  // addi, ...
        case 0x33: exec_R_type(d); break;  // add, sub, ...
        // ...
    }

    // 4. 更新 PC
    cpu.pc += 4;
}

问题:PC 总是 +4 吗?

不是!跳转指令会改变 PC。

下一步

第 7 章:算术逻辑指令

更新时间: