学习目标

  • 实现 load/store 指令
  • 理解内存对齐
  • 处理字节序

8.1 思考:为什么需要访存指令?

寄存器只有 32 个,数据多了怎么办?

答案:放内存!

lw  x1, 0(x2)   # x1 = mem[x2 + 0]
sw  x1, 4(x2)   # mem[x2 + 4] = x1

8.2 Load 指令

case 0x03:  // LOAD
    uint32_t addr = src1 + d.imm;
    switch (d.funct3) {
        case 0x2:  // LW
            result = mem_read(addr, 4);
            break;
        case 0x0:  // LB
            result = sign_extend(mem_read(addr, 1), 8);
            break;
    }
    break;

问题:LB 为什么要符号扩展?

8.3 Store 指令

case 0x23:  // STORE
    uint32_t addr = src1 + d.imm;
    uint32_t data = reg_read(d.rs2);
    mem_write(addr, data, 4);
    break;

下一步

第 9 章:分支跳转指令

更新时间: