正如標題中提到的,我在 x86 程式集上遇到了 BEXTR(位提取)指令,但我似乎無法理解它是如何作業的。
在網上看了一段時間后,我什至發現了一個(src >> start) & ((1 << len) -1)我似乎也無法真正理解的假設的 C 等價物。
誰能向我解釋 BEXTR 指令的作業原理?這些位是如何提取的?
uj5u.com熱心網友回復:
一張圖片可能會有所幫助。假設起始位是 5,長度是 9。那么如果我們有
Input : 11010010001110101010110011011010 = 0xd23aacda
|-------|
\
\
\
v
|-------|
Output: 00000000000000000000000101100110 = 0x00000166
所需的位塊進入輸出的最低有效位,輸出的其余位變為 0。
uj5u.com熱心網友回復:
這些位是如何提取的?
我們真的不需要知道這些位是如何提取的,因為這可能因實作而異。我們需要知道的是提取了哪些位。
通常,位域是位域前后可能被不需要的位包圍的連續位集。因此,我們的想法是移除那些不需要的位并移動感興趣的位欄位的連續位以進行右對齊。
該 C 公式分解為以下組件:
首先,src >> start將位移到位start位置 0,有效地右對齊感興趣的位域。這既將感興趣的位域移動到適當的右對齊位置,也消除了不感興趣的較低位(重要性較低的位,即低于所需位域的位)。
剩下要做的就是從length. 為此,該公式創建了我們所說的掩碼。首先,1<<len通過向左移動 1(2 的最低冪)來生成 2 的冪值。因此,數字看起來像 1 后跟len零的數量(例如,對于 len=3,然后是 ..001000)。從 2 的冪中減去 1 會生成一個連續 1 的掩碼(例如 001000-1=000111),這里的len位計數為 1。該掩碼應用于移位的結果,以去除不在感興趣的位欄位中的任何不需要的高階位(更高重要性的位)。
C 中的另一種方法是從左移到左對齊位域,然后將右移到右對齊位域。這種移位消除了任何不需要的高位和低位,同時使位域右對齊,因為這是最后一次移位。這種方法還可以通過進行右移算術與邏輯運算來提取有符號和無符號位欄位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374961.html
上一篇:組裝:如何比較不同符號的數量?
下一篇:如何在裝配中找到負值的總和?
