【发布时间】:2017-01-24 21:28:29
【问题描述】:
我有 %ecx 包含我希望 %esi 的值向左移动的位置数,但据我了解 shl 的来源必须是立即值。
有人可以帮助我了解如何通过 %ecx 的值进行转换吗?我环顾四周,看到人们推荐使用 CL 寄存器。但有替代方案吗?
谢谢。
【问题讨论】:
标签: assembly bit-manipulation x86-64 att
我有 %ecx 包含我希望 %esi 的值向左移动的位置数,但据我了解 shl 的来源必须是立即值。
有人可以帮助我了解如何通过 %ecx 的值进行转换吗?我环顾四周,看到人们推荐使用 CL 寄存器。但有替代方案吗?
谢谢。
【问题讨论】:
标签: assembly bit-manipulation x86-64 att
80386 架构提供了一个左移指令,其移位量在%cl 中,用 31 进行 dword 移位,15 用于字移位等。注意%cl 寄存器是最低 8 位%ecx注册:
0 8 16 32 64
+---------------------------------------------------------------+
| rcx |
+-------------------------------+-------------------------------+
| ecx |
+---------------+---------------+
| cx |
+-------+-------+
| cl | ch |
+-------+-------+
因此,shll %cl,%esi 已经完成了您的预期,并将%esi 的内容移动了%ecx 中指定的位置数,因为高位并不重要(移位量之前被 31 掩盖)移动)。
【讨论】:
1 << 33 是0 而不是2。
shl 所做的屏蔽将33 变成1,从而给出了错误的结果。所以如果你确实想要正确的结果,你必须自己检查。
shl 指令无关紧要,但对程序可能。 ecx 很可能是您不知道它是否会小于 32 的计算结果,并且无论如何您都可能期望得到正确的结果。生成 x<<1 而不是 x<<33 是不正确的。