第 8 章:访存指令
学习目标
- 实现 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;