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+4L1
L2
L3
L4
L5
これが、ジャンプテーブルになる。例えば、AND演算をしたいときにはL3番地にジャンプする。このジャンプテーブルを使うとL3番地は
JTABLE+処理番号-1
で計算される番地の内容である。レジスタGR3に処理番号が記憶されているので、これを元に飛び先(アドレス)を計算する手順は次の通りとなる。
- GR3から1を減じる。
- JTABLE+GR3番地の内容をGR3に記憶する。
- 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
手順は次のとおりである。
- GR1の内容をGR0に記憶する。
- a. GR3から1を減じる。
- b. JTABLE+GR3番地の内容をGR3に記憶する。
- c. GR3番地にジャンプする。
- <<各演算の処理を書く>>
- 呼び出し元に戻る。
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
課題2 GR0に整数データ、GR1に処理番号を格納して副プログラムSUB2に渡すと、次の表の処理結果をGR0に格納して戻るプログラムを作成せよ。GR0,GR1以外のレジスタの値は副プログラム呼び出し前と変わらないようにすること。
処理番号 処理(演算)内容 0
1
2
3
4
5× 0
× 1
× 2
× 3
× 4
× 5
CASL U | Copyright © 2003,2017 Hiroshi Masuda |