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

Опубликовано lamazavr - вт, 01/15/2013 - 22:38
Body

Конечно же во всех современных микропроцессорах есть команда умножения и (если честно) понятия не имею зачем нас этому учат, но раз уже научили напишу и статью о умножении чисел в МП который не имеет команд для умножения (у 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

Категория

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

Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.