ROL.Ld0,d0指令的目的是什么?

What is the purpose of the instruction ROL.L d0, d0?

我正在查看其他人编写的一些代码,有一次我找到了指令:

ROL.L d0, d0

现在,我知道这条指令允许我将位左移 n 个位置,例如:

ROL.L #, d0

它让我将数据寄存器 d0 中包含的长字的位向左移动两个位置,其中在左侧 (msb) 释放的任何位将在右侧 (lsb) 重新出现。

确定了这一点后,我推断出一条指令就像我的问题中提到的那样:

ROL.L d0, d0

它让我将数据寄存器 d0 中包含的长字的位向左移动 d0 个位置。

其实不然。

我也在Intel微处理器上试过,但似乎不支持这样的指令。 顺便说一句,在 64 位 INTEL 系统上,最大旋转是 255 个位置,而在 8088 微处理器上,它一次只能旋转 1 个位置。

更新。 我想我会在找到这条指令的地方包含过程代码。此过程生成伪随机数:

rand_func1
    move.l  #345678,d0
    addq.l  #5,d0
    rol.l   d0,d0
    move.l  d0,rand_func1+2  ; d0 = pseudo-random number
    rts 

根据@Sep Roland 告诉我的,我做了一些检查,这就是我得到的。

一条指令如rol.ld0,d0,将寄存器d0的位轮换到 由 d0 中包含的值的模 64 留下。

对于ROL.L d0,d0 CPU使用d0和63的旋转计数。 所以如果 d0 寄存器包含一个值是 64 的倍数,你不会 观察值的任何变化。

模数是一个数除以另一个数的余数。 因此,一个数的模 64 是该数除以 64 的余数。 例如,65 的模 64 为 1,因为当您将 65 除以 64 时, 余数为 1.

代码示例:

move.l  #64,d0              
rol.l   d0,d0                   ; No changes, this is because:
                                ; Mod-64 of 64 is 0 because:
                                ; 64 / 64 = 1 remainder 0, because:
                                ; 64 x 0 = 0, so 64 - 64 = 0 
                                ;
                                ; so the code is equivalent to:
                                ; rol.l #0,d0, that is, no rotation

move.l  #65,d0              
rol.l   d0,d0                   ; Mod-64 of 65 is 1 because:
                                ; 65 / 64 = 1 remainder 64, because:
                                ; 64 x 1 = 64, so 65 - 64 = 1 
                                ;
                                ; so the code is equivalent to:
                                ; rol.l #1,d0, that is:
                                ; d0 = 65 = 00000000 00000000 00000000 01000001
                                ; once the code is executed:
                                ; rol.l #1,d0
                                ; d0 =      00000000 00000000 00000000 10000010 = 
                                ; = 82 hex
                                            
move.l  #120,d0             
rol.l   d0,d0                   ; Mod-64 of 120 is 56 because:
                                ; 120 / 64 = 1 remainder 56, because:
                                ; 64 x 1 = 64, so 120 - 64 = 56
                                ;
                                ; so the code is equivalent to:
                                ; rol.l #56,d0, that is:
                                ; d0 = 120 = 00000000 00000000 00000000 01111000
                                ; once the code is executed:
                                ; rol.l #56,d0 (if it could be done)
                                ; d0 =       01111000 00000000 00000000 00000000 = 
                                ; = 78000000 hex