是否有理由指定8位寄存器的移位?

时间:2017-04-12 01:16:07

标签: assembly x86

有没有理由为什么应该使用8位寄存器而不是32位寄存器来指定移位?我已经看过几次x86代码,如下所示:

movl %ebx, %ecx
sall %cl,  %edx

由于这只使用ecx的低8位,我会将其转换为(在C代码中):

ebx = ecx;
edx = edx << (ecx % 256);

似乎更容易说:

movl %ebx, %ecx
sall %ecx, %edx

我已经看到8位寄存器甚至在文档这样的地方使用,其中clecx之间的差异对代码示例的正确性没有影响。例如,在this link

1 个答案:

答案 0 :(得分:5)

在x86架构上,您只能移动并旋转1,立即值或寄存器cl。没有其他可能性可编码。因此,所有移位可变量的代码总是使用cl寄存器来获取移位量。选择cl是因为移位量永远不需要超过通用寄存器的大小(当时为16)。