有没有理由为什么应该使用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位寄存器甚至在文档这样的地方使用,其中cl
和ecx
之间的差异对代码示例的正确性没有影响。例如,在this link。
答案 0 :(得分:5)
在x86架构上,您只能移动并旋转1,立即值或寄存器cl
。没有其他可能性可编码。因此,所有移位可变量的代码总是使用cl
寄存器来获取移位量。选择cl
是因为移位量永远不需要超过通用寄存器的大小(当时为16)。