【发布时间】:2021-08-29 09:10:27
【问题描述】:
我正在查看其他人编写的一些代码,并且有一次我找到了说明:
ROL.L d0, d0
现在,我知道这条指令允许我将位左移 n 位,例如:
ROL.L #$2, d0
它使我将数据寄存器 d0 中包含的长字的位向左移动两个位置,在左侧释放的任何位 (msb) 将重新出现在右侧 (lsb)。
确定这一点后,我推断出类似于我的问题中提到的指令:
ROL.L d0, d0
它使我将数据寄存器 d0 中包含的长字的位向左移动 d0 个位置。
事实上,情况并非如此。
我也尝试过英特尔微处理器,但似乎不支持这样的指令。 顺便说一句,在 64 位 INTEL 系统上,最大旋转是 255 个位置,而在 8088 微处理器上,一次只能旋转 1 个位置。
更新。 我想我会在我找到这个指令的地方包含过程代码。此过程生成伪随机数:
rand_func1
move.l #$12345678,d0
addq.l #5,d0
rol.l d0,d0
move.l d0,rand_func1+2 ; d0 = pseudo-random number
rts
【问题讨论】:
-
关于“事实上,情况并非如此”:您能否详细说明您是如何得出这个结论的?你检查了
d0的什么输入值,你得到了什么输出,你期望什么? -
对于
ROL.L d0, d0,CPU 使用d0 and 63的旋转计数。因此,如果d0寄存器包含的值是 64 的倍数,您将不会观察到该值的任何变化。 -
即使在 8088 上,您也可以编写非常相似的
ROL CL, CL,它将字节大小的寄存器CL(第一个操作数是目标)中的位旋转任意数量 在计数器寄存器CL中(第二个操作数是源)。 -
@SepRoland:那么它是模 64 吗?我在我的问题中添加了一个细节,这是我找到指令的代码。
-
对于
ROL.L和ROR.L,结果实际上应该只取决于d0 and 31,因为将32 位整数旋转32+n与旋转n相同(我猜在那里是一些特殊情况下如何设置X和C标志,当移位32 与移位0 时,但我必须检查一下)。