ROR 或 ROL 在 Assembly 中有什么作用?例如,ROR 110100110 会产生什么?
我知道这是一个“按位旋转”,但我不知道这意味着什么,还没有找到一个简单的例子来说明它的作用。
ROR - Rotate Right
ROL - Rotate Left
Run Code Online (Sandbox Code Playgroud)
在循环指令中,从寄存器末尾滑落的位被反馈到空格中。
相对回报率
mov eax,0xA //the value in eax is 0000 0000 0000 0000 0000 0000 0000 1010
ror eax,2 // now eax will be 1000 0000 0000 0000 0000 0000 0000 0010
Run Code Online (Sandbox Code Playgroud)
罗尔
mov eax,0xA //the value in eax is 0000 0000 0000 0000 0000 0000 0000 1010
rol eax,2 // now eax will be 0000 0000 0000 0000 0000 0000 0010 1000
Run Code Online (Sandbox Code Playgroud)
取决于指令集。我假设你明白右移意味着什么
110100110
右移一位意味着位 0 来自位 1,位 1 来自位 2,依此类推。有一个转变,但关键问题是当它们从一端掉下来时,它们会去哪里,而另一端又是什么?
110100110
X11010011
XX1101001
XXX110100
XXXX11010
Run Code Online (Sandbox Code Playgroud)
所以右移,从人类的角度来看,位向右移动,我们正确的数字在左边最重要,右边最不重要。
有时您会看到逻辑与算术右移等。C 编程语言假设零移入,您会看到一些指令集这样做,上面的 XX 将是零。一些指令集还具有将进位位移入的功能。还有一些在 msbit 移入的地方进行算术右移,在您的情况下,这将是一个。
A ROTATE 意味着从一端掉下来的位旋转并在另一端移位。
110100110
X110100110
XX110100110
XXX110100110
Run Code Online (Sandbox Code Playgroud)
因此,您可能会发现一种实现,其中移出的位是在上述另一端移出的位。第一个移位零从末尾落下,因此进入的位将是零。两位移位 10 出去所以 10 进来,依此类推:
110100110
011010011 0
101101001 10
110110100 110
Run Code Online (Sandbox Code Playgroud)
你经常看到旋转中使用的进位
110100110 C
C11010011 0
0C1101001 1
10C110100 1
110C11010 0
0110C1101 0
00110C110 1
100110C11 0
0100110C1 1
10100110C 1
110100110 C
Run Code Online (Sandbox Code Playgroud)
因此,假设您有一个 9 位寄存器,其中包含您指定的 9 位,并且 ROR 通过进位循环,那么您会得到上面的单个位循环将进位标志中的内容放入 msbit 寄存器中的其他位右移一位和 lsbit旋转到进位。
一些指令集每条指令你会得到一位旋转,有些让你指定一个旋转多少位的参数。注意上面序列中的倒数第二个值。几乎一路旋转与向左旋转相同。一些指令集其中一个循环实际上是一个伪指令,实现为 n 位减去循环量。N-1 的右旋与左旋 1 种事情为什么浪费操作码相同。