CASL U - 2つの値を交換する |
2つの値を交換することを「スワップ(swap)」という。レジスタ同士のスワップ、メモリ同士のスワップについて考えてみる。
レジスタ同士のスワップ
例えば、レジスタGR1とGR2の値を交換する。GR1=123、GR2=789のときに交換するとGR1=789、GR2=123となる。
手順は、@GR1の内容をGR3に格納、AGR2の内容をGR1に格納、BGR3の内容をGR2に格納する。
GR3 ← GR1 … @
GR1 ← GR2 … A
GR2 ← GR3 … B
このように、別にひとつレジスタを用意して内容を交換する。次にプログラムを示す。赤色部分の3行がスワップ処理の部分である。
SWAP1 START
LD GR1, DATA1
LD GR2, DATA2
LD GR3, GR1
LD GR1, GR2
LD GR2, GR3
ST GR1, ANS1
ST GR2, ANS2
RET
DATA1 DC 123
DATA2 DC 789
ANS1 DS 1
ANS2 DS 1
END
別の方法として、スタックを利用する方法がある。「スタック操作命令」参照。
EX41 START
LD GR1, =123
LD GR2, =789
PUSH 0, GR1
PUSH 0, GR2
POP GR1
POP GR2
RET
END
メモリ同士のスワップ
メモリに格納されているデータ同士を交換する副プログラムSWAP2を作成する。2つのデータが格納されているアドレスをそれぞれGR1とGR2に格納して副プログラムに渡す。
例えば、DATA1番地とDATA2番地のデータを交換するとき、GR1にはアドレスDATA1、GR2にはアドレスDATA2を格納して副プログラムを呼び出す。副プログラムの処理結果はDATA1番地とDATA2番地の内容が入れ替わる。
DATA1 DATA2 |
|
→ 副プログラム → | DATA1 DATA2 |
|
||||
GR1 = DATA1 GR2 = DATA2 |
レジスタの値は 変わらない。 |
手順は次のとおりである。
- DATA1番地の内容をGR3に記憶する。
- DATA2番地の内容をGR4に記憶する。
- GR3の内容をDATA2番地に格納する。
- GR4の内容をDATA1番地に格納する。
- 呼び出し元に戻る。
MAIN1 START
LAD GR1, DATA1
LAD GR2, DATA2
CALL SWAP2
RET
DATA1 DC #AAAA
DATA2 DC #FFFF
END
SWAP2 START
PUSH 0, GR3
PUSH 0, GR4
LD GR3, 0, GR1 ;1.
LD GR4, 0, GR2 ;2.
ST GR3, 0, GR2 ;3.
ST GR4, 0, GR1 ;4.
POP GR4
POP GR3
RET
END
レジスタGR3とGR4を交換作業に使うので、副プログラムの最初と最後で値をスタック(PUSH, POP)に保存している。
課題1 次の図のようにデータが2語ずつ連続して格納されている。このデータを副プログラムSWAP2を使って交換するためのメインプログラムを作成せよ。
DATA1 DATA2 |
|
→ 副プログラム → | DATA1 DATA2 |
|
||||||||
GR1 = DATA1 GR2 = DATA2 |
レジスタの値は 変わらない。 |
;テストデータ
DATA1 DC #AAAA, #BBBB
DATA2 DC #FFFF, #EEEE
課題2 データ領域の先頭アドレスをDATA1番地、DATA2番地とする2語以上の連続した同じ語数のデータがある。このデータを副プログラムSWAP2を使って交換するためのメインプログラムを作成せよ。先頭アドレスはそれぞれGR1とGR2に格納する。また、データ領域の語数はGR0に格納しておく。
;テストデータ
DLEN DC 3
DATA1 DC #AAAA, #BBBB, #CCCC
DATA2 DC #FFFF, #EEEE, #DDDD
CASL U | Copyright © 2003,2017 Hiroshi Masuda |