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