このプログラムは、関数の8番目の引数の単純な平均を実行するCコードからのMIPSアセンブリに含まれています。
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
$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;
}
注:この場合、floatまたはdoubleの代わりにintを使用しているため、除算で損失が発生する可能性はありません。