x86中的BEXTR指令是如何工作的

How does the BEXTR instruction in x86 work

如标题所述,我在 x86 汇编上遇到了 BEXTR(位提取)指令,但我似乎无法理解它是如何工作的。

在网上看了一段时间后,我什至发现了一个假设的 C 等价物 (src >> start) & ((1 << len) -1),我似乎也不太理解。

谁能给我解释一下 BEXTR 指令是如何工作的?这些位是如何提取的?

How are the bits extracted?

我们真的不需要知道这些位是如何提取的,因为这可能因实现而异。我们只需要知道提取了哪些位。

通常,位域是一组连续的位,可能在位域前后被不需要的位包围。因此,我们的想法是删除那些不需要的位并将感兴趣的位字段的顺序位移动到右对齐。

该 C 公式分解为如下组件:

首先,src >> start 将位 start 移动到位位置 0,有效地右对齐感兴趣的位字段。这既将感兴趣的位域移动到正确的右对齐位置,也消除了不感兴趣的较低位(重要性较低的位,即低于想要的位域)。

剩下要做的就是从 length 上方去除任何不需要的位。为此,该公式创建了我们所说的掩码。首先,1<<len 通过向左移动 1(2 的最低次方)来生成二次方值。因此,数字看起来像 1 后跟 len 个零(例如,对于 len=3,然后是 ..001000)。从 2 的幂中减去 1 得到连续 1 的掩码(例如 001000-1=000111),这里是计数中的 len 位 1。该掩码应用于移位后的结果,以删除不在感兴趣的位字段中的任何不需要的高阶位(具有更高重要性的位)。


C 中的另一种方法是将位域从左移到左对齐,然后将位域从右移到右对齐。这种移位消除了任何不需要的高位和低位,同时使位字段右对齐,因为这是最后一次移位。这种方法还可以提取有符号和无符号位字段,通过右移算术与逻辑。

图片可能会有所帮助。假设起始位是 5,长度是 9。那么如果我们有

Input : 11010010001110101010110011011010 = 0xd23aacda
                          |-------|
                              \
                               \
                                \
                                 v
                               |-------|
Output: 00000000000000000000000101100110 = 0x00000166

所需的位块进入输出的最低有效位,输出的其余位变为 0。