+++ /dev/null
-;;; 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