Assembly 按位运算符(x86汇编):移位二进制数据时,其余的二进制数据去哪里?

Assembly 按位运算符(x86汇编):移位二进制数据时,其余的二进制数据去哪里?,assembly,x86,bit-manipulation,bit-shift,Assembly,X86,Bit Manipulation,Bit Shift,我知道当我执行以下一行汇编x86代码时: shrl $31, %eax 如果EAX具有以下32位数据: 10000010000000000000000000000000 然后执行命令shrl$31,%eax将导致: 00000000000000000000000000000001 但是,其他位(000001)去哪里了?它们在内存中的具体位置是什么?这些位被丢弃,因为将它们移出意味着什么,这就是您要求机器执行的操作。就像在C中一样,u32\u var>>=31不会神奇地用移位的位更新其他位置

我知道当我执行以下一行汇编x86代码时:

shrl $31, %eax
如果EAX具有以下32位数据:

10000010000000000000000000000000
然后执行命令shrl$31,%eax将导致:

00000000000000000000000000000001

但是,其他位(
000001
)去哪里了?它们在内存中的具体位置是什么?

这些位被丢弃,因为将它们移出意味着什么,这就是您要求机器执行的操作。就像在C中一样,
u32\u var>>=31不会神奇地用移位的位更新其他位置

如果您想让它们移动到某个地方,请使用(2寄存器移位,尽管它只更新其中一个寄存器。要在一对32位寄存器(EDX:EAX)上执行
uint64\t
移位,如
>=31
,您需要
shrd$31,%EDX,%EAX
/
shr$31,%EAX

没有理由说移位寄存器会导致存储到内存,这是一个疯狂的设计。即使将它们转移到一些临时寄存器中也会很奇怪,需要一个更宽的桶移位器来有效地执行移位。(x86需要
shrd
,但其他带有移位指令的ISA并不总是具有双精度移位。当然,8086没有386 shrd,但它也没有桶形移位器:每次移位计数都需要额外的周期。)


x86指令并非都是可逆的。许多人(比如超过1次的轮班)会丢弃一些信息。您可以同样轻松地询问在
sub%eax,%eax
xor%eax,%eax
将寄存器归零后,或在
或$-1之后,将其设置为所有1。像
not
neg
xor
(使用不同的寄存器)这样的函数可以通过重复来可逆,或者
add
/
sub
可以通过执行另一个函数来可逆。(但仍在销毁旧国旗。)


移位会将CF中的最后一位移出,因此它们总是会破坏CF中的旧内容(除非移位计数为0,否则标志不会被修改。x86是如此的CISC,它会带来伤害。这就是为什么可变计数移位在Intel CPU上花费3 UOP。>.这些位被丢弃,因为这就是移位的意思,这就是你要求机器做的。就像在C中,
u32_var>=31;
不会神奇地更新其他位置。)随着位的移出,数据被删除

如果您想让它们移动到某个地方,请使用(2寄存器移位,尽管它只更新其中一个寄存器。要在一对32位寄存器(EDX:EAX)上执行
uint64\t
移位,如
>=31
,您需要
shrd$31,%EDX,%EAX
/
shr$31,%EAX

没有理由说移位寄存器会导致存储到内存,这将是一种疯狂的设计。即使将它们移位到某个临时寄存器中也会很奇怪,需要更宽的桶移位器来有效地实现移位。(x86需要
shrd
,但其他带有移位指令的ISA并不总是具有双精度移位。当然,8086没有386 shrd,但它也没有桶形移位器:每次移位计数都需要额外的周期。)


x86指令并非都是可逆的。很多(如移位超过1)丢弃一些信息。您可以很容易地询问在
sub%eax,%eax
异或%eax,%eax
将寄存器归零后,或在
或$-1之后,将其设置为所有1,%eax
设置为所有1。有些类似于
not
neg
异或
(使用不同的寄存器)可以通过重复来可逆,或者通过执行另一个操作来可逆(尽管仍在销毁旧标志)


移位会将CF中的最后一位移出,因此它们总是会破坏CF中的旧内容(除非移位计数为0,否则标志将不被修改。x86是如此的CISC,它会带来伤害。这就是为什么可变计数移位在Intel CPU上花费3 UOP的原因。>.Huh?不是这样。
mov
覆盖目标,而
31
不是
1
。无论以前在
eax
中是什么,它都将变成
00000000。)00000000 00000000 0001111
@Jester更新了我的代码,它是一个输入错误:D。我们也会修复另一个:D但是是的,移位的位已经消失了,除了最后一个进入进位的位。如果你想要那些“移位”的位,也许你对熵感兴趣。它们是熵。理论上,计算机操作可以使用任意小的能量,只要它们是非破坏性的。一旦信息丢失(例如,当需要将寄存器重置为零时),熵必须增加。嗯?那不是发生的事。
mov
覆盖了目的地,
31
不是
1
。不管以前在
eax
中是什么,它都会变成
0000000000000000000000000001111
@Jester更新了我的代码,这是一个打字错误:D。我们也会修复另一个:D但是的,除了最后一个进入进位的位元外,被移出的位元都消失了。如果你想要那些被移出的位元,也许你对熵感兴趣。它们变成了熵。理论上,计算机操作可以使用任意小的能量,只要它们是非破坏性的。一旦信息丢失(例如,当需要将寄存器重置为零时),必须增加熵。