CASL U - 循環シフト(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 |