Вопрос по assembly – Сборка LC3 по битам вправо

6

Что мне нужно сделать, это реализовать как побитовый сдвиг влево, так и побитовый сдвиг вправо, используяСборка LC-3, По сути, каждый бит должен быть перемещен на один пробел в направлении сдвига, и ноль заполняет созданное пустое пространство.

Примеры:

Сдвиг вправо:

 01001001
 00100100→

Сдвиг влево:

 01001001
←10010010

Я успешно реализовал сдвиг влево, взяв двоичную строку и добавив ее к себе.

Я озадачен тем, как выполнить сдвиг вправо. Любые мысли будут с благодарностью. У меня есть операции AND, NOT, ADD, операции перемещения данных, семь регистров для хранения значений и весь диапазон памяти. Мне просто нужны основные идеи, как это можно реализовать.

Если вам нужна инструкция по набору инструкций LC-3, естьодин здесь.

Рабочая ссылка для ссылки на LC-3 ISA:cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf Peter Cordes

Ваш Ответ

4   ответа
0

с остальными из них "0". Оба инициализируются в 0000 0000 0000 0001, но один из них смещен влево на величину, которую вы хотите, чтобы исходное число было смещено вправо. Мы назовем это Mask1. Не сдвинутым числом будет Mask2.

Сравните Mask1 с оригинальным номером. If (Mask1 "и" input) & gt; или & lt; 0, "или" Mask2 с выводом и затем сдвигом влево обеих масок.

В любом случае сдвиньте влево обе маски и попробуйте еще раз, пока на входе больше не будет бит для проверки.

LC-3 не имеет побитового «или». Вам придется «не» оба операнда & quot; и & quot; их, тогда "не" результат для побитового "или."

Причина, по которой вы проверяете, используются ли Mask1 и quot; вход & gt; или & lt; 0, потому что если он равен нулю, мы не хотим ничего делать. Если результат «и» этих операндов равен & gt; 0, то это означает, что проверенная позиция нашла "1" и это должно быть напечатано до результата. Если маска была сдвинута влево, чтобы стать 1000 0000 0000 0000, это технически отрицательное число. & Quot; и & quot; этого числа и любого числа с «1» в этой позиции также будет отрицательное число.

Вы можетеadd вместоor если вы знаете, что нет переноса. Это тот случай, потому что вы работаете по одному.
5

R2 так что он имеет только один бит установлен. Затем, если вы делаетеAND с другим регистром и веткой наZ условие, вы проверяете, установлен ли этот бит. Если это так, вы хотите установить предыдущий бит в вашем & quot; результате & quot; регистр.

Если вы затем сдвинете свой однобитный регистр на одно место и повторите цикл, у вас должно получиться то, что вам нужно.

(Прошу прощения, если это расплывчато; так как это, по-видимому, домашнее задание, я стараюсь не давать вам просто ответ)

Edit:

Итак, предположим, что ваш ввод - 01001011. Вы начинаете с выхода 00000000, маски ввода 00000010 и маски вывода 00000001. Вы делаете AND и обнаруживаете, что он ненулевой, поэтому вы добавляете свою выходную маску к выходу. Затем вы сдвигаете обе маски, чтобы получить 00000100 и 00000010.

В следующий раз в цикле AND будет равно нулю, поэтому вы ничего не добавляете и так далее. Цикл заканчивается, когда смещение маски обнуляет ее.

Это не совсем "грубая сила"; это всего лишь 9 строк кода, включая настройку.
Это может сработать, но мне кажется, что должно быть проще его реализовать (например, добавить его себе в левую смену). Вы правы, что это домашняя работа, и она должна быть в эту среду (11 апреля), поэтому У меня есть пара дней, чтобы найти лучшее решение, прежде чем я "грубой силой" это с таким подходом. Will Haynes
0

вы можете просто разделить на 2, вычитая снова и снова.

Так что посчитайте, как часто вы можете добавлять RX, RX, # -2

Я уверен, что есть способ обойти ведущего 1.

способ обойти напоминание 1 будет и регистр с 0xFE до деления. но это решение выглядит очень медленным для меня
1

Если у вас есть 256 байт доступной памяти, то вам может подойти таблица поиска.

Вы можете сделать это без памяти данных, используя цикл по каждой позиции бита, используяAND извлечь бит.

Можете ли вы взглянуть на это?stackoverflow.com/questions/30017878/where-is-32768-coming-from

Похожие вопросы