CASL U - 循環シフト(1) |
循環シフトは、シフトによってあふれたビット列を空いた部分にうめる形のシフトである。
次の図は、nビット右循環シフトの例である。
(ここでは、1語のデータの循環シフトを取り上げる。次のページ(循環シフト(2))では2語のデータの循環シフトを取り上げる。)
手順としては、次の図のように元のデータをシフトするビット数で2つに分割し、それぞれをシフトしてOR演算で結合することになる。
まず、分割する処理を副プログラムDIVとして作成する。
元のデータをGR1、分割するビット数をGR2に格納して副プログラムに渡す。分割したデータはGR3(Aの部分)とGR4(nの部分)に格納する。
手順は次のとおりである。
- GR3に元のデータ(GR1)を格納する。
- GR3をnビット(GR2)右シフトする。
- GR4に元のデータ(GR1)を格納する。
- 左シフトするビット数を計算する。(16-n)
- 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 |