Как-то вдруг задумался о перемножении чисел без использования инструкций умножения.
Нужно сказать, что в корне данной задачи лежит сдвиг числа на то количество бит, на котором месте эти биты находятся. Собственно и обнаружил я эту закономерность совершенно случайно.
В результате недолгого мозгового штурма получился следующий ниже код, в регистре esi получаем произведение eax * ebx.
Разумеется представленная версия кода ограничивает результат 32-мя битами, но ведь разрядность при желании можно и расширить, главное - концепция.
xor esi, esi ; обнулим мусор
mov eax, 12345 ; первое число
mov ebx, 23456 ; второе число
@@: mov edx, eax ; сохраним число для сдвигов
bsf ecx, ebx ; находим установленный бит
btc ebx, ecx ; удалим найденный ранее установленный бит
shl edx, cl ; сдвигаем число на индекс найденого бита
add esi, edx ; складываем полученные в результате сдвигов числа
or ebx, ebx ; проверяем есть ли ещё установленные биты
jnz @B ; если есть, поработаем ещё
ret ; иначе - выходим
agalakhov
Это алгоритм умножения на арифмометре "Феликс".