【发布时间】:2014-02-27 22:56:57
【问题描述】:
假设c级整数j保存在寄存器$t1中,$s2保存名为total的c级整数,$s0保存整数数组vArray的基地址。
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
我的解决方案:
我想我已经弄清楚了C代码,应该是:
for (j = 0; j < 100; j++) {
total = total + vArray[j];
}
然后问题问:重写循环以减少执行的MIPS指令的数量。
但是,我无法减少执行的 MIP 指令的数量。对我来说,我认为 MIPs 指令已经很基础了,我无法想出少于七个执行步骤的其他解决方案。
在阅读了递减的建议后,我想出了这个,可能有点笨拙的逻辑。
addi $t1, $zero, 404
LOOP:
subi $t1, $t1, 4
add $s0, $s0, $t1
lw $t2, 0($s0)
add $s2, $s2, $t2
bne $t1, $zero, LOOP
【问题讨论】:
-
您的 C 代码在两个地方有误:您在
for循环中使用,而不是;并使用i而不是j作为索引。你能向我们展示一个适当的 C 等价物和编译器汇编输出吗?这可能是一个简单的优化级别问题。 -
我很抱歉错别字。我把它固定在上面。我刚开始在这门课上学习 MIP,所以我还不确定在哪里可以看到汇编语言代码。
-
由于它只是对数组求和,因此您可以向下计数而不是向上计数。这样你就不需要
slti指令了。