Умножение в МП на asm без использования команд умножения

Конечно же во всех современных микропроцессорах есть команда умножения и (если честно) понятия не имею зачем нас этому учат, но раз уже научили напишу и статью о умножении чисел в МП который не имеет команд для умножения (у intel подобных это mul и imul).

Схем умножения со сдвигом (именно сдвигом делается умножение в случае отсутствия команд) предостаточно, так что я расскажу только о умножении со сдвигом множимого.

Тут объяснять сложно, так что я лучше приведу пример:

x = 10112 - множимое

y = 11012 - множитель

Находим произведение сдвигая множимое.

                   1011

                   1101

__________________

                   1011

                 0000

                1011

              1011

___________________

              10001111

Таким образом видим, что при сдвиге:

Если очередной бит множителя 1 к "будующему произведению" необходимо добавить сдвинутое множимое, если 0 - то добавить 0.

Алгоритм довольно не сложный.

Теперь программа. Опишу для чисел без знака.

x - регистр AX (2 байта)

y - регист BX (2 байта)

DX:CX - произведение (4 байта)

Обратите внимание, что множимое будем сдвигать влево, следовательно для избежания потери данных необходимо расширить его ещё на 2 байта (регистром SI).

xor si,si ; обнуляем
xor cx,cx;
xor dx,dx
mov ax,[200]    ; адрес X в памяти
mov bx,[210]    ; адрес Y в памяти
mov bp,10       ; шестнадцатиричное число - количество проходов цикла (2Б)
cycle: shr bx,1 ; сдвигаем очередной бит в флаг CF 
jnc m1          ; если он 0 то ничего не добавляем
add cx,ax       ; сложение младшего слова
adc dx,si       ; сложение старшего слова с учётом переноса
m1: shl ax,1    ; сдвигаем множитель (младшее слово)
rcl si,1        ; сдвигаем старшее слово множителя
dec bp          ; уменьшаем счётчик цикла
jnz cycle       ; если он не нулевой переходим по метке cycle
mov [230],cx    ; заносим результат в память
mov [232],dx

Таким образом в ячейках памяти 230-234 будет занесён результат умножения.

Проверить удобно на числах ABCD x CDAB = EE EA 05 8A

Просмотров:   4000

Комментарии

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!