如何解决指令 ROL.L d0, d0 的目的是什么?
我正在查看其他人编写的一些代码,有一次我找到了说明:
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
解决方法
根据@Sep Roland 告诉我的,我做了一些检查,这就是我得到的。
roll.l d0,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 ; 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,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,so 120 - 64 = 56
;
; so the code is equivalent to:
; rol.l #56,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。