Обращение 16-битного слова с использованием LC-3

Я работаю над назначением, при котором я буду вводить двоичные данные и сохранять обратную сторону по другому адресу. Я работаю с 4-битным словом, пока не смогу понять логику, а затем смогу расширить ее до 16-битного слова, когда все заработает.

Например: 1010100101001011 ==> 1101001010010101

Вот моя методика на данный момент:

слово: 1010 маска: 0001 результат: 0000

1) 1010 и 0001 - И это вместе

 result is: 0000 

(Я хочу иметь возможность хранить только наименее значимый бит как наиболее значимый в моем результате)

2) 1010 & 0010 - Увеличил мою маску и сложил ее вместе с моим словом

результат: 0010

теперь я бы взял бит на место 2 и сохранил его на месте 4 в моем регистре результатов.

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

Будем очень признательны за любые советы или рекомендации.


person Mike    schedule 28.10.2012    source источник
comment
Вы хотите полностью перевернуть 16-битное слово? Вам, вероятно, следует привести пример ввода / вывода, чтобы прояснить это, например 1011001011100011 = ›1100011101001101, правильно ли я понял вопрос?   -  person Paul R    schedule 29.10.2012
comment
Да вы правы. Я буду использовать маску для перемещения по слову и использовать функцию И для просмотра изолированной битовой позиции. То, с чем я борюсь, - это придумывать логику или выяснять способ сохранить это в моем регистре результатов. Мне нужно было бы выяснить, как просто отправить один бит в определенной позиции в результате того, что я сложил свое слово AND с моей маской, а затем сохранил его в моем регистре результатов: bit0 - ›bit15, bit1 -› bit 14 и т. Д. .   -  person Mike    schedule 29.10.2012


Ответы (2)


Предполагая, что вы имеете в виду минимальный LC-3, в котором нет инструкции сдвига или деления:

  • ADD можно использовать для смещения маски влево.
  • ADD можно использовать для смещения результата влево
  • вы можете проверить, является ли И маски и ввода нулем или нет
  • используйте результат теста, чтобы ДОБАВИТЬ 0 или 1 к результату после его сдвига влево

Здесь C-исполнение

uint16_t reverse16 (uint16_t input)
{
    uint16_t result = 0u;
    uint16_t mask = 1u;
    int i;

    for (i= 0; i < 16; i++)
    {
        result = result + result;
        if (0u != (input & mask))
        {
            result += 1u;
        }
        mask = mask + mask;
    }
    return result;
}

На сайте bithacks есть много интересных подходов к этой и другим проблемам битового уровня.

person Doug Currie    schedule 28.10.2012

Вот логика на C для наивной (но простой для понимания) реализации обращения битов в 16-битном слове:

uint16_t w = 0xb2e3;         // our 16 bit word
uint16_t mask0 = 0x0001;     // mask for LS bit
uint16_t mask1 = 0x8000;     // mask for MS bit
uint16_t shift = 15;         // distance between high and low bit positions

for (int b = 0; b < 8; ++b)  // for each pair of low/high bits
{
    uint16_t b0 = w & mask0; // get low bit
    uint16_t b1 = w & mask1; // get high bit
    w &= ~(mask0 | mask1);   // clear low/high bit in word
    b0 <<= shift;            // swap bit positions
    b1 >>= shift;
    w |= (b0 | b1);          // insert swapped bits back into word
    mask0 <<= 1;             // update masks for next pair of bits
    mask1 >>= 1;
    shift -= 2;              // update distance for next pair of bits 
}

printf("%#x\n", w);          // w should now contain 0xc74d

Тестовый код: http://ideone.com/GgbzHw

Преобразование вышеуказанного цикла в LC3 должно быть достаточно простым, хотя синтез |, << и >> может оказаться сложной задачей, учитывая очень ограниченный набор инструкций.

person Paul R    schedule 28.10.2012
comment
Большое спасибо за то, что нашли время, чтобы найти это и предоставить мне полезную информацию. Я изучал ветки и то, как они работают. Поправьте меня, если я ошибаюсь, но я вижу, как это работает. Например: AND R3, R2, R1 (вставьте здесь новую строку) BRz # 1 BRp # 2 Теперь первая инструкция BR будет смотреть на результат предыдущей строки и, если он ложный, переместится на следующую строку? Или мне придется разбивать операторы ветки? - person Mike; 29.10.2012
comment
Вот хороший пример реализации цикла for: cs.colostate. edu / ~ fsieker / misc / CtoLC3.html - он использует BRzp для ветки теста цикла. Возможно, вы сможете сделать что-то более простое для случая, когда вы просто повторяете 8 раз, как указано выше. - person Paul R; 29.10.2012