臂位提取和逻辑移位混淆

时间:2013-11-12 03:48:05

标签: assembly arm

.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位移出寄存器吗?我想我对这种情况下的措辞感到困惑。

2 个答案:

答案 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,并将所有其他位设置为零(在此特定示例中)。我希望能让你更清楚。