ASM ROR 是做啥的?

Posted

技术标签:

【中文标题】ASM ROR 是做啥的?【英文标题】:What does ASM ROR do?ASM ROR 是做什么的? 【发布时间】:2016-04-22 21:32:15 【问题描述】:

ROR 或 ROL 在汇编中的作用是什么? 例如,ROR 110100110 会产生什么?

我知道这是“按位旋转”,但我不知道这是什么意思,也没有找到一个简单的例子来说明它的作用。

【问题讨论】:

courses.engr.illinois.edu/ece390/archive/spr2002/books/… 旋转多远以及操作数大小? @harold 我的模拟考试中的样题没有说明:在 8 位处理器上执行以下代码后,寄存器 AL 将包含十六进制数 [AL],寄存器 BL 将包含十六进制数编号 [BL]。 MOV AL,55 MOV BL,CC ROR AL 好吧,1 和 8 位,AL 不能是 110100110,显然它是 0x55 (01010101),所以它会变成 0xAA (10101010) x86 insn 参考手册链接自***.com/tags/x86/info。它有关于每条指令究竟做了什么的确切细节,具体到哪个位在哪里。 【参考方案1】:

取决于指令集。我假设您了解右移的含义

110100110

右移一位意味着位 0 来自位 1 位 1 来自位 2,依此类推。有一个转变,但关键问题是当这些位从一端脱落时,它们会去哪里,而另一端又是什么?

110100110
X11010011
XX1101001
XXX110100
XXXX11010

因此,从人类的角度来看,右移位向右移动,我们将最重要的数字放在左边,而右边的数字最少。

有时您会看到逻辑与算术右移等。C 编程语言假定零移入,并且您会看到一些执行此操作的指令集,上面的 XXes 将为零。一些指令集还具有将进位移入的功能。还有一些在移入 msbit 的地方进行算术右移,在您的情况下,这将是一个。

ROTATE 意味着从一端掉落的位会旋转并移入另一端。

110100110
X110100110
XX110100110
XXX110100110

因此,您可能会找到一种实现,其中移出的位是在上述另一端移动的位。第一次移位零从末端脱落,因此进入的位将为零。两个位移位,一个 10 出去,所以 10 进来,依此类推:

110100110
011010011 0
101101001 10
110110100 110

你经常看到在轮换中使用进位位

110100110 C
C11010011 0
0C1101001 1
10C110100 1
110C11010 0
0110C1101 0
00110C110 1
100110C11 0
0100110C1 1
10100110C 1
110100110 C

所以假设您有一个包含您指定的 9 位的 9 位寄存器,并且 ROR 通过进位循环,那么您得到上面的单个位循环将进位标志中的内容放入 msbit 寄存器中的其他位右移一位并且 lsbit 旋转到进位。

有些指令集每条指令会旋转一位,有些则让您指定旋转多少位的参数。请注意上述序列中的倒数第二个值。几乎所有方式的旋转与向左旋转相同。一些指令集其中一个旋转实际上是一个伪指令,实现为 n 位减去旋转量。 N-1 的右旋转与左旋转 1 是一样的,为什么要浪费一个操作码。

【讨论】:

这是指令集/架构特定的。一些架构具有通过进位轮换的单独指令。当他们这样做时,我不知道他们中的任何一个使用RORROR,除非缺少循环进位,否则几乎总是要旋转到最高有效位。【参考方案2】:
ROR - Rotate Right
ROL - Rotate Left

在循环指令中,从寄存器末尾滑出的位被反馈到空格中。

ROR

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

ROL

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

【讨论】:

但是 ROR 只是简单的右循环(通过进位是 RCR),而eax 是寄存器的 32 位版本。

以上是关于ASM ROR 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

addScalar 是做啥的?

LoaderManager 是做啥的?

sizeof 是做啥的?

FragmentManager 和 FragmentTransaction 到底是做啥的?

这段代码是做啥的? [关闭]

CSS:这个星号 (*) 是做啥的?