| JRNG OS関連命令 <<L1R>>,<<L1>>,<<L2>> |
【ニモニックとオペランド】
JRNG vector
【機能】
Jump to an inner ring
内側リングへのジャンプ
【オプション】
なし
【命令フォーマットと表記法】
【解説】
リング間の遷移とジャンプを行います。
この命令は現リングよりも内側のリングに位置するプログラムを呼び出すために使用されます。
内側リングを外側リングから保護するため、JRNG命令のジャンプ先は特定のアドレスに制限されています。このアドレスはJRNGベクタテーブル(JRNGVT)に格納されています。JRNGVTには最大65,535のエントリ(JRNGVTE)が入り、ベース論理アドレスはJRNGベクタテーブルベース(JRNGVB)で指定します。
JRNGVBは制御レジスタの一つであり、以下のような構成になっています。
JRNGVB
JRNGVBはJRNGVTの先頭アドレスを指定します。JRNGVBの29番目と30番目のビットは"0"に固定されています。Eビットがゼロのときには、JRNG命令は実行されません(RTVEが発生)。
JRNGVTEは8バイトの長さを持ち、以下のような構成になっています。JRNGVTE
ARビットはJRNG命令がジャンプすることを許可するもっとも外側のリングレベルを示します。したがって、 AR < RNG の場合には、JRNG命令は禁止され、リング遷移違反例外(RTVE)が発生します。
JRNGVTEのVPCフィールドは偶数でなければなりません。つまり、VPCのLSBはゼロでなければなりません。これに違反すると、奇数アドレスジャンプ例外(OAJE)または奇数アドレスジャンプトラップ(OAJT)が発生します。命令動作
JRNGVBレジスタのEビットがゼロの場合、RTVEが発生します。
VR,AR,VPCは[vector *8+JRNGVB]のアドレスにあるJRNGVTEよりフェッチされます。
- 初期RNG > ARまたは初期RNG < VRの場合、RTVEが発生します。
初期SP → @-SP(VRで指定される新スタック)
初期PC → @-SP
- JRNG直後の命令の先頭アドレスは初期 PCとしてスタックにプッシュされます。
- 初期PSW .and. B'01110000 00000000 11111111 11111111 → @-SP
- 初期RNG → 新PRNG
VR → 新RNG
VPC → 新PCJRNG命令を実行するためには、以下の条件が満たされなければなりません。
- E = 1(JRNGVBレジスタのEビット)
- E = 0のときには、内側リングへのジャンプは禁止されます。この状態でJRNG命令を実行すると、リング遷移違反例外(RTVE)が発生します。
- 外側リングへのジャンプは禁止されます。違反すると、リング遷移違反例外 (RTVE)が発生します。
- リングが有効かどうかを検査する必要があります。違反すると、リング遷移違反例外(RTVE)が発生します。
JRNG命令で作成されるスタックフレームは以下の通りです。
JRNG命令では、PSSの一部とPSMのPRNGが更新されます。PSBは変わりません。PSWのATが"00"(つまり、アドレス変換なし)の場合、JRNGVBは物理アドレスを示します。
JRNG:Eフォーマットの場合は、vectorがゼロ拡張されます。
JRNGでは、現リングへのジャンプも可能です。この場合、スタックは切り換わりません。SPとしてスタックにプッシュされる値はJRNG実行前のSP値です。これはJRNG命令の最初でPUSH SPを実行したのと同じ動作です。このときのスタックフレームは以下の通りです。
現リングへジャンプしたときのスタックフレーム
![]()
【フラグ変化】
【発生EIT】
RIE vector [Gen-M/ru]のアドレッシングモード違反 RTVE E = 0(JRNGVBのEビット) RTVE RNG < VR RTVE RNG > AR RTVE vector > MJRNGV(MJRNGVを実装するとき) OAJE/OAJT VPCフィールドのLSB = 1
【使用例】
汎用レジスタR3の下位16ビット(H'001a)をvectorとみなし、メモリアドレスH'fff00d0(vector(H'001a)*8 +JRNGVB(H'ffff0000))から8バイトの
データがフェッチされます。このデータはJRNGVTエントリで、VR,AR,VPCがこのデータからフェッチされます。遷移条件が成立すると、JRNGが実行されます。