Умножение в МП на 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

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий