繁体   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