按寄存器中的值移位位
Posted
技术标签:
【中文标题】按寄存器中的值移位位【英文标题】:Shifting Bits by Value in Register 【发布时间】:2017-01-24 21:28:29 【问题描述】:我有 %ecx 包含我希望 %esi 的值向左移动的位置数,但据我了解 shl 的来源必须是立即值。
有人可以帮助我了解如何通过 %ecx 的值进行转换吗?我环顾四周,看到人们推荐使用 CL 寄存器。但有替代方案吗?
谢谢。
【问题讨论】:
【参考方案1】:80386 架构提供了一个左移指令,其移位量在%cl
中,用 31 进行 dword 移位,15 用于字移位等。注意%cl
寄存器是最低 8 位%ecx
注册:
0 8 16 32 64
+---------------------------------------------------------------+
| rcx |
+-------------------------------+-------------------------------+
| ecx |
+---------------+---------------+
| cx |
+-------+-------+
| cl | ch |
+-------+-------+
因此,shll %cl,%esi
已经完成了您的预期,并将%esi
的内容移动了%ecx
中指定的位置数,因为高位并不重要(移位量之前被 31 掩盖)移动)。
【讨论】:
...或 64 位寄存器被 63 屏蔽 高位实际上可能对程序很重要,在这种情况下,必须特别注意将结果归零。你可能认为1 << 33
是0
而不是2
。
@Jester 没错。但是,由于 shll 用 31 屏蔽了移位操作数,因此在 ecx 中是否设置了任何高位都无关紧要,因为它们无论如何都会被屏蔽掉。
这正是重点:shl
所做的屏蔽将33
变成1
,从而给出了错误的结果。所以如果你确实想要正确的结果,你必须自己检查。
不是真的,但我该抱怨谁 :) 我发现这具有误导性:“将 %esi 的内容移动了 %ecx 中指定的位置数”。高位对shl
指令无关紧要,但对程序可能。 ecx
很可能是您不知道它是否会小于 32 的计算结果,并且无论如何您都可能期望得到正确的结果。生成 x<<1
而不是 x<<33
是不正确的。以上是关于按寄存器中的值移位位的主要内容,如果未能解决你的问题,请参考以下文章