解析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)。
逐个地址计算:
- 地址
0x12ff1240:- 转二进制后,低5位为
00000(块内偏移0),中间5位为01001(对应十进制9)→ 组号9 - 标签:将地址右移10位(去掉低10位的偏移+组索引),得到
0x12ff1
- 转二进制后,低5位为
- 地址
0x12ff5aa4:- 低5位为
00100(偏移4),中间5位为10101(十进制21)→ 组号21 - 标签:地址右移10位得到
0x12ff5
- 低5位为
- 地址
0x12ff4248:- 低5位为
10000(偏移16),中间5位为00100(十进制4)→ 组号4 - 标签:地址右移10位得到
0x12ff4
- 低5位为
四、有效位的变化
缓存初始状态下所有组的有效位均为0(表示该组无有效数据)。执行每条lw指令时,若对应组未命中,会将目标内存块加载到该组,并将有效位置为1。因此执行完程序后,组4、组9、组21的有效位会被置为1,对应的标签分别是0x12ff4、0x12ff1、0x12ff5。
你之前的问题原因
你用普通除法计算组号得到小数,是因为未做整数取整。正确做法是使用整数除法(丢弃余数)或位右移5位(等价于除以32取整),再对组数取模(因组数是2的幂,直接取对应位更高效)。例如0x12ff1240除以32取整为0x4bff49,对32取模得到9,和位运算结果一致。
内容的提问来源于stack exchange,提问作者cricket900
相关产品推荐
相关产品推荐

