2015-01-05 3 views
2

мое назначение - написать компилятор, который скомпилирует небольшой язык программирования на поддельный язык ассемблера (ячейки регистров и ячеек имеют неопределенную длину).Алгоритм быстрого умножения в сборке

Что я должен сделать, это преобразование такой инструкции:

a = b * c 

к набору INC, З, ADD Инструкции (где я это указатель на память, есть только один регистр доступен), который будет выполнить умножение. Проблема заключается в том, что алгоритм должен выполнять свою работу в O (log n) времени.

Может кто-нибудь объяснить шаг за шагом алгоритм решения этой проблемы? Мой друг упомянул алгоритм Бута-Максорли, но я его почти не понимаю.

РЕДАКТИРОВАТЬ: Поддельные инструкции по сборке включают в себя: чтение, запись, НАГРУЗКА я, МАГАЗИНА я, ADD I, SUB я, ШР я, СХЛ я, INC, СБРОС, ПРЫГНУТЬ к, JZERO к, Джодд к (перехода к к если регистр нечетный)

+0

Возможно, что-то вроде if (или в форме asm) или только эти три команды? Являются ли числа в двоичном 2-дополнении, или только положительным, или ...? – deviantfan

+0

Старые «расширенные алгоритмы умножения» предназначены для аппаратной реализации, включая Booth (используют пробеги одинаковых бит) и McSorley (вариант radix-4). Посмотрите на стандартный бинарный алгоритм, спросите своего друга, к чему она стремилась, укажите управление потоком и/или условную арифметику вашей сборки _fake_, дайте миру понять, насколько ваши попытки заставили вас. (Я ожидаю, что 'undefined length' испортит дополнение двух.) – greybeard

+0

Что представляет' n' в 'O (log n)'? Величина 'a',' b' или 'c'? Или длина бит регистра? Число бит «1» в двоичном представлении одного из чисел? Что-то еще? Я думаю, что то, о чем вы просите, может быть сделано в 'O (n)' на длину бит регистра или 'O (log n)' от величины одного из чисел, которые вы пытаетесь размножить ... – twalberg

ответ

3

Поскольку это поддельный ассемблер, я задаюсь вопросом, почему скорость важна? Скорее всего, это препятствует вам реализовать алгоритм наивного итерационного сложения, длина которого будет пропорциональна величине правого операнда (или меньшему из двух операндов, если вы хотите простой оптимизации, но O (n) тем не менее).

Метод реализации умножения в наборов команд, которые испытывают недостаток в инструкции умножения является использование сдвига-и-сложения (по существу длинные умножения в бинарного). С учетом инструкций, которые вы предоставили, это похоже на наиболее вероятное решение.

Этот вопрос: How can I multiply and divide using only bit shifting and adding? может поэтому иметь отношение к делу. Реализация shift + add, которая является O (log2 n) в C, представлена ​​в качестве ответа на What is the time complexity of this multiplication algorithm?, но может быть адаптирована к вашему набору инструкций.

Смежные вопросы