X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=as%2FFUNC%2Fmull1.casl;h=7de759bdc84ff3ae4b61d38636ac1089bdbf34a3;hb=0a27146563f27f432b89f1f91da94b80fff03162;hp=916f386eda39717f82a8170b0c838c9125d43493;hpb=fb54b1c9d2fbc3d4a62c6b4d38ff68e9d3b25c26;p=YACASL2.git diff --git a/as/FUNC/mull1.casl b/as/FUNC/mull1.casl index 916f386..7de759b 100644 --- a/as/FUNC/mull1.casl +++ b/as/FUNC/mull1.casl @@ -1,22 +1,31 @@ -;GR1の値とGR2の値の積をGR0に格納 +;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う +;;; 入力 GR1:被乗数 GR2:乗数 +;;; 出力 GR0:積 +;;; 積が65535より大きい場合は、GR0は積の下位16ビットになり、オーバーフロー MULL START - RPUSH + PUSH 0,GR1 + PUSH 0,GR3 XOR GR0,GR0 ; 積 + AND GR1,GR1 ; (GR1 = 0)の場合、終了 + JZE FIN ; ↓ + AND GR2,GR2 ; (GR2 = 0)の場合、終了 + JZE FIN ; ↓ LAD GR3,1 ; 対象ビット -MLOOP PUSH 0,GR3 ; ループ先頭。GR2の、GR3が示したビットが0の場合、MNEXTへジャンプ +LOOP PUSH 0,GR3 ; ループ先頭。GR2のビット中でGR3が示すビットが0の場合、NEXTへジャンプ AND GR3,GR2 ; ↓ POP GR3 ; ↓ - JZE MNEXT ; ↓ + JZE NEXT ; ↓ ADDL GR0,GR1 ; GR0 <- GR0 + GR1 - JOV MFIN ; オーバーフローした場合、ループ脱出 -MNEXT SLL GR3,1 ; GR3を1回左シフト + JOV FIN ; GR0がオーバーフローした場合、ループ脱出 +NEXT SLL GR3,1 ; GR3を1回左シフト AND GR3,GR3 ; (GR3 = 0)の場合、ループ脱出 - JZE MFIN ; ↓ + JZE FIN ; ↓ CPL GR3,GR2 ; (GR3 > GR2)の場合、ループ脱出 - JPL MFIN ; ↓ + JPL FIN ; ↓ SLL GR1,1 ; GR1を1回左シフト - JOV MFIN ; オーバーフローした場合、ループ脱出 - JUMP MLOOP ; ループ終端 -MFIN RPOP + JOV FIN ; GR1がオーバーフローした場合、ループ脱出 + JUMP LOOP ; ループ終端 +FIN POP GR3 + POP GR1 RET END