1. ホーム
  2. assembly

[解決済み] なぜ、addiではなくaddiuを使うのか?

2022-02-05 15:31:01

質問

MIPSアセンブリにおいて addiu オーバー addi ? はありません。 addiu 符号なし(計算が破綻する?)

どのように解決するのですか?

<ブロッククオート

で、計算が台無しになる

いいえ、MIPSは 2の補数 したがって、同じ加算・減算命令で符号あり・なし両方の演算を行うことができます。結果に差はない。

これは、ビット単位の命令や、幅寄せしない乗算など、多くの演算でも同じことが言えます。参照

両者の違いは、ただ一つ addi はオーバーフロー時にトラップを発生させるのに対し addiu を使用しない。ですから addi とそのオーバーフロー族( add , sub ...)は、役に立たないことが多い。実際、ほとんど使われないので addi はMIPSr6で削除されました。 貴重なオペコード空間を他の命令に解放するため

この命令名は非常に誤解を招きやすいもので、実際には "unsigned" の追加ではないためです。即値はまだ 符号拡張 ゼロ拡張ではありません。ですから addiu $1, $2, 0xFFFF から実際に1を減算します。 $2 65535を追加するのではなく、65535を追加する。

その名前とは裏腹に、add immediate unsigned ( addiu ) は、オーバーフローを気にしない場合に、符号付き整数に定数を追加するために使用されます。MIPSには減算即値命令がなく、負数には符号拡張が必要なため、MIPSのアーキテクトは即値フィールドを符号拡張することにしたのです。

コンピュータの組織と設計: ハードとソフトのインターフェース デービッド・A・パターソン、ジョン・L・ヘネシー著

もっと読む アドとアドゥの違い