dispose


スタック・フレームの削除(関数の後処理)を行います。(Function Dispose)

[指定形式]

-

dispose imm, list

-

dispose imm, list, [reg]

 

immに指定できるものを次に示します。

-

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

 

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

-

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

-

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

 

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

dispose 0x10, r26, r29, r31
dispose 0x10, 0x103

[機能]

dispose命令は,関数の後処理をする命令です。

 

-

“dispose imm, list”の形式

(a)

第1オペランドで指定した絶対値式の値をスタック・ポインタ(sp)に加算し,spをレジスタ退避領域に設定します。

(b)

第2オペランドで指定したレジスタを1つポップし,spに4を加算します。

(c)

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

 

-

“dispose imm, list, [reg]”の形式

(a)

第1オペランドで指定した絶対値式の値をスタック・ポインタ(sp)に加算し,spをレジスタ退避領域に設定します。

(b)

第2オペランドで指定したレジスタを1つポップし,spに4を加算します。

(c)

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

(d)

第3オペランドで指定したレジスタ値をプログラム・カウンタ(PC)に設定します。

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

[詳細説明]

-

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

(a)

0〜127の範囲の絶対値式

dispose imm, list
dispose imm, list
dispose imm, list, [reg]
dispose imm, list, [reg]

 

-

immに次のものを指定した場合,アセンブラでは,命令展開が行われ,複数個の機械語命令が生成されます。

(a)

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

dispose imm, list
movea   imm, sp, sp
dispose 0, list
dispose imm, list, [reg]
movea   imm, sp, sp
dispose 0, list, [reg]

(b)

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

dispose imm, list
mov     imm, r1
add     r1, sp
dispose 0, list, [reg]
dispose imm, list, [reg]
mov     imm, r1
add     r1, sp
dispose 0, list, [reg]

[フラグ]

CY

OV

S

Z

SAT

[注意事項]

-

形式“dispose imm, list, [reg]”の[reg]にr0を指定すると,次のメッセージが出力され,アセンブルが中止されます。

E0550240 : RH850コア指定時には、デスティネーション・オペランドにr0を指定することはできません。

-

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

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

-

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

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

-

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

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