Как-то вдруг задумался о перемножении чисел без использования инструкций умножения.
Нужно сказать, что в корне данной задачи лежит сдвиг числа на то количество бит, на котором месте эти биты находятся. Собственно и обнаружил я эту закономерность совершенно случайно.
В результате недолгого мозгового штурма получился следующий ниже код, в регистре 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 ; иначе - выходим
ссылка на оригинал статьи https://habr.com/ru/post/564160/
Добавить комментарий