RORX指令是做什么用的?

4

来自wikipedia

RORX指令,无影响标志位的逻辑右旋转

我正在学习位运算指令,并发现了这个我不理解的指令。请给我讲解一下。谷歌搜索似乎不能帮助我。

我找到的最有用的东西是这篇专利,但它很长,我只想知道这个指令的作用。


3
《指令集参考手册》可以帮助理解RORX的使用方法。 - Michael Petch
我认为你引用的文本已经说明了一切。它只是简单地向右旋转(从右边掉落的位被再次移入左边),但不使用也不影响任何CPU标志。 - Rudy Velthuis
1
不影响标志位可以非常有用,它避免了乱序执行的停顿。 - Hans Passant
x86中带有X后缀的新指令(例如mulx,shrx,adc x,adox ...)都不会影响标志位(或以不同于以前的方式更改标志位)。 - phuclv
1个回答

4
基本上,RORX只是ROR的一个版本,它不会影响标志位,并且允许指定目标寄存器(因此源并不一定被覆盖 - 感谢评论中的Peter指出)。而ROR基本上是SHR的一个版本,它将位移到左侧,使得从右侧掉落的位再次出现在左侧。

为了帮助您理解:有三种向右移动的指令。

1)SHR,逻辑右移

  • 在右侧,将位移出到虚无(截断)
  • 在左侧,将零位移入
    • 因此,对负值进行SHR操作将使它们变为正值,因为符号位被移走并被0替换)

例子:

00110011 SHR 3

>>>00110011
00000110         "011" thrown away, "000" shifted in

---

11001100 SHR 3

>>>11001100
00011001         "100" thrown away, "000" shifted in

2) SAR, 右移算术运算

  • 在右侧,将位移进宁静之地(被截断)
  • 在左侧,根据原值的符号位(最高位)移入1或0
    • 因此,对负数进行SAR操作将保持其负号,因为符号位仍然存在并用于填充新位置
    • 对于正数(其中符号位为零),SAR将执行与SHR相同的操作
    • 该移位被称为“算术”,因为它等效于除以2^X,其中X是您要移位的位数

示例:

00110011 SAR 3

>>>00110011
00000110         "011" thrown away, "000" shifted in

---

11001100 SAR 3

>>>11001100
11111001         "100" thrown away, "111" shifted in

3) ROR, 右移操作

  • 在右侧,将位移回到左侧
  • 在左侧,位移了从右侧“掉落”的那些位

例子:

00110011 ROR 3

>>>00110011
01100110         "011" rotated around, shifted out right and back in left

---

11001100 ROR 3

>>>11001100
10011001         "100" rotated around, shifted out right and back in left

对于左移操作,只有两个指令:SHLROL,因为SAL指令没有意义,它与SHL没有区别。
至于“不影响标志位”部分的含义:大多数操作会以某种方式设置或清除处理器标志位(请查看EFLAGS寄存器),例如指示溢出是否发生或结果是否为零。这些标志位可以在条件分支指令中使用(比如cmp操作设置标志位,然后接下来的je使用这些标志位来确定比较的结果以及是否跳转)。 ROR指令通常也会设置一些标志位,但RORX不会改变它们。这是RORX唯一的区别,另外它允许指定目标与源不同,并且只允许立即数操作数(感谢Peter Cordes在评论中的补充)。当然,RORX并非所有x86处理器都支持,而ROR则是通用的。

4
我认为rorrorx之间最重要的区别在于,rorx会复制并旋转:目标寄存器不必与源寄存器相同,并且它只能使用立即操作数。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接