CASL U - 2つの値を交換する
 前へ 目次へ 次へ

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
AAAA
FFFF
→ 副プログラム → DATA1
DATA2
FFFF
AAAA
GR1 = DATA1
GR2 = DATA2
レジスタの値は
変わらない。

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

  1. DATA1番地の内容をGR3に記憶する。
  2. DATA2番地の内容をGR4に記憶する。
  3. GR3の内容をDATA2番地に格納する。
  4. GR4の内容をDATA1番地に格納する。
  5. 呼び出し元に戻る。
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
 
AAAA
BBBB
FFFF
EEEE
→ 副プログラム → DATA1
 
 
DATA2
 
FFFF
EEEE
AAAA
BBBB
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

 

 

inserted by FC2 system