32ビット論理加算のCASLプログラムaddl32を作成
authorj8takagi <j8takagi@nifty.com>
Sun, 7 Feb 2010 09:05:32 +0000 (18:05 +0900)
committerj8takagi <j8takagi@nifty.com>
Sun, 7 Feb 2010 09:05:32 +0000 (18:05 +0900)
as/casl2lib/addl32.casl
as/casl2lib_test/addl32_call.casl [new file with mode: 0644]

index 63a6bba..cfb5c1d 100644 (file)
@@ -1,22 +1,35 @@
 ;;; 2つの32ビット数値を加算する
 ;;; 32ビットの値は、連続する2語の領域に格納
-MAIN    START   BEGIN
-BEGIN   LAD     GR1,1           ; GR1にAの下位語を転送
-        LD      GR1,A,GR1       ; ↓
-        LAD     GR2,1           ; GR2にBの下位語を転送
-        LD      GR2,B,GR2       ; ↓
+;;; 入力 GR1:数値1の先頭アドレス GR2:数値2の先頭アドレス
+;;; 出力 GR0:和の先頭アドレス
+ADDL32  START
+        ST      GR1,A
+        ST      GR2,B
+        LD      GR3,LEN         ; GR3:語を表すインデックス 初期化
+        LAD     GR3,-1,GR3      ; ↓
+LOOP    AND     GR3,GR3         ; ループ先頭。(GR3 = 0)の場合は、ループ脱出
+        JMI     FIN             ; ↓
+        LD      GR1,GR3         ; GR1 <- (A + GR3)の値
+        ADDL    GR1,A           ; ↓
+        LD      GR1,0,GR1       ; ↓
+        LD      GR2,GR3         ; GR2 <- (B + GR3)の値
+        ADDL    GR2,B           ; ↓
+        LD      GR2,0,GR2       ; ↓
         ADDL    GR1,GR2         ; GR1 <- GR1 + GR2
-        JOV     CARR            ; オーバーフロー時は、CARRにジャンプ
-        JUMP    STL
-CARR    LAD     GR2,1           ; Cの上位語に1を格納
-        ST      GR2,C           ; ↓
-STL     LAD     GR2,1           ; Cの下位語にGR1の内容を格納
-        ST      GR1,C,GR2       ; ↓
-        LD      GR1,A           ; GR1にAの上位語を転送
-        ADDL    GR1,B           ; GR1 <- GR1 + B
-        ADDL    GR1,C           ; GR1 <- GR1 + C
+        ST      GR1,C,GR3       ; (C + GR3) <- GR1(フラグ不変)
+        LAD     GR3,-1,GR3      ; GR3 <- GR3 - 1(フラグ不変)
+        JOV     CRRY            ; オーバーフロー時は、CRRYへジャンプ
+        XOR     GR1,GR1         ; GR1 <- 0
+        JUMP    LOOP            ; ループ先頭へジャンプ
+CRRY    AND     GR3,GR3         ; 最上位の語でオーバーフローした場合
+        JZE     OV              ; ↓OVへジャンプ
+        LAD     GR1,1           ; GR1 <- 1
+        JUMP    LOOP            ; ループ終端
+OV      ADDL    GR1,=#FFFF      ; 強制的にオーバーフロー発生
+FIN     LAD     GR0,C           ; GR3 <- C
         RET
-A       DC      0,65534
-B       DC      0,65535
-C       DS      2
+A       DS      1               ; 数値1のアドレス
+B       DS      1               ; 数値2のアドレス
+C       DS      2               ; 和
+LEN     DC      2               ; 数値の語数
         END
diff --git a/as/casl2lib_test/addl32_call.casl b/as/casl2lib_test/addl32_call.casl
new file mode 100644 (file)
index 0000000..2b3b323
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN    START
+        LAD     GR1,A
+        LAD     GR2,B
+        CALL    ADDL32
+        RET
+A       DC      12,34
+B       DC      10,32767
+C       DS      2
+        END