You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析MIPS程序对直接映射数据缓存的影响及缓存参数求解

MIPS直接映射数据缓存分析方案

一、先算出每条加载指令的目标内存地址

lui $t0, 0x12ff 会将0x12ff写入$t0的高16位,低16位补0,因此$t0的完整32位值为 0x12ff0000。每条lw指令的内存地址为基地址加偏移量:

  • 指令2:0x12ff0000 + 0x1240 = 0x12ff1240
  • 指令3:0x12ff0000 + 0x5aa4 = 0x12ff5aa4
  • 指令4:0x12ff0000 + 0x4248 = 0x12ff4248

二、明确直接映射缓存的地址拆分规则

直接映射缓存会把32位内存地址拆分为3部分:

  • 块内偏移:低n位,n为log2(块大小)。你使用的是32字节块,32=2^5,因此低5位(bit0~bit4)为偏移,用于定位块内的具体字节。
  • 组索引(组号):中间k位,k为log2(组数)。组数=缓存总大小/(块大小×每组块数),直接映射缓存每组仅1块,因此组数=缓存总大小/块大小。
  • 标签:剩余的高位,用于标记该缓存块对应的内存地址段。

三、正确计算组号、标签(以1KB直接映射缓存为例)

1KB缓存搭配32字节块时,组数=1024/32=32=2^5,因此组索引占接下来的5位(bit5bit9),标签占剩余22位(bit10bit31)。

逐个地址计算:

  1. 地址0x12ff1240:
    • 转二进制后,低5位为00000(块内偏移0),中间5位为01001(对应十进制9)→ 组号9
    • 标签:将地址右移10位(去掉低10位的偏移+组索引),得到0x12ff1
  2. 地址0x12ff5aa4:
    • 低5位为00100(偏移4),中间5位为10101(十进制21)→ 组号21
    • 标签:地址右移10位得到0x12ff5
  3. 地址0x12ff4248:
    • 低5位为10000(偏移16),中间5位为00100(十进制4)→ 组号4
    • 标签:地址右移10位得到0x12ff4

四、有效位的变化

缓存初始状态下所有组的有效位均为0(表示该组无有效数据)。执行每条lw指令时,若对应组未命中,会将目标内存块加载到该组,并将有效位置为1。因此执行完程序后,组4、组9、组21的有效位会被置为1,对应的标签分别是0x12ff4、0x12ff1、0x12ff5。

你之前的问题原因

你用普通除法计算组号得到小数,是因为未做整数取整。正确做法是使用整数除法(丢弃余数)或位右移5位(等价于除以32取整),再对组数取模(因组数是2的幂,直接取对应位更高效)。例如0x12ff1240除以32取整为0x4bff49,对32取模得到9,和位运算结果一致。

内容的提问来源于stack exchange,提问作者cricket900

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:25:14