6

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

Что мне нужно сделать, это реализовать как побитовый сдвиг влево, так и побитовый сдвиг вправо, используяСборка LC-3 [http://highered.mcgraw-hill.com/sites/dl/free/0072467509/104653/PattPatelAppA.pdf] , По сути, каждый бит должен быть перемещен ...

Рабочая ссылка для ссылки на LC-3 ISA:<a href="http://www.cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf" rel="nofollow noreferrer">cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf</a>

от Peter Cordes

4 ответа

0

Предполагая ведущий 0, вы можете просто разделить на 2, вычитая снова и снова.

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

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

1

Вау, это довольно минимальный набор инструкций.

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

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

5

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

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

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

Edit:

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

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

0

Вам нужны две маски. Оба они являются одним «1»; с остальными из них "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» в этой позиции также будет отрицательное число.

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