.set AD0GDR, 0xE0034004
...
bitextract: .int 65472
...
LDR r3, =(AD0GDR)
LDR r4, [r3]
/*load #65472 into r5 that will be used to extract bits 6-15*/
LDR r5, =(bitextract)
ADD r6, r4, r5 // extracts bits 6-15 and stores into r6
ADD r0, r0, r6, LSR #15 // shift r6 bites off and add into r0
我是ARM的新手,无法在任何地方找到确切的答案。 我试图从我给出的一些数据中只提取一定数量的位,特别是位6-15。位6-15的十进制数是65427。
根据先前的想法,将65472添加到我给出的值,在本例中为AD0GDR,即3758309380,为3758374852.
现在,我的理解是,在二进制等效的答案中,通过添加65472,它将把“1”放在第6-15位。然而,事实并非如此。那么通过在给定的值中添加65427会发生什么? 编辑:我想一个更好的问题是为什么添加65472提取位6-15?或者如果没有,究竟发生了什么。
我的第二个问题是LSR。
我之前提出这个问题的原因是因为我需要“从第6:15位提取纯样本并将其一直移到寄存器右侧。”并将该值添加到其他寄存器。我应该将最后15位移出寄存器吗?我想我对这种情况下的措辞感到困惑。
答案 0 :(得分:2)
考虑较小的值:
000 101 xxx 000 010 xxx 000 000 xxx
+ 000 111 000 + 000 111 000 + 000 111 000
-------------- vs. ------------ vs. ------------
1 100 xxx 1 001 xxx 0 111 xxx
这意味着,该值+掩码>> n,如果值为0则提取0,如果值为非零则提取1。前提条件是感兴趣的值左侧没有非零位。一种可能的解释是,所讨论的操作实际上是AND而不是ADD。
编辑:即使添加掩码导致半进位,但这不是,LSR#15提取的内容;进位(即表达式(位域!= 0))可以加上表达式add r0,r0,r6 LSR #16
相反,添加两位,携带权重2,以及“表达式的新符号位(位域-1)”。或者以表格形式:
BF as int C BF+M LSR #2
000 = 0 (0) (0) 111 + 1
001 = 1 (1) (1) 000 + 2
010 = 2 (2) (1) 001 + 2
011 = 3 (3) (1) 010 + 2
100 = 4 (-4) (1) 011 + 2
101 = 5 (-3) (1) 100 + 3
110 = 6 (-2) (1) 101 + 3
111 = 7 (-3) (1) 110 + 3
我很害怕,但我无法从采样定理或DSP领域找到理由。
答案 1 :(得分:1)
要获得某些位(无论平台如何),您通常会按位进行AND,然后进行逻辑移位。在你的情况下,十六进制的6-9位是0xFFCO
,你需要在最后向右移6位(假设你希望你的位在末尾右对齐)。这意味着你会想要
(num & 0xFFC0) >> 6
您需要将其翻译成您自己的语言......
编辑另一种方法是首先右移,然后屏蔽你不想要的位:
(num >> 6) & 0x3FF
因为你只需要最后10位,并希望其他所有内容都为零。
要解决您的另一个问题:“如何添加数字提取位”,答案是“它没有”。 AND
操作是逻辑(按位)操作,而不是“添加”。简单的例子:
abcdefgh & 0x34 =
abcdefgh & 00111000b =
00cde000
换句话说,逻辑AND将保留上面数字中的位cde
,并将所有其他位设置为零(在此特定示例中)。我希望能让你更清楚。