按寄存器中的值移位位

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 << 330 而不是2 @Jester 没错。但是,由于 shll 用 31 屏蔽了移位操作数,因此在 ecx 中是否设置了任何高位都无关紧要,因为它们无论如何都会被屏蔽掉。 这正是重点:shl 所做的屏蔽将33 变成1,从而给出了错误的结果。所以如果你确实想要正确的结果,你必须自己检查。 不是真的,但我该抱怨谁 :) 我发现这具有误导性:“将 %esi 的内容移动了 %ecx 中指定的位置数”。高位对shl 指令无关紧要,但对程序可能。 ecx 很可能是您不知道它是否会小于 32 的计算结果,并且无论如何您都可能期望得到正确的结果。生成 x<<1 而不是 x<<33 是不正确的。

以上是关于按寄存器中的值移位位的主要内容,如果未能解决你的问题,请参考以下文章

设计四位移位寄存器shifter_4

为啥这个 PIC 汇编代码中的位不移位?

C语言实验二——位运算

如何知道在LDRH指令中哪些半字位(8位)要移位到Rd(目标寄存器)?

寄存器

基于51单片机定时器计数+74HC595移位寄存器+8位数码管时钟