コンパイラによるレジスタ使用法
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/07/05 10:21 UTC 版)
「R3000」の記事における「コンパイラによるレジスタ使用法」の解説
ハードウェアアーキテクチャ上、汎用レジスタの使用に次のような制約がある。 汎用レジスタ $0 は常に内容が 0 であり、何を書き込んでも 0 のままである。 汎用レジスタ $31 はサブルーチンコール時の jump and link 命令でリンクレジスタ(戻りアドレスを格納するレジスタ)として使われる。 HI レジスタと LO レジスタは整数の乗除算の結果を格納する。 これら以外に制約はない。 MIPSの用意したコンパイラなどのツール群は呼出規約の一環としてレジスタの使用法を規定している。これらの規定はハードウェアの制約ではないが、ツール群がこれに従っている関係で、MIPSアーキテクチャを採用したシステムではほぼ間違いなくこの規定に従ってレジスタを使用している。 レジスタ名称番号用途Callee must preserve?$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$30 フレームポインタ yes $ra$31 リターンアドレス N/A なお、"Callee must preserve?" とは、あるルーチンの中でそのルーチンに入ってきたときの値を保持した状態で呼び出した側に戻る必要があることを意味する。例えば、$s-レジスタをルーチン内で使うときは、その内容をスタックに一時的に退避させなければならない。$sp と $fp はルーチンに入ってきたときにセーブされ、それぞれルーチン固有の固定値でインクリメントされる。そして、そのルーチンから戻るときに元の値に戻す。一方 $ra は jal 命令でルーチンに飛び込むときに自動的に変更される。$t-レジスタはサブルーチンを呼び出すと内容が破壊されるので、必要なら呼び出す側がセーブしておかなければならない。$at はアセンブラの仮想命令(マクロ命令)で一時変数として使われる。$t-レジスタだけを使って、サブルーチンを呼び出すことがないルーチンは、スタックにレジスタをセーブする必要がないため、$sp や $fp もセーブする必要がない。
※この「コンパイラによるレジスタ使用法」の解説は、「R3000」の解説の一部です。
「コンパイラによるレジスタ使用法」を含む「R3000」の記事については、「R3000」の概要を参照ください。
- コンパイラによるレジスタ使用法のページへのリンク