読者です 読者をやめる 読者になる 読者になる

MIPSのジャンプ命令について(jr命令)

MIPSアセンブラを見なくてはならなかったので見ていたら疑問に思うことがあったのでそれをメモ
問題のソースは以下

int return_one(){
  return 1;
}

これをコンパイルして逆アセンブルすると

jr   ra
li   v0, 1

といった結果になった。(機械語などは省略)
コンパイルしたソースは見てわかるように呼び出されたら1を返すだけの関数である。
アセンブルの結果の方はjrがリターンアドレスに戻る命令、liが第一オペランドレジスタ)に第二オペランド(定数)を設定する命令である。
またこの場合v0レジスタというのは戻り値のことである。 これらを把握してからもう一度逆アセンブル結果を見てわかるように先にジャンプ命令が実行されている。
これでは関数の戻り値が設定できないのではと思ったがこれはMIPSの遅延分岐というものの影響であるらしい。
端的にいうと、ジャンプ命令はジャンプ命令の次の命令を実行してから実行するというものらしい。
パイプラインが影響しているらしいがそのへんは熱血アセンブラ入門に詳しく載っている。
こういうこともあるのだなあとまた一つ学びました。

参考:熱血!アセンブラ入門(著:坂井弘亮)

熱血! アセンブラ入門

熱血! アセンブラ入門