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

循環シフト(1)

 循環シフトは、シフトによってあふれたビット列を空いた部分にうめる形のシフトである。
 次の図は、nビット右循環シフトの例である。
 (ここでは、1語のデータの循環シフトを取り上げる。次のページ(循環シフト(2))では2語のデータの循環シフトを取り上げる。)

 手順としては、次の図のように元のデータをシフトするビット数で2つに分割し、それぞれをシフトしてOR演算で結合することになる。

 まず、分割する処理を副プログラムDIVとして作成する。
 元のデータをGR1、分割するビット数をGR2に格納して副プログラムに渡す。分割したデータはGR3(の部分)とGR4(nの部分)に格納する。
 手順は次のとおりである。

  1. GR3に元のデータ(GR1)を格納する。
  2. GR3をnビット(GR2)右シフトする。
  3. GR4に元のデータ(GR1)を格納する。
  4. 左シフトするビット数を計算する。(16-n)
  5. GR4を(16-n)ビット左シフトする。
MAIN     START
         LD      GR1, DATA1
         LD      GR2, DATA2
         CALL    DIV
         ST      GR3, ANS1
         ST      GR4, ANS2
         RET
DATA1    DC      #5A5A    ;0101101001011010
DATA2    DC      5
ANS1     DS      1
ANS2     DS      1
         END
DIV      START
         PUSH    0, GR5
         LD      GR3, GR1      ;1. 元のデータ格納 GR3=0101 1010 0101 1010
         SRL     GR3, 0, GR2   ;2. Aのデータ GR3=0000 0010 1101 0010(#02D2)
         LD      GR4, GR1      ;3. 元のデータ格納 GR4=0101 1010 0101 1010
         LAD     GR5, 16       ;4. 左シフトするビット数計算 GR5=16
         SUBA    GR5, GR2      ;4.   GR5=16-GR2 (GR5=11)
         SLL     GR4, 0, GR5   ;5. nのデータ GR4=1101 0000 0000 0000(#D000)
         POP     GR5
         RET
         END
 左シフトするビット数の計算にGR5を使用するのでスタックに退避している。(PUSH, POP命令)


 副プログラムDIVを利用して、右循環シフトの副プログラムRSHIFTを作成する。
 元のデータをGR1、右シフトするビット数をGR2に格納して副プログラムに渡す。結果はGR0に格納する。
 レジスタの値は副プログラム呼び出し前と変わらないようにすること。

MAIN     START
         LD      GR1, DATA1
         LD      GR2, DATA2
         CALL    RSHIFT
         ST      GR0, ANS
         RET
DATA1    DC      #5A5A    ;0101101001011010
DATA2    DC      4
ANS      DS      1
         END
RSHIFT   START
         RPUSH
         CALL    DIV
         LD      GR0, GR3
         OR      GR0, GR4
         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
 副プログラムRSHIFTは副プログラムDIVを呼び出して結果をOR演算しているだけである。
 問題で「副プログラムDIVを利用して、… 副プログラムRSHIFTを作成する。」とあるので上のようなプログラムとなる。特に指示がなければ次のようなプログラムでも良い(副プログラムRSHIFT2)。
MAIN2    START
         LD      GR1, DATA1
         LD      GR2, DATA2
         CALL    RSHIFT2
         ST      GR0, ANS
         RET
DATA1    DC      #5A5A    ;0101101001011010
DATA2    DC      4
ANS      DS      1
         END
RSHIFT2  START
         RPUSH
         LD      GR0, GR1      ;元のデータ格納.
         SRL     GR0, 0, GR2   ;Aのデータ.
         LD      GR4, GR1      ;元のデータ格納.
         LAD     GR5, 16       ;左シフトするビット数計算.
         SUBA    GR5, GR2      ;  GR5=16-GR2
         SLL     GR4, 0, GR5   ;nのデータ.
         OR      GR0, GR4      ;OR演算。データの結合.
         RPOP
         RET
         END


課題1  副プログラムDIVを利用して、循環シフトの副プログラムLSHIFTを作成する。
 元のデータをGR1、左シフトするビット数をGR2に格納して副プログラムに渡す。結果はGR0に格納する。
 レジスタの値は副プログラム呼び出し前と変わらないようにすること。

 ヒント: 



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

 

 

inserted by FC2 system