旋转指令的目的是什么(ROL,x86上的RCL)?

Gra*_*Lup 29 x86 assembly cpu-architecture machine-instruction

我总是想知道一些CPU具有旋转指令的目的是什么(例如,ROL,x86上的RCL).什么样的软件使用这些说明?我首先想到它们可能用于加密/计算哈希码,但这些库通常用C编写,它没有映射到这些指令的运算符.
有没有人找到他们的用途?为什么他们在指令集中添加了哪些内容?

Nie*_*jou 25

跨多个字的位移需要旋转.当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对于以(最终)非破坏性的方式逐位检查值非常有用.它们还可用于分流位掩码,而不会引入垃圾位.

  • 当你想要测试它们时,或许,按顺序. (4认同)
  • 或者,当你没有BT开始时. (2认同)
  • 旋转仅在仅移位 1 位时有效 (2认同)
  • 第三步后CF不会是0吗?(熄灭的位设置为 CF 并且将 CF 的*前一个值*插入到最右边的位置) (2认同)

dth*_*rpe 16

旋转移位操作码ROL,RCL,ROR,RCR几乎专门用于散列和CRC计算.它们非常神秘而且很少使用.

移位操作码(SHL,SHR)用于以2的幂进行快速乘法,或者将低字节移动到大寄存器的高字节中.

ROL和SHL之间的区别在于ROL取高位并将其滚动到低位位置.SHL抛出高位并用零填充低位位置.

  • 我不知道你是怎么回答这个问题的. (4认同)
  • 也许你可以在你的答案中添加ROL/RCL和ROR/RCR的差异. (3认同)
  • 是的,很少使用.哈希和加密是图书馆使用的东西,而不是每个开发者都应该为自己写的东西. (3认同)
  • 相当神秘,很少使用?真?旋转很有用的地方很多,特别是在你说散列和加密时.在许多CPU上,移位量会影响时间,实际上旋转和按位的速度更快,而不是进行移位. (2认同)
  • 请注意,从 CPU 设计的角度(提供哪些指令)来看,相关衡量标准是(或将)*执行*的频率,而不是有多少不同的软件将包含该指令。模拟并不难(不像一些特殊用途的指令,如“popcnt”或“crc32”或SIMD“psadbw”,这些指令基本上是为了视频编码运动搜索而添加的),但OTOH不需要太多额外的硬件来模拟制作一个能够旋转的桶形移位器。 (2认同)

Ala*_*ier 8

ROR ROL具有"历史性",但在许多方面仍然有用.

在80386(和操作码BT)之前,ROL将被用于测试一点(SHL不会传播到进位标志) - 实际上在8088中,ROR/ROL一次只能移位1位! !

此外,如果您想要移动一个方向然后另一个方向而不丢失已经移出范围的位,您将使用ROR/ROL而不是SHR/SHL

  • 并且8080甚至没有换班指令 - 旋转就是你得到的! (2认同)
  • 没错,在 8088 上您只能旋转一个,**如果您使用立即旋转计数**。但是,8088 也支持按寄存器 `cl` 中给出的计数进行轮换。(在 186 指令集中添加了除 1 之外的立即字节移位/循环计数。) (2认同)
  • [ROL](https://www.felixcloutier.com/x86/rcl:rcr:rol:ror) 以同样的方式设置 CF [SHL](https://www.felixcloutier.com/x86/sal:sar:shl :shr) 确实如此。(根据最后一位左移出高位)。唯一的区别是 ROL 移动底部的位而不是移动零。(并且在 SHL 中设置 SF、ZF 和 PF 就像普通的 ALU 指令一样,与旋转不同。) (2认同)