为何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代码的最后一行是笔误,逻辑上完全不合理。
拆解循环判断逻辑:
slti $t2, $t1, 100的作用是:当$t1 < 100时,$t2被设为1;否则设为0。- 正确的循环控制应该是:只要
$t2不为0(即i<100),就继续循环,所以应该用bne $t2, $0, LOOP(和零寄存器比较)。
而原代码里的bne $t2, $s0, LOOP是错误的:$s0是数组的基地址(初始值不是0),这会导致循环逻辑完全混乱——要么因为$t2和$s0永远不相等而无限循环,要么在某个随机时机提前终止,完全不符合C代码对应的逻辑。
这大概率是习题排版或编写时的输入错误,正确的写法必然是与零寄存器$0比较,才能匹配你写出的C代码逻辑。
内容的提问来源于stack exchange,提问作者Juice
相关产品推荐
相关产品推荐

