微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决指令 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 举报,一经查实,本站将立刻删除。