【问题标题】:arm bit extraction and logical shift confusion臂位提取和逻辑移位混淆
【发布时间】:2013-11-12 03:48:05
【问题描述】:
.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 位吗?我想我对这种情况下的措辞感到困惑。

【问题讨论】:

  • 你的老师显然停止了 armv5 的编程。较新的 arm 架构具有诸如 ubfx 之类的指令,可以单独完成这项工作。

标签: assembly arm


【解决方案1】:

考虑较小的值:

   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 提取的内容;进位(即表达式 (bitfield != 0))可以添加表达式 add r0,r0,r6 LSR #16

相反,添加了两个位,权重为 2 的进位,以及“表达式的新符号位 (bitfield - 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 领域找到这样做的理由。

【讨论】:

  • 我认为他对目的感到困惑。正如您所展示的,如果在该字段中设置了任何位,我们将执行。移位只是对执行进行规范化,因此可以将其添加到 R0 作为 1 或 0。
  • +1 试图解决问题中最令人困惑的部分(我绕过了......)
【解决方案2】:

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

(num & 0xFFC0) >> 6

您需要将其翻译成您自己的语言……

编辑另一种方法是先右移,然后屏蔽不需要的位:

(num >> 6) & 0x3FF

因为您只想要低 10 位,而希望其他一切都为零。

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

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

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

【讨论】:

  • 根据我老师的代码,只需将 6-15 位添加到某个数据的值中,就可以让我只使用该某些数据的 6-15 位。在这种情况下没有必要进行逻辑转变,我只是对它为什么起作用感到困惑。我已经完成了一个不同的实验室,其中包含我发布的相同代码,并且效果很好。
  • 如果您查看 Aki 的答案,您会看到添加掩码将允许您测试(在单个操作中)是否设置了 6-15 位之一(如果您测试溢出,则使用 16 位整数)。但是如果你想用所有的位做某事,很难看出 ADD 而不是 AND 是如何给出你想要的结果的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2023-01-09
  • 2014-12-04
相关资源
最近更新 更多