prepare, dispose


-

デバイスのprepare,dispose命令は,次の形式です。

-

PREPARE list12, imm5

-

PREPARE list12, imm5, sp/imm

-

DISPOSE imm5, list12

-

DISPOSE imm5, list12, [reg1]

 

asrhでは,次の形式で指定する必要があります。

-

prepare list, imm1

-

prepare list, imm1, imm2

-

prepare list, imm1, sp

-

dispose imm1, list

-

dispose imm1, list, [reg1]

 

-

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

-

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

-

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

 

[記述例]

prepare r26, r29, r31, 0x10                 ; prepare 0x103, 0x10と同じ

 

-

imm1には,spの増分値を4の倍数で指定してください。アセンブラがその値を2ビット右シフトして機械語命令に格納し,デバイスが実行時に2ビット左シフトして解釈します。

 

[記述例]

スタック領域を16バイト確保したい場合,0x4ではなく0x10と指定します。

prepare 0, 0x10

 

-

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
dispose imm1, list
movea   imm1, sp, sp
dispose  0, list
dispose imm1, list, [reg1]
movea   imm1, sp, sp
dispose  0, list, [reg1]

(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
dispose imm1, list
mov     imm1, r1
add     r1, sp
dispose  0, list, [reg1]
dispose imm1, list, [reg1]
mov     imm1, r1
add     r1, sp
dispose  0, list, [reg1]

[注意事項]

-

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

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

-

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

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

-

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

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

-

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

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