Перемножение чисел на ассемблере без умножения

от автора

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


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *