Сборка LC3 Побитовый сдвиг вправо

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

Примеры:

Правый Shift:

 01001001
 00100100→

Левый "шифт:

 01001001
←10010010

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

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

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


person Will Haynes    schedule 09.04.2012    source источник
comment
Рабочая ссылка на ISA-ссылку LC-3: cs. utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf   -  person Peter Cordes    schedule 01.11.2017


Ответы (4)


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

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

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

Изменить:

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

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

person Russell Zahniser    schedule 09.04.2012
comment
Это могло бы сработать, но мне кажется, что должно быть проще реализовать это (например, добавить его в левую смену). Вы правы, что это домашнее задание, и оно должно быть выполнено в эту среду (11 апреля), поэтому у меня есть пару дней, чтобы найти лучшее решение, прежде чем я перебью его с помощью этого подхода. - person Will Haynes; 10.04.2012
comment
Это не совсем грубая сила; это всего лишь 9 строк кода, включая настройку. - person Russell Zahniser; 10.04.2012

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

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

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

person Oliver Charlesworth    schedule 09.04.2012
comment
Вы можете взглянуть на это? stackoverflow.com/questions/30017878/where-is-32768 -входящий-от - person committedandroider; 03.05.2015

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

Сравните Mask1 с исходным номером. Если (Mask1 и input)> или ‹0, или« Mask2 с выходом », а затем сдвинуть обе маски влево.

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

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

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

person user3054804    schedule 01.12.2013
comment
Вы можете add вместо or, если знаете, что нет переноса. Это так, потому что вы работаете по частям. - person Peter Cordes; 01.11.2017

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

Так посчитайте, как часто вы можете ДОБАВЛЯТЬ RX, RX, # -2

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

person meüto    schedule 10.02.2015
comment
способ обойти напоминание 1 было бы, чтобы и регистр с 0xFE перед делением. но для меня это решение выглядит очень медленным - person Tommylee2k; 10.03.2016