スタック・フレームの削除(関数の後処理)を行います。(Function Dispose)
[指定形式]
- | dispose imm, list, [reg] |
immに指定できるものを次に示します。
listは,dispose命令でポップ可能な12本のレジスタを指定するものです。listに指定できるものを,次に示します。
- | レジスタ
プッシュの対象となるレジスタ(r20〜r31)をカンマで区切って指定します。 |
- | 12ビット幅までの値を持つ絶対値式
12ビットと12本のレジスタとの対応は次のとおりです。 |
次の2つの指定は等価です。
dispose 0x10, r26, r29, r31
|
dispose 0x10, 0x103
|
[機能]
dispose命令は,関数の後処理をする命令です。
(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つ生成されます。 |
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]
|
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]
|
[フラグ]
[注意事項]
- | 形式“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の倍数である必要があります。
|