コンパイラのレジスタ使用規則
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/04/03 09:53 UTC 版)
「MIPSアーキテクチャ」の記事における「コンパイラのレジスタ使用規則」の解説
ハードウェアのアーキテクチャにより、以下のことが定められている。 汎用レジスタ $0 は常に 0 という値を返す。このレジスタに値を書いても変化はしないし、書いた値は消失する。 汎用レジスタ $31 は jal (jump and link) 命令でリンクレジスタとして使われる。 HIおよびLOレジスタは乗除算の結果へのアクセスに使われ、mfhi (move from high) 命令と mflo 命令がそのためにある。 汎用レジスタを使う際のハードウェア上の制限はこれだけである。 各種MIPSツールチェーンでは、レジスタをどのように使うかについて呼出規約を定めている。これはツールチェーンのソフトウェアが定めているもので、ハードウェアにそのような制限があるわけではない。 レジスタ名称番号用途呼び出された側が内容を保存する必要があるか?$zero$0 常に 0 N/A $at$1 アセンブラが一時的に使用 No $v0–$v1$2–$3 関数の戻り値や式を評価した結果 No $a0–$a3$4–$7 関数の引数 No $t0–$t7$8–$15 一時変数 No $s0–$s7$16–$23 一時変数だがセーブされる Yes $t8–$t9$24–$25 一時変数 No $k0–$k1$26–$27 OSのカーネル用に予約 No $gp$28 広域(グローバル)ポインタ Yes $sp$29 スタックポインタ Yes $fp($s8)$30 フレームポインタ Yes $ra$31 リターンアドレス N/A 呼び出された側が保存すると定められているレジスタは、サブルーチンや関数の呼び出しやシステムコールでも保持される。例えば、$s-レジスタをルーチン内で使うときは、その内容をスタックに一時的に退避させなければならない。$sp と $fp はルーチンに入ってきたときにセーブされ、それぞれルーチン固有の固定値でインクリメントされる。そして、そのルーチンから戻るときに元の値に戻す。一方 $ra は jal 命令でルーチンに飛び込むときに自動的に変更される。$t-レジスタはサブルーチンを呼び出すと内容が破壊されるので、必要なら呼び出す側がセーブしておかなければならない。
※この「コンパイラのレジスタ使用規則」の解説は、「MIPSアーキテクチャ」の解説の一部です。
「コンパイラのレジスタ使用規則」を含む「MIPSアーキテクチャ」の記事については、「MIPSアーキテクチャ」の概要を参照ください。
- コンパイラのレジスタ使用規則のページへのリンク