我正在尝试编写一条 68000 指令来将 D0 中的 32 位无符号值乘以 0.125。然而分数乘法不可用。所以我想知道是否有任何方法可以绕过它?它应该是无符号的并且 0.125 = 1/8。因此,我认为它的工作方式是:
LSL (LSR #0,#3),D0
这甚至没有运行,我不知道我还能怎么做。
我正在尝试编写一条 68000 指令来将 D0 中的 32 位无符号值乘以 0.125。然而分数乘法不可用。所以我想知道是否有任何方法可以绕过它?它应该是无符号的并且 0.125 = 1/8。因此,我认为它的工作方式是:
LSL (LSR #0,#3),D0
这甚至没有运行,我不知道我还能怎么做。
这是汇编,你不能仅仅组合这样的指令的表达式。每条指令都需要在自己的行上。如果你想实现(x >> 3) << 3
,你必须先右移,然后左移,这是两个单独的指令:
LSR.L #3,D0
LSL.L #3,D0
顺便说一句,请注意,这(x >> N) << N
相当于,在is:x & -(1 << N)
的情况下,或在 68k 汇编中(或在 hex 中)。N=3
x & -8
AND.L #-8,D0
AND.L #$fffffff7,D0
但是,如果您只想乘以 0.125(即除以 8),则右移一次就足够了:
LSR.L #3,D0
不确定您要达到的目的:
LSL (LSR #0,#3),D0
如果您想将值逻辑右移d0
三位(即除以8
或乘以0.125
),那将更简单:
lsr #$03, d0 ;; or lsr.l