アセンブラファイルの整理
[YACASL2.git] / as / fe_tests / 2010_10 / Q12 / revl.casl
diff --git a/as/fe_tests/2010_10/Q12/revl.casl b/as/fe_tests/2010_10/Q12/revl.casl
new file mode 100644 (file)
index 0000000..1424d8c
--- /dev/null
@@ -0,0 +1,41 @@
+LREVRS  START
+        RPUSH
+        LD     GR3,GR1
+        LD     GR4,GR2
+        SUBA   GR4,=1
+        JZE    LOOP2
+        ADDA   GR4,GR1
+LOOP1   LD     GR5,0,GR3      ;
+        LD     GR6,0,GR4      ; GR3 が指す語と GR4 が指す語の内容を
+        ST     GR5,0,GR4      ; 入れ替える
+        ST     GR6,0,GR3      ;
+        LAD    GR3,1,GR3      ; GR3 を次の語に位置付ける
+        LAD    GR4,-1,GR4     ; GR4 を一つ前の語に位置付ける
+        CPA    GR3,GR4
+        JMI    LOOP1
+LOOP2   CALL   REVRS
+        LAD    GR1,1,GR1
+        SUBA   GR2,=1
+        JNZ    LOOP2
+FIN3    RPOP
+        RET
+        END
+REVRS   START
+        RPUSH
+        LD     GR4,=0     ; 結果のビット列を初期化
+        LAD    GR2,15     ; ループカウンタ
+        LD     GR3,0,GR1  ; GR3 ← ビット列
+LOOP    SLL    GR4,1      ; 結果のビット列を左シフト
+        SRL    GR3,1      ; 元のビット列を右シフト
+        JOV    ON
+        JZE    FIN1       ; 元のビット列の残りのビットはすべてゼロ
+        JUMP   OFF
+ON      OR     GR4,=#0001
+OFF     SUBA   GR2,=1
+        JMI    FIN2       ; 16 ビット処理済み
+        JUMP   LOOP
+FIN1    SLL    GR4,0,GR2  ; 結果のビット列を残りのビット数だけシフト
+FIN2    ST     GR4,0,GR1
+        RPOP
+        RET
+        END