16-битное обращение слов с использованием LC-3
Я работаю над заданием, в котором я буду принимать входные данные в двоичном виде и буду хранить обратную сторону в другом адресе. Я работаю с 4-битным словом, пока не смогу разобраться в логике, а затем смогу развернуть его до 16-битного слова, как только все заработает.
Например: 1010100101001011 ==> 1101001010010101
Вот моя методология до сих пор:
слово: 1010 маска: 0001 результат: 0000
1) 1010 и 0001 - И это вместе
result is: 0000
(Я хочу сохранить только младший значащий бит как самый значимый в моем результате)
2) 1010 и 0010 - увеличил мою маску и добавил ее вместе со своим словом
результат: 0010
теперь я бы взял бит на 2-м месте и сохранил его на 4-м месте в моем регистре результатов.
Вот где у меня возникают проблемы при попытке придумать логику, чтобы изолировать один бит, а затем сохранить его в другом месте.
Любые советы или рекомендации будут с благодарностью.
2 ответа
Вот логика в 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, хотя синтезировать |
, <<
а также >>
может быть сложным, учитывая очень ограниченный набор инструкций.
Предполагая, что вы имеете в виду минимальный LC-3, в котором нет инструкции сдвига или деления:
- ДОБАВИТЬ можно использовать для смещения маски влево
- ДОБАВИТЬ можно использовать для смещения результата влево
- Вы можете проверить, является ли AND маски и ввода нулевым или нет
- используйте результат теста, чтобы ДОБАВИТЬ 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 есть много интересных подходов к решению этой и других проблем на битовом уровне.