私はコンピューターの算数を学んでいます。私が使っている本(パターソンとヘネシー)には、以下の質問があります。
mipsコードを記述して、64ビットデータの倍精度整数減算を実行します。最初のオペランドがレジスタ$t4(hi)と$ t5(lo)にあり、2番目が$ t6(hi)と$ t7(lo)にあると仮定します。
答えに対する私の解決策は
sub $t3, $t5, $t7 # Subtract lo parts of operands. t3 = t5 - t7
sltu $t2, $t5, $t7 # If the lo part of the 1st operand is less than the 2nd,
# it means a borrow must be made from the hi part
add $t6, $t6, $t2 # Simulate the borrow of the msb-of-low from lsb-of-high
sub $t2, $t4, $t6 # Subtract the hi's. t2 = t4 - t6
ただし、この問題の解決策を示した作成者は次のとおりです。
符号付き倍精度整数の場合、
subu $t3, $t5, $t7
sltu $t2, $t5, $t7
add $t6, $t6, $t2
sub $t2, $t4, $t6
符号なし倍精度整数の場合、
subu $t3, $t5, $t7
sltu $t2, $t5, $t7
addu $t6, $t6, $t2
subu $t2, $t4, $t6
sub/add
との動作の違いについての私の理解はsubu/addu
、オーバーフロー例外はで生成され、では生成されsub/add
ないということですsubu/addu
。オペランドのビットの減算/加算sub/add
とsubu/addu
、符号付きまたは符号なしのオペランドの解釈は、inslt
およびsltu
命令とは異なり、結果に違いはありません。
質問1
私は、オーバーフロー検出が処理されているという解決策を与えられた著者から推測していますが、私の解決策では同じことを考えていませんでした。私は正しいですか?他に足りないものはありますか?
質問2上記の推論が正しいと仮定すると、と
を使用して符号なし倍精度を減算する場合に、作成者が提供したソリューションのオーバーフロー検出がオフになっているのはなぜですか?addu
subu