;;; 2つの32ビット数値を加算する ;;; 32ビットの値は、連続する2語の領域に格納 ;;; 入力 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 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 DS 1 ; 数値1のアドレス B DS 1 ; 数値2のアドレス C DS 2 ; 和 LEN DC 2 ; 数値の語数 END