簡體   English   中英

位運算符(x86 匯編):移位時二進制數據 go 的 rest 在哪里?

[英]Bitwise operators (x86 Assembly): Where does the rest of the binary data go when shifting it?

我知道,當我執行以下匯編 x86 代碼行時:

shrl $31, %eax

如果 EAX 有以下 32 位數據:

10000010000000000000000000000000

然后執行命令shrl $31, %eax結果:

00000000000000000000000000000001

但是,其他位 ( 000001 ) go 在哪里? 它們究竟位於 memory 的什么位置?

這些位被丟棄,因為這就是將它們移出的意思,這就是您要求機器做的事情。 就像在 C 中一樣, u32_var >>= 31; 不會神奇地用移出的位來更新其他位置。

如果您希望它們在某處使用 go,請使用shrd (2 寄存器移位,盡管它只更新其中一個寄存器。要在一對 32 位寄存器 (EDX:EAX) 上執行類似>>= 31uint64_t移位,您需要shrd $31, %edx, %eax / shr $31, %eax )

移位寄存器會導致存儲到 memory 的原因為零,這將是一個瘋狂的設計。 即使將它們轉移到一些臨時寄存器中也會很奇怪,並且需要更寬的桶形移位器才能有效地實現移位。 (其中 x86 需要shrd ,但其他帶有移位指令的 ISA 並不總是具有雙精度移位。當然,8086 沒有 386 shrd,但它也沒有桶形移位器:每個移位計數花費額外的循環。)


x86 指令並非全部可逆。 許多人(比如超過 1 的班次)會丟棄一些信息。 您可以很容易地詢問sub %eax, %eaxxor %eax, %eax將寄存器歸零,或者在or $-1, %eax將其設置為全一。 有些類似notnegxor (使用不同的寄存器)通過重復是可逆的,或者add / sub通過執行另一個是可逆的。 (不過,仍在銷毀舊的 FLAGS。)

移位將最后一位移出 CF ,因此它們始終會破壞 CF 的舊內容(除非移位計數為 0,否則 FLAGS 未修改。x86 是如此的 CISC 傷害。這就是為什么可變計數移位在英特爾上花費 3 uops CPU。>.<)

移位 1 保留輸入寄存器的所有原始位,並且可以通過另一個方向的循環進位( rclrcr )撤消。


相關: https://en.wikipedia.org/wiki/Reversible_computing - 信息論和熱力學。 具體來說, 邏輯可逆性部分討論了如何在不丟棄任何位的情況下計算事物。

當然,我們目前的硅數字邏輯技術使用的功率遠遠超過信息理論最小值,即使它們在計算過程中破壞的信息量(多個數量級)也是如此。 因此,通過您選擇的指令是否破壞信息與功耗完全無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM