Advertisement
Guest User

Untitled

a guest
May 15th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. _asm {
  2.         // В начало
  3.     jmp start_label
  4.         // Умножение a и b
  5.     mulab_label:
  6.             // Обнуляем res
  7.         mov cx, bnonz
  8.         loopzerores_label:
  9.             mov si, bnonz
  10.             sub si, cx
  11.             mov word ptr res[esi*2], 0
  12.         loop loopzerores_label
  13.             // Умножаем
  14.         mov cx, bnonz
  15.         loopb_label:
  16.             push cx // stack: +<счетчик цикла b>
  17.             mov bx, bnonz
  18.             sub bx, cx // bx - смещение по b
  19.  
  20.             mov cx, dig
  21.             loopa_label:
  22.                 push cx // stack: <счетчик цикла b>, +<счетчик цикла a>
  23.                 push bx // stack: <счетчик цикла b>, <счетчик цикла a>, +<смещение по b>
  24.                 mov si, dig
  25.                 sub si, cx // si - смещение по a
  26.  
  27.                 mov ax, word ptr a[esi*2] // ax - цифра a
  28.  
  29.                 mov dx, si // dx - смещение по a
  30.                 pop si // stack: <счетчик цикла b>, <счетчик цикла a>, -
  31.                        // si - смещение по b
  32.                 mov cx, word ptr b[esi*2] // cx - цифра b
  33.  
  34.                 push dx // stack: <счетчик цикла b>, <счетчик цикла a>, +<смещение по a>
  35.                 mul cx // ax - пр-ние цифр
  36.                 pop dx // stack: <счетчик цикла b>, <счетчик цикла a>, -
  37.                 add si, dx // si - сумма смещений
  38.  
  39.                 add ax, word ptr res[esi*2] // ax - сумма произведения и уже лежащего остатка
  40.                 xor edx, edx
  41.                 mov cx, 10
  42.                 div cx
  43.                 mov word ptr res[esi*2], dx
  44.                 inc esi
  45.                 add word ptr res[esi*2], ax
  46.  
  47.                 pop cx // stack: <счетчик цикла b>, -
  48.             loop loopa_label
  49.  
  50.             pop cx // stack: -
  51.         loop loopb_label
  52.     ret
  53.         // Копирование res в b
  54.     copyrestob_label:
  55.         mov cx, bnonz
  56.         loopresdignezero_label:
  57.             mov si, bnonz
  58.             sub si, cx
  59.             mov bx, word ptr res[esi*2]
  60.             mov word ptr b[esi*2], bx
  61.         loop loopresdignezero_label
  62.     ret
  63.         // Декремент a
  64.     deca_label:
  65.         mov cx, dig
  66.         loopadigzero_label:
  67.             mov si, dig
  68.             sub si, cx
  69.             cmp word ptr a[esi*2], 0
  70.             jne foundadignezero_label
  71.             mov word ptr a[esi*2], 9
  72.         loop loopadigzero_label
  73.         foundadignezero_label:
  74.             dec word ptr a[esi*2]
  75.     ret
  76.         // Старт
  77.             // Обнуляем регистры, res, b
  78.     start_label:
  79.         xor ecx, ecx
  80.         xor eax, eax
  81.         xor ebx, ebx
  82.         xor edx, edx
  83.         xor esi, esi
  84.  
  85.         mov cx, bufS
  86.     zerores_label:
  87.         mov si, bufS
  88.         sub si, cx
  89.         mov word ptr res[esi*2], 0
  90.         mov word ptr b[esi*2], 0
  91.     loop zerores_label
  92.             // Основной цикл
  93.         mov word ptr b, 1
  94.     loopanezero_label:
  95.         call mulab_label
  96.         call copyrestob_label
  97.         call deca_label
  98.         mov cx, dig
  99.                 // Проверка a на 0
  100.         loopdigitsa_label:
  101.             mov si, dig
  102.             sub si, cx
  103.             cmp word ptr a[esi*2], 0
  104.             jne loopanezero_label
  105.         loop loopdigitsa_label
  106.     end_label:
  107.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement