Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- _asm {
- // В начало
- jmp start_label
- // Умножение a и b
- mulab_label:
- // Обнуляем res
- mov cx, bnonz
- loopzerores_label:
- mov si, bnonz
- sub si, cx
- mov word ptr res[esi*2], 0
- loop loopzerores_label
- // Умножаем
- mov cx, bnonz
- loopb_label:
- push cx // stack: +<счетчик цикла b>
- mov bx, bnonz
- sub bx, cx // bx - смещение по b
- mov cx, dig
- loopa_label:
- push cx // stack: <счетчик цикла b>, +<счетчик цикла a>
- push bx // stack: <счетчик цикла b>, <счетчик цикла a>, +<смещение по b>
- mov si, dig
- sub si, cx // si - смещение по a
- mov ax, word ptr a[esi*2] // ax - цифра a
- mov dx, si // dx - смещение по a
- pop si // stack: <счетчик цикла b>, <счетчик цикла a>, -
- // si - смещение по b
- mov cx, word ptr b[esi*2] // cx - цифра b
- push dx // stack: <счетчик цикла b>, <счетчик цикла a>, +<смещение по a>
- mul cx // ax - пр-ние цифр
- pop dx // stack: <счетчик цикла b>, <счетчик цикла a>, -
- add si, dx // si - сумма смещений
- add ax, word ptr res[esi*2] // ax - сумма произведения и уже лежащего остатка
- xor edx, edx
- mov cx, 10
- div cx
- mov word ptr res[esi*2], dx
- inc esi
- add word ptr res[esi*2], ax
- pop cx // stack: <счетчик цикла b>, -
- loop loopa_label
- pop cx // stack: -
- loop loopb_label
- ret
- // Копирование res в b
- copyrestob_label:
- mov cx, bnonz
- loopresdignezero_label:
- mov si, bnonz
- sub si, cx
- mov bx, word ptr res[esi*2]
- mov word ptr b[esi*2], bx
- loop loopresdignezero_label
- ret
- // Декремент a
- deca_label:
- mov cx, dig
- loopadigzero_label:
- mov si, dig
- sub si, cx
- cmp word ptr a[esi*2], 0
- jne foundadignezero_label
- mov word ptr a[esi*2], 9
- loop loopadigzero_label
- foundadignezero_label:
- dec word ptr a[esi*2]
- ret
- // Старт
- // Обнуляем регистры, res, b
- start_label:
- xor ecx, ecx
- xor eax, eax
- xor ebx, ebx
- xor edx, edx
- xor esi, esi
- mov cx, bufS
- zerores_label:
- mov si, bufS
- sub si, cx
- mov word ptr res[esi*2], 0
- mov word ptr b[esi*2], 0
- loop zerores_label
- // Основной цикл
- mov word ptr b, 1
- loopanezero_label:
- call mulab_label
- call copyrestob_label
- call deca_label
- mov cx, dig
- // Проверка a на 0
- loopdigitsa_label:
- mov si, dig
- sub si, cx
- cmp word ptr a[esi*2], 0
- jne loopanezero_label
- loop loopdigitsa_label
- end_label:
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement