1
.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 它将在 6-15 位中添加“1”。然而,事实并非如此。那么将 65427 添加到给定的值会发生什么?编辑:我想一个更好的问题是为什么添加 65472 会提取 6-15 位?或者如果没有,到底发生了什么。

我的第二个问题是关于 LSR。

我之前问这个问题的原因是因为我需要“从位 6:15 中提取纯样本并将其一直移动到寄存器的右侧。” 并将该值添加到不同的寄存器。我应该从寄存器中移出最后 15 位吗?我想我对这种情况下的措辞感到困惑。

4

2 回答 2

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

这意味着,如果值为 0,则 value + mask >> n 提取 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 领域找到这样做的理由。

于 2013-11-12T05:30:59.397 回答
1

要获得某些位(无论平台如何),您通常会执行按位与,然后进行逻辑移位。在您的情况下,十六进制0xFFCO的 6-15 位是 ,最后您需要右移 6 位(假设您希望您的位最后右对齐)。这意味着你会想做

(num & 0xFFC0) >> 6

您需要将其翻译成您自己的语言……</p>

编辑您可以执行此操作的另一种方法是首先右移,然后屏蔽您不想要的位:

(num >> 6) & 0x3FF

因为您只想要底部的 10 位,并且希望其他所有内容都为零。

为了解决您的另一个问题:“添加数字如何提取位”,答案是“它没有”。该AND操作是逻辑(按位)操作,而不是“加法”。简单的例子:

abcdefgh & 0x34 =
abcdefgh & 00111000b =
00cde000

换句话说,逻辑与将保留上述cde数字中的位,并将所有其他位设置为零(在此特定示例中)。我希望这能让你更清楚。

于 2013-11-12T03:53:08.950 回答