9.1.1 関数呼び出し前後で保証される汎用レジスタ

関数呼び出しの前後で,レジスタの内容が同一であることを保証する汎用レジスタと,保証しない汎用レジスタがあります。汎用レジスタの保証規則を以下に示します。

(1)

関数呼び出し前後で内容が保証されるレジスタ(Callee-Saveレジスタ)

これらの汎用レジスタは,呼び出し先の関数において退避/復帰が必要なものです。そのため,呼び出し元では,関数呼び出しの前後でレジスタの中身が同一であることが保証されます。

r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30注,r31

注 1.

r30(EP)は,プログラム全体で固定して使用する場合があります。固定して使用する場合は,プログラム全体で汎用レジスタの内容を変更しないため,呼び出し先での退避/復帰は不要となります。

(2)

関数呼び出し前後で内容が保証されないレジスタ(Caller-Saveレジスタ)

上記の関数呼び出し前後で内容が保証されるレジスタ以外の汎用レジスタは,呼び出し先の関数において内容が書き換わる可能性があります。そのため,呼び出し元では,関数呼び出しの前後でレジスタの中身が同一であることが保証されません。

備考 1.

r1はアセンブラが使用する場合があるレジスタなので,書き換えはユーザ責任となります。

備考 2.

r2はOS予約となる場合があります。予約レジスタは,コンパイラは汎用レジスタとしては使用しないので,ここに書いた規則には当てはまりません。書き換えはユーザ責任となります。

備考 3.

r3 はスタック・ポインタであり,汎用レジスタの用途としては使わないのでここに書いた規則には当てはまりません。書き換えはユーザ責任となります。

備考 4.

r4(GP)とr5(TP)は,プログラム全体で固定して使用する場合があります。固定して使用する場合は,プログラム全体で汎用レジスタの内容を変更しないため,ここに書いた規則には当てはまりません。書き換えはユーザ責任となります。

備考 5.

r2,r30はオプションによって使用方法を指定することがきます。