我想将数字01,02,03,04单独移动到寄存器D1中,以便在完成所有移动后,寄存器D1中的结果将为01020304.
我想解决这个问题的方法是,将01移到D1。然后以某种方式将它向左移动2位数然后移动02.依此类推以获得解决方案。
我该怎么做?
答案 0 :(得分:1)
这可以通过多种方式完成,最合乎逻辑的是先加载预期的最高字节,然后左移寄存器(8位= 1字节)并加载下一个字节:
move.b #$01,d0
lsl.w #8,d0 ; could lsl.l here, too
move.b #$02,d0
lsl.l #8,d0
move.b #$03,d0
lsl.l #8,d0
move.b #$04,d0
; d0 = $01020304
稍微有点混乱,但是(在68000上)更快的方法是将上面描述的最重要的字加载到低位字,然后使用SWAP指令切换寄存器一半,然后正常加载最低有效字:
move.b #$01,d0
lsl.w #8,d0
move.b #$02,d0
swap d0
move.b #$03,d0
lsl.w #8,d0
move.b #$04,d0
; d0 = $01020304
这里的要点是SWAP在整个寄存器上执行16的旋转,因此可以使用字大小的移位执行单独的旋转。此外,由于68000没有桶形移位器,因此移位性能取决于移位距离,这意味着将寄存器移位8相对较慢,而SWAP执行速度很快。
在"更大的" 68K会员您不会看到很多性能差异,因为无论换班距离如何,他们都会快速转换。