;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う ;;; 入力 GR1:被乗数 GR2:乗数 ;;; 出力 GR3:積 ;;; 積が65535より大きい場合は、オーバーフロー MULL START XOR GR3,GR3 ; GR3の初期化 AND GR1,GR1 ; GR1 = 0 の場合、FINへジャンプ JZE FIN ; ↓ AND GR2,GR2 ; GR2 = 0 の場合、FINへジャンプ JZE FIN ; ↓ PUSH 0,GR1 ; GR1の退避 PUSH 0,GR2 ; GR2の退避 LOOP SRL GR2,1 ; ループ開始。SRLを1つ右シフト JOV ON ; 乗数の最下位ビットが1の場合、ONへジャンプ JUMP NEXT ; NEXTへジャンプ ON ADDL GR3,GR1 ; GR3 <- GR3 + GR1 JOV POST ; GR3がオーバーフローした場合、POSTへジャンプ NEXT AND GR2,GR2 ; GR2 = 0 の場合、POSTへジャンプ JZE POST ; ↓ SLL GR1,1 ; GR1を1つ左シフト JOV POST ; GR1がオーバーフローした場合、POSTへジャンプ JUMP LOOP ; ループ終端 POST POP GR2 ; GR2の復元 POP GR1 ; GR1の復元 FIN RET END