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

为何MIPS代码最后一行将$t2与$s0比较而非零寄存器?

关于《Computer Organisation and Design》第5版习题2.29的MIPS代码疑问解答

原题中的MIPS代码

addi $t1, $0, $0
LOOP :
lw  $s1, 0($s0)
add $s2, $s2, $s1
addi $s0, $s0, 4
addi $t1, $t1, 1
slti $t2, $t1, 100
bne $t2, $s0, LOOP

变量映射:

  • $t1 = 循环变量i
  • $s2 = 累加结果result
  • $s0 = 数组MemArray的基地址

对应的正确C代码

for(int i = 0; i < 100; i++)
{
    result += MemArray[i];
}

疑问解答

你观察得完全正确——这段MIPS代码的最后一行是笔误,逻辑上完全不合理。

拆解循环判断逻辑:

  1. slti $t2, $t1, 100 的作用是:当$t1 < 100时,$t2被设为1;否则设为0。
  2. 正确的循环控制应该是:只要$t2不为0(即i<100),就继续循环,所以应该用 bne $t2, $0, LOOP(和零寄存器比较)。

而原代码里的bne $t2, $s0, LOOP是错误的:$s0是数组的基地址(初始值不是0),这会导致循环逻辑完全混乱——要么因为$t2和$s0永远不相等而无限循环,要么在某个随机时机提前终止,完全不符合C代码对应的逻辑。

这大概率是习题排版或编写时的输入错误,正确的写法必然是与零寄存器$0比较,才能匹配你写出的C代码逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:20:16