Двоичное умножение: как вы «разлагаете» множитель? - PullRequest
0 голосов
/ 16 мая 2018

Итак, я пытаюсь реализовать множитель в программе на языке ассемблера, используя алгоритм сдвига и добавления.У меня нет инструкции левого сдвига в этом ISA, но я понимаю, что добавление числа к себе сместит число, оставленное на единицу.

Допустим, я хочу умножить 5 * 15, что будет 101 умножено на 1111.Я понимаю, что мне нужно умножить 5 на каждый частичный бит из 15, но я запутался в том, как я могу получить доступ к этим частичным битам / работать с ними.Справа налево я умножаю 1 на 101, чтобы получить 101, добавляю заполнитель для сдвига влево и продолжаю с каждым последующим битом, получая 1010, 10100 и 101000.Затем я складываю эти числа, чтобы получить 1001011, то есть 75, правильный ответ.

Итак, как бы я мог сделать это в сборке?Я в замешательстве.Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Может быть, дубликат Как умножить и разделить, используя только сдвиг и добавление битов?, в котором есть некоторые подробности.

на x86, учитывая 15 в EDX, вы должны

lea eax, [rdx + rdx*4]

сделать EAX = (EDX<<2) + EDX = EDX*5, потому что 101 - это (1<<2) + (1<<0).

См. Также Как я могу умножить двоичное представление на десять, используя логические элементы? на computerscience.SE для получения дополнительной информации о умножении.

Естьинструкция сдвига быстрее, чем инструкция IMUL? имеет некоторые вещи.

...