Как читать битовые диапазоны в регистре? - PullRequest
0 голосов
/ 19 мая 2018

Я не знаю, где разместить этот вопрос, поэтому, если кто-то двигает это, я понимаю.

Вот и мы.

Это способ распаковать содержимое одного регистра?

Пример:

Скажем, например, что у вас есть 16-битный регистр A, мне нужно найти способ сказать

Биты 0 - 5 нужно перейти в регистрB.

Биты 6 - 10 должны перейти в регистр C.

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

Если это кому-нибудь пригодится, я работаю с микроконтроллерами Atmel.

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

Пример:

Скажите, что я подключаюсь и указываю, что устройство отправляет свой идентификатор для последних 8 бит и соответствующие данные для первых 8 бит, необходимых для микроконтроллера, чтобы принять решение на основе этогоданные.

1 Ответ

0 голосов
/ 25 мая 2018

Будет ли это то, что вы ищете?

Register_B = Register_A & 0x003F; // take the 6 LSB  ( bits 0-5 )
Register_C = Register_A & 0x07C0; // take the bits 6-10
Register_C = (Register_A & 0x07C0) >> 6; // Or maybe you want to place these bits elsewhere using bit shift ?

Вот дополнительные пояснения по использованию битов в C. В основном для микроконтроллеров, но точно так же можно использовать в Windows, кроме васне используйте регистры напрямую в Windows.
Десятичное число 5 = двоичное 0000 0101 = шестнадцатеричное 0x05 Десятичное число 16 = шестнадцатеричное 0x10
Если вы не знаете, как это работает, немного погуглите в Google.

Теперь этот пример в двоичном виде:

x = (5 << 1);
5       = 0000 0101
5 << 1  = 0000 1010  ( same sa 5, but bits are shifted left by 1 )
5 << 2  = 0001 0100  ( 5 shifted by 2 bits to the left. )

Наконец, вы также можете сравнивать биты битов «MASK»: этот код показывает, как сравнивать биты.

x = 5;
if( x & 0x01)
{  .. code here is executed because at least 1 bit from "0x01" is present in "decimal 5"
}
  • (переменная & var2) означает, что хотя бы один бит равен 1 в обеих переменных
  • (Var1 | Var2) означает, что любая из 2 переменных имеет значение true.
  • (Var1 ^ Var2) означает, что по крайней мере один бит равен «1» в одной переменной и «0» в другой.В принципе, если Var1 отличается от Var2, это будет верно.

Вы также можете MASK биты:

Var1 = 254;  // all 8 bits are "1" except the least significant bit which is 0.
Var2 = Var1 & 0x0F;  // 0x0F = only last 4 bits "1".

В этом случае Var2 будет заканчиваться на 0000 1110, потому что1111 1110 & 0000 1111 дает этот результат.Все биты, которые равны «1» в обоих значениях, станут равными «1» для Var2, но все остальные будут равны 0. Это побитовая операция И, где каждый бит результата зависит только от соответствующих битов входов.

Я не учитель, но этого должно быть достаточно, чтобы вы начали.Я знаю, что вам не нужно это много в Windows, но программирование микрочипа означает много играть с битами напрямую.

Снова о регистрах ... просто думайте о них как о обычных переменных, но микроконтроллер читает и пишетдля них все время, поэтому запись значения может иметь эффект, например мигание светодиода или отправка байта на порт USART / COM.Чтение таблицы данных даже покажет вам, что некоторые регистры предназначены только для чтения или только для записи, и, как правило, подробно объясняет, что делает регистр.Если вы программируете MCU, например, pic или AVR, вам необходимо понять спецификацию, это ваш самый ценный инструмент.

...