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
我正在查看其他人编写的一些代码,有一次我找到了指令:
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