CASL U - ジャンプテーブル
 前へ 目次へ 次へ

ジャンプテーブル

 処理によってジャンプ先を変えるとき、ジャンプ先のアドレスをデータとして用意してくことで便利なことがある。
 例えば、2つのデータをGR1とGR2に、GR3に処理の種類番号を格納しておき副プログラムに渡すと、指定した処理の結果が得られる、というようなプログラムを考える。
 処理の種類は次のとおりとする。計算結果はGR0に格納される。

処理番号 処理(演算)内容 ラベル名
1
2
3
4
5
算術加算(GR1)+(GR2)
算術減算(GR1)-(GR2)
AND演算
OR演算
XOR演算
L1
L2
L3
L4
L5

 各処理の先頭は、ラベルL1, L2, L3, L4, L5が付けられているものとする。このラベル(番地)をDC命令で連続して定義する。

JTABLE  DC  L1, L2, L3, L4, L5
番地 定義内容(ラベル名)
JTABLE
JTABLE+1
JTABLE+2
JTABLE+3
JTABLE+4
L1
L2
L3
L4
L5

 これが、ジャンプテーブルになる。例えば、AND演算をしたいときにはL3番地にジャンプする。このジャンプテーブルを使うとL3番地は
    JTABLE+処理番号-1
で計算される番地の内容である。レジスタGR3に処理番号が記憶されているので、これを元に飛び先(アドレス)を計算する手順は次の通りとなる。

  1. GR3から1を減じる。
  2. JTABLE+GR3番地の内容をGR3に記憶する。
  3. GR3番地にジャンプする。
GR3の内容 1 2 3 4 5
a. 1を減じる 0 1 2 3 4
b. JTABLE+GR3 JTABLE+0 JTABLE+1 JTABLE+2 JTABLE+3 JTABLE+4
(GR3の内容) L1 L2 L3 L4 L5
c. GR3番地に
      ジャンプ
JUMP  0,GR3

 手順は次のとおりである。

  1. GR1の内容をGR0に記憶する。
  2.  a. GR3から1を減じる。
  3.  b. JTABLE+GR3番地の内容をGR3に記憶する。
  4.  c. GR3番地にジャンプする。
  5. <<各演算の処理を書く>>
  6. 呼び出し元に戻る。
MAIN1    START
         LD      GR3, =1
         LD      GR1, DATA1
         LD      GR2, DATA2
LOOP     CALL    ENZAN
         ST      GR0, ANS
         RET
DATA1    DC      555
DATA2    DC      333
ANS      DS      1
         END
ENZAN    START
         PUSH    0, GR3
         LD      GR0, GR1          ;1.
         LAD     GR3, -1, GR3      ;a.  (SUBA  GR3,1)
         LD      GR3, JTABLE, GR3  ;b.
         JUMP    0, GR3            ;c.
L1       ADDA    GR0, GR2          ;加算の処理.
         JUMP    OWARI             ;
L2       SUBA    GR0, GR2          ;減算の処理.
         JUMP    OWARI             ;
L3       AND     GR0, GR2          ;ANDの処理.
         JUMP    OWARI             ;
L4       OR      GR0, GR2          ;ORの処理.
         JUMP    OWARI             ;
L5       XOR     GR0, GR2          ;XORの処理.
OWARI    POP     GR3
         RET                       ;6.
JTABLE   DC      L1, L2, L3, L4, L5
         END


課題1 次のプログラムについて各問いに答えよ。

MAIN2    START
         LD      GR1, =1
         LD      GR0, DATA1
LOOP     CALL    SUB1
         ST      GR0, ANS
         RET
DATA1    DC      1
ANS      DS      1
         END
SUB1     START
         LD      GR1, JTABLE, GR1  ;
         JUMP    0, GR1            ;
L5       ADDA    GR0, GR0          ;
L4       ADDA    GR0, GR0          ;
L3       ADDA    GR0, GR0          ;
L2       ADDA    GR0, GR0          ;
L1       ADDA    GR0, GR0          ;
L0       RET
JTABLE   DC      L0, L1, L2, L3, L4, L5
         END
@GR1=1のとき、ANS番地に格納される値を答えよ。

AGR1=2のとき、ANS番地に格納される値を答えよ。
 
BGR1に設定できる値は  から までである。
 
   


課題2 GR0に整数データ、GR1に処理番号を格納して副プログラムSUB2に渡すと、次の表の処理結果をGR0に格納して戻るプログラムを作成せよ。GR0,GR1以外のレジスタの値は副プログラム呼び出し前と変わらないようにすること。

処理番号 処理(演算)内容
0
1
2
3
4
5
× 0
× 1
× 2
× 3
× 4
× 5


 前へ 目次へ 次へ
 CASL U Copyright © 2003  Hiroshi Masuda

 

 

inserted by FC2 system