【问题标题】:Shifting Bits by Value in Register按寄存器中的值移位位
【发布时间】:2017-01-24 21:28:29
【问题描述】:

我有 %ecx 包含我希望 %esi 的值向左移动的位置数,但据我了解 shl 的来源必须是立即值。

有人可以帮助我了解如何通过 %ecx 的值进行转换吗?我环顾四周,看到人们推荐使用 CL 寄存器。但有替代方案吗?

谢谢。

【问题讨论】:

    标签: assembly bit-manipulation x86-64 att


    【解决方案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 是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多