我在 MIPS 程序集中有这个程序,它来自一个 C 代码,它对函数的第 8 个参数进行简单平均。
average8:
addu $4,$4,$5
addu $4,$4,$6
addu $4,$4,$7
lw $2,16($sp)
#nop
addu $4,$4,$2
lw $2,20($sp)
#nop
addu $4,$4,$2
lw $2,24($sp)
#nop
addu $4,$4,$2
lw $2,28($sp)
#nop
addu $2,$4,$2
bgez $2,$L2
addu $2,$2,7
$L2:
sra $2,$2,3
j $31
当数字为正时,我们直接除以8(移位3位),但当数字为负时,我们先addu 7
进行除法。
我的问题是我们为什么要7
添加$2
when $2 is not >= 0
?
编辑:这是 C 代码:
int average8(int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8)
{
return (x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8) / 8;
}
注意:在这种情况下,由于我们使用整数而不是浮点数或双精度数,除法中可能的损失并不重要。