我总是想知道一些CPU具有旋转指令的目的是什么(例如,ROL,x86上的RCL)。什么样的软件使用这些说明?我首先想到它们可能用于加密/计算哈希码,但这些库通常用C编写,它没有映射到这些指令的运算符。
有没有人找到他们的用途?为什么他们添加到指令集中?
答案 0 :(得分:24)
跨多个字的位移需要旋转。当SHL低位字时,高位位溢出到进位中。要完成操作,您需要在将进位输入低位时移位较高的字。 RCL是完成此任务的指令。
High word Low word CF Initial 0110 1001 1011 1001 1100 0010 0000 1101 ? SHL low word 0110 1001 1011 1001 1000 0100 0001 1010 1 RCL high word 1101 0011 0111 0011 1000 0100 0001 1010 1
ROL和ROR对于以(最终)非破坏性的方式逐位检查值非常有用。它们还可以用来分流位掩码,而不会引入垃圾位。
答案 1 :(得分:16)
旋转移位操作码ROL,RCL,ROR,RCR几乎专门用于散列和CRC计算。它们非常神秘,很少使用。
移位操作码(SHL,SHR)用于以2的幂进行快速乘法,或将低字节移入大寄存器的高字节。
ROL和SHL之间的差异是ROL取高位并将其滚动到低位位置。 SHL抛出高位并用零填充低位位置。
答案 2 :(得分:8)
ROR ROL是“历史性的”,但在许多方面仍然有用。
在80386(和操作码BT)之前,ROL将被用于测试一点(SHL不会传播到进位标志) - 实际上在8088,ROR / ROL一次只能移位1位!!!!
此外,如果您想要移动一种方式然后另一种方式而不会丢失已经移出范围的位,则使用ROR / ROL而不是SHR / SHL
答案 3 :(得分:3)
如果我理解正确,你的问题是:
“鉴于旋转指令似乎非常特殊且不是由编译器发出的,它们何时实际使用以及为什么它们包含在CPU中?”。
答案是双重的:
CPU并非专门用于执行C程序。相反,它们被设计为通用机器,旨在使用各种不同的工具和语言解决各种各样的问题。
语言的设计者没有义务使用CPU中的每个操作码。事实上,大多数情况下,他们没有,因为一些CPU指令是高度专业化的,语言设计者没有迫切需要使用它们。
有关按位运算符(以及它们与C编程的关系)的更多信息,请访问:http://en.wikipedia.org/wiki/Bitwise_operation
答案 4 :(得分:1)
当微处理器首次创建时,大多数程序都是用汇编编写的,而不是编译的。大多数CPU指令可能不是由编译器发出的(这是创建RISC的动力),但通常在硬件中相对容易实现。
图形和加密技术中的许多算法都使用旋转,它们包含在CPU中可以在汇编中编写非常快速的算法。