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