CASL U - 循環シフト(2)
 前へ 目次へ 次へ

循環シフト(2)

 前のページ(循環シフト(1))で1語のデータの循環シフトを説明した。ここでは、データを拡張して2語のデータの循環シフトを取り上げる。
 次の図は、nビット右循環シフトの例である。

 手順としては、元のデータをシフトするビット数で2つに分割する。ここでは、2語あるので4つ(A, na, B, nb)に分割する。そして、Aとnb、Bとna をそれぞれOR演算で結合することになる。
 分割する処理は副プログラムDIVを利用する。

 元のデータ(2語)の先頭アドレスをGR1に、シフトするビット数をGR2に格納して副プログラムR2SHIFTに渡す。結果は、元のデータが記憶されていたアドレスに格納される。
 プログラムは次のとおりである。

MAIN     START
         LAD     GR1, DATA
         LD      GR2, BIT
         CALL    R2SHIFT
         RET
DATA     DC      #5A5A, #1234  ;元のデータ(2語)
BIT      DC      4             ;シフトするビット数.
ANS      DS      2
         END
R2SHIFT  START
         RPUSH
         LD      GR5, GR1      ;GR1をGR5に記憶.
         LD      GR1, 0, GR5   ;データ(#5A5A)格納.
         CALL    DIV
         LD      GR6, GR3      ;AのデータをGR6に記憶.
         LD      GR7, GR4      ;naのデータをGR7に記憶.
         LD      GR1, 1, GR5   ;データ(#1234)格納.
         CALL    DIV
         OR      GR4, GR6      ;GR4(nb)とGR6(A)のOR演算.
         ST      GR4, 0, GR5   ;
         OR      GR3, GR7      ;GR3(na)とGR7(B)のOR演算.
         ST      GR3, 1, GR5   ;
         RPOP
         RET
         END
DIV      START
         PUSH    0, GR5
         LD      GR3, GR1      ;元のデータ格納.
         SRL     GR3, 0, GR2   ;Aのデータ.
         LD      GR4, GR1      ;元のデータ格納.
         LAD     GR5, 16       ;左シフトするビット数計算.
         SUBA    GR5, GR2      ;  GR5=16-GR2
         SLL     GR4, 0, GR5   ;Nのデータ.
         POP     GR5
         RET
         END


課題1  2語のデータの循環シフトの副プログラムL2SHIFTを作成する。
 条件は上の問題と同じである。
 レジスタの値は副プログラム呼び出し前と変わらないようにすること。



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

 

 

inserted by FC2 system