Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何将位范围读入寄存器?_Assembly_Bit Manipulation - Fatal编程技术网

Assembly 如何将位范围读入寄存器?

Assembly 如何将位范围读入寄存器?,assembly,bit-manipulation,Assembly,Bit Manipulation,有没有办法将单个寄存器的内容解包 例如,假设您有一个16位寄存器a。我需要找出一种方法来表示: 位0-5需要转到寄存器B 位6-10需要转到寄存器C 如果有一种更简单的方法可以使用只映射到内存位置并指向所需位的位数组,或者在汇编代码中有一些算法可以工作吗 我正在使用Atmel微控制器 我想开始开发共享一条数据总线的东西,以简化设计。如果我知道如何对数据寄存器进行分区,这将允许设备发送包含所需数据的消息 例如,我连接并指定一个设备发送其最后8位的ID和微控制器根据该数据做出决策所需的前8位的相

有没有办法将单个寄存器的内容解包

例如,假设您有一个16位寄存器a。我需要找出一种方法来表示:

  • 位0-5需要转到寄存器B
  • 位6-10需要转到寄存器C
如果有一种更简单的方法可以使用只映射到内存位置并指向所需位的位数组,或者在汇编代码中有一些算法可以工作吗

我正在使用Atmel微控制器

我想开始开发共享一条数据总线的东西,以简化设计。如果我知道如何对数据寄存器进行分区,这将允许设备发送包含所需数据的消息


例如,我连接并指定一个设备发送其最后8位的ID和微控制器根据该数据做出决策所需的前8位的相关数据。

这可能是您正在寻找的:

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.)
  • (variable&var2)表示两个变量中至少有一位为“1”
  • (Var1 | Var2)表示这两个变量中的任何一个都为真
  • (Var1^Var2)表示至少有一位在一个变量中为“1”,在另一个变量中为“0”。基本上,如果Var1与Var2不同,这将是正确的
您还可以屏蔽位:

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
结束,因为
1111110&0000 1111
给出了该结果。对于Var2,两个值中都为“1”的所有位都将变为“1”,但所有其他位都将为0。这是一种按位AND运算,其中结果的每一位仅取决于输入的对应位

我知道你在Windows中不需要太多,但对微芯片编程意味着直接使用比特


关于注册再次。。。只需将其视为正常变量,但微控制器一直在读取和写入它们,因此在其中写入值可能会产生影响,就像闪烁LED或在USART/上发送字节一样。阅读数据表甚至会向您显示一些寄存器是只读或写只读的,并且通常会详细解释寄存器的作用。如果您像or一样编程MCU,则需要了解数据表。它们是您最有价值的工具。

您知道如何将寄存器A中的所有位复制到寄存器B中吗?这样做之后,您是否知道如何清空除0-5之外的所有位?您是否考虑了特定的体系结构?8080有8位寄存器,称为A、B和C(以及D、E、H和L:)。几乎所有的体系结构都有指令和指令,但一些玩具体系结构(如LC-3)没有正确的转换。无论如何,看看C编译器输出的位字段提取,例如对于
structfoo{unsignedA:6,b:5;}在您想要的任何体系结构上。您将看到ARM
ubfx
,或x86 shift/and(或
bextr
),或PowerPC
rlwinm
Ok谢谢!这个问题有一个普遍的例子,我想你知道我在找什么。我只需要以一种通用的方式来完成这些步骤,这样我就可以将您所做的应用于任何情况。你能把你的答案扩大一点吗,你的答案在正确的轨道上,我只是需要更多的指导。我提出的问题是,例如,谢谢。好的,这里有一个关于比特的小教训。。。查看我的其他答案,这样我可以更轻松地格式化答案。
Var1 = 254;  // All 8 bits are "1" except the least significant bit which is 0.
Var2 = Var1 & 0x0F;  // 0x0F = only last 4 bits "1".