RORX
只是ROR
的一个版本,它不会影响标志位,并且允许指定目标寄存器(因此源并不一定被覆盖 - 感谢评论中的Peter指出)。而ROR
基本上是SHR
的一个版本,它将位移到左侧,使得从右侧掉落的位再次出现在左侧。
为了帮助您理解:有三种向右移动的指令。
SHR
,逻辑右移例子:
00110011 SHR 3
>>>00110011
00000110 "011" thrown away, "000" shifted in
---
11001100 SHR 3
>>>11001100
00011001 "100" thrown away, "000" shifted in
SAR
, 右移算术运算示例:
00110011 SAR 3
>>>00110011
00000110 "011" thrown away, "000" shifted in
---
11001100 SAR 3
>>>11001100
11111001 "100" thrown away, "111" shifted in
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
SHL
和ROL
,因为SAL
指令没有意义,它与SHL
没有区别。
EFLAGS
寄存器),例如指示溢出是否发生或结果是否为零。这些标志位可以在条件分支指令中使用(比如cmp
操作设置标志位,然后接下来的je
使用这些标志位来确定比较的结果以及是否跳转)。
ROR
指令通常也会设置一些标志位,但RORX
不会改变它们。这是RORX
唯一的区别,另外它允许指定目标与源不同,并且只允许立即数操作数(感谢Peter Cordes在评论中的补充)。当然,RORX
并非所有x86处理器都支持,而ROR
则是通用的。
X
后缀的新指令(例如mulx,shrx,adc x,adox ...)都不会影响标志位(或以不同于以前的方式更改标志位)。 - phuclv