prepare


スタック・フレームの生成(関数の前処理)を行います。(Function Prepare)

[指定形式]

-

prepare list, imm1

-

prepare list, imm1, imm2

-

prepare list, imm1, sp

 

imm1/imm2に指定できるものを次に示します。

-

32ビット幅までの値を持つ絶対値式

 

listは,prepare命令でプッシュ可能な12本のレジスタを指定するものです。listに指定できるものを次に示します。

-

レジスタ
プッシュの対象となるレジスタ(r20〜r31)をカンマで区切って指定します。

-

12ビット幅までの値を持つ絶対値式
12ビットと12本のレジスタとの対応は次のとおりです。

 

次の2つの指定は等価です。

prepare r26, r29, r31, 0x10
prepare 0x103, 0x10

[機能]

prepare命令は,関数の前処理をする命令です。

 

-

“prepare list, imm1”の形式

(a)

第1オペランドで指定したレジスタを1つプッシュし,スタック・ポインタ(sp)から4を減算します。

(b)

第1オペランドで指定したレジスタをすべてプッシュし終わるまで(a)を繰り返します。

(c)

第2オペランドで指定した絶対値式の値をspから減算し,spをレジスタ退避領域に設定します。

 

-

“prepare list, imm1, imm2”の形式

(a)

第1オペランドで指定したレジスタを1つプッシュし,spから4を減算します。

(b)

第1オペランドで指定したレジスタをすべてプッシュし終わるまで(a)を繰り返します。

(c)

第2オペランドで指定した絶対値式の値をspから減算し,spをレジスタ退避領域に設定します。

(d)

第3オペランドで指定した絶対値式の値をepに設定します。

 

-

“prepare list, imm1, sp”の形式

(a)

第1オペランドで指定したレジスタを1つプッシュし,spから4を減算します。

(b)

第1オペランドで指定したレジスタをすべてプッシュし終わるまで(a)を繰り返します。

(c)

第2オペランドで指定した絶対値式の値をspから減算し,spをレジスタ退避領域に設定します。

(d)

第3オペランドで指定したspの値をepに設定します。

機械語命令で実際にspに減算される値は,imm1を左へ2ビット・シフトした値となります。このためアセンブラは,指定したimm1をあらかじめ右へ2ビット・シフトしてコードに反映します。

[詳細説明]

-

imm1に次のものを指定した場合,アセンブラでは,機械語命令のprepare命令が1つ生成されます。

(a)

0〜127の範囲の絶対値式

prepare list, imm1
prepare list, imm1
prepare list, imm1, imm2
prepare list, imm1, imm2
prepare list, imm1, sp
prepare list, imm1, sp

 

-

imm1に次のものを指定した場合,アセンブラでは,命令展開が行われ,複数個の機械語命令が生成されます。ただし,“prepare list, imm1, sp” の形式の命令に対して,imm1 に0 〜 127 の範囲を越える絶対値式を指定することはできません。

(a)

0〜127の範囲を越え,0〜32767の範囲の絶対値式

prepare list, imm1
prepare list, 0
movea   -imm1, sp, sp
prepare list, imm1, imm2
prepare list, 0, imm2
movea   -imm1, sp, sp

(b)

0〜32767の範囲を越える絶対値式

prepare list, imm1
prepare list, 0
mov     imm1, r1
sub     r1, sp
prepare list, imm1, imm2
prepare list, 0, imm2
mov     imm1, r1
sub     r1, sp

[フラグ]

CY

OV

S

Z

SAT

[注意事項]

-

“prepare list, imm1, sp” の形式の命令に対して,imm1に0〜127の範囲を越える絶対値式を指定した場合,次のメッセージが出力され,アセンブルが中止されます 。

E0550231:イミーディエトとして指定された値が指定可能な値の範囲を越えています。

-

listにプッシュ可能ではないレジスタを指定した場合,次のメッセージが出力され,そのレジスタを無視したコードが生成されます。

W0550015:prepare/dispose命令のレジスタ・リストに指定したレジスタが不正です。

-

listに0〜4095の範囲を越える絶対値式を指定した場合,次のメッセージが出力され,immを0xfffでマスクしたコードが生成されます。

W0550014:prepare/dispose命令のレジスタ・リストに指定した値が不正です。

-

immに4の倍数でない絶対値式を指定した場合,次のメッセージが出力され,immの下位2ビットを無視したコードが生成されます。

W0550019:オペランドに指定した値は4の倍数である必要があります。