如何读取寄存器中的位范围?

时间:2018-05-19 02:42:31

标签: assembly bit-manipulation

我不知道在哪里提出这个问题,所以如果有人动了这个我明白了。

我们走了。

他们是否可以解压缩单个寄存器的内容?

示例:

比如说你有一个16位的寄存器A,我需要想办法说出

第0 - 5位需要进入注册B.

第6-10位需要进入注册C.

如果它们是一种更简单的方法,可以使用刚刚映射到内存位置的Bit数组,只是指向所需的位,或者是汇编代码中的某些算法可以使用。

如果它对任何人都有帮助,我正在使用Atmel微控制器。

我要求的原因是我想开始开发共享单个数据总线的东西来简化设计。如果我弄清楚如何对数据寄存器进行分区,这可以允许设备发送带有所需数据的消息。

示例:

假设我连接并指定设备在最后8位发送其ID以及微控制器根据该数据做出决定所需的前8位的相关数据。

1 个答案:

答案 0 :(得分:2)

这会是你想要的吗?

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
如果你不确定这是如何工作的,请稍微谷歌。

现在,这是二进制的一个例子:

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"
}
  • (变量&amp; var2)表示变量
  • 中至少有一位为“1”
  • (Var1 | Var2)表示2个变量中的任何一个都为真。
  • (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”的所有位对于Var2将变为“1”,但所有其他位将为0.这是一个按位AND运算,其中结果的每个位仅取决于输入的相应位。 / p>

我不是老师,但这应该足以让你开始。我知道你在Windows中并不需要这么多,但是编程微芯片意味着直接在位上玩很多东西。

再次关于寄存器...只需将它们视为正常变量,但微控制器始终对它们进行读写操作,因此在那里写入值会产生影响,例如闪烁LED或在USART上发送字节/ COM端口。阅读数据表甚至会向您显示某些寄存器是只读的还是只写的,并且通常会详细说明寄存器的作用。如果你像pic或AVR那样编程MCU,你需要了解数据表,它们是你最有价值的工具。