loop


ループを行います。(Loop)

[指定形式]

-

loop reg1, disp16

 

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

-

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

-

ラベルのPCオフセット参照を持つ相対値式

-

label(PCオフセット)

[機能]

汎用レジスタreg1の内容から−1を加算した値で汎用レジスタreg1を更新します。更新後の汎用レジスタreg1の内容が0でなかった場合,次の処理を行います。そうでないときは次の命令に進みます。

-

15ビット・イミーディエトを1ビット論理左シフトしてワード長までゼロ拡張した結果を現在のPCから減算した値をPCに設定し,制御を移します。

-

汎用レジスタreg1の内容に対しては,−1(0xFFFFFFFF)を加算します。キャリー・フラグの更新はsub命令ではなく,add命令と同一の動作となります。

備考

16ビット・ディスプレースメントのビット0は暗黙的に0が使用されます。なお,計算に使用される現在のPCとは,この命令自身の先頭バイトのアドレスであるためディスプレースメント値が0のときは,分岐先はこの命令自身になります。

[詳細説明]

-

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

(a)

0〜65535の範囲の絶対値式

(b)

ラベルのPCオフセット参照を持つ相対値式

[フラグ]

CY

reg1の演算時にMSBからのキャリーがあれば1,そうでないとき0

OV

reg1の演算時にオーバーフローが起こった場合1,そうでない場合0

S

reg1が負になった場合1,そうでない場合0

Z

reg1が0になった場合1,そうでない場合0

SAT

[注意事項]

-

disp16に,0〜65535の範囲を越える絶対値式を指定した場合,次のメッセージを出力しアセンブルを中止します。

E0550230 : ディスプレースメントとして指定された値が指定可能な値の範囲を越えています。

 

-

disp16に,奇数値を持つ絶対値式を指定した場合,次のメッセージを出力し,アセンブルを中止します。

E0550226 : ディスプレースメントとして指定された値が指定可能な値の範囲を越えています。

 

-

loop命令に対し,reg1にr0を指定した場合,次のメッセージを出力し,アセンブルを中止します。

E0550239:RH850コア指定時には,ソース・オペランドにr0を指定することはできません。