MIPSアセンブリでのaddとadduの違いと命令順序の意味を解説

PHP

MIPSアーキテクチャのアセンブリ言語を学習していると、addやaddu命令、そして同じレジスタを使った異なる順序の命令について疑問が出てきます。今回は「add $t0 $s6 $t0」と「add $t0 $t0 $s6」の違いや、addとadduの違いについてわかりやすく解説します。

add命令の基本

MIPSのadd命令は、指定された2つのレジスタの値を足して、結果を別のレジスタに格納します。

add , , 

ここでdestは結果を格納するレジスタ、src1とsrc2は足す値を持つレジスタです。

命令の順序による違い

質問にある二つの命令は次の通りです。

add $t0, $s6, $t0
add $t0, $t0, $s6

どちらも最終的に$t0に$s6 + 元の$t0の値が入るため、結果は同じです。しかし、読みやすさやプログラムの意図を明示する観点からは、通常「add $t0, $t0, $s6」のように既存の$t0に$s6を加える意図が分かる順序で書くことが一般的です。

addとadduの違い

addとadduは似ていますが、重要な違いがあります。

  • add: 符号付き整数の加算。オーバーフローが発生すると例外が起きる。
  • addu: 符号なし整数の加算。オーバーフローが無視される。

通常の計算ではどちらを使っても結果は同じですが、大きな値を扱う場合やオーバーフロー例外を避けたい場合はadduを選ぶことがあります。

まとめ

・「add $t0, $s6, $t0」と「add $t0, $t0, $s6」は計算結果として同じです。
・順序の選び方はコードの可読性や意図を伝えるために重要です。
・addは符号付き加算でオーバーフロー時に例外、adduは符号なし加算でオーバーフローを無視します。
・用途に応じてaddとadduを使い分けることで、意図した動作を保証できます。

コメント

タイトルとURLをコピーしました