MIPS分支语句失效求助:7×5二进制数组图形绘制逻辑异常
问题排查:分支语句被忽略的原因及修复方案
我来帮你定位这个问题!你遇到的分支_draw_arena被忽略的核心原因是你错误地将内存地址和数值1做了比较,而不是读取地址中存储的数组元素值。
错误点分析
看你的这段代码:
beq t2, 1, _draw_arena
这里的t2是通过add t2, a0, t1计算出来的,它指向arena数组中第[s0][s1]个元素的内存地址,而不是该位置存储的0或1。由于arena的起始地址a0肯定远大于1,这条beq指令永远不会成立,所以分支会被直接跳过,自然不会执行_draw_arena的逻辑。
修复方案
你需要先从t2指向的内存地址中加载实际存储的数值,再和1做比较。修改后的代码如下:
bge s1, 5, _increment_outer_loop la a0, arena mul t0, s0, 28 #i mul t1, s1, 4 #j add t1, t1, t0 add t2, a0, t1 lw t3, 0(t2) # 从t2指向的内存地址加载4字节数据到t3寄存器 beq t3, 1, _draw_arena # 现在比较的是数组元素的实际值 j _increment_inner_loop
补充说明
从你用mul t1, s1, 4计算偏移量可以看出来,你的arena数组每个元素占4字节(应该是32位整数类型),所以用lw(加载字)指令是正确的。如果你的数组是单字节存储的,那应该改用lb(加载字节)指令,但这里的偏移计算逻辑对应4字节元素,所以lw是合适的。
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

