68K汇编,如何复制数据寄存器的前4位

时间:2016-10-13 04:36:26

标签: assembly 68000 easy68k

假设任意数据寄存器包含值' 000E0015'。如何将前4位(000E)复制到另一个数据寄存器?

2 个答案:

答案 0 :(得分:3)

您需要提供更多信息以获得良好的答案。

首先,000E0015是32位值。 "前四"位可能意味着最重要的位,0指示它。或者它可能意味着最低的四位,即5.或者你可能意味着你键入的内容 - 000E-这是前16位(每个四位组称为'半字节')。

第二,你期望的最终状态是什么?如果您在寄存器中以000E0015开头,并且目的地寄存器中有XXXXXXXX,您是否希望它为000EXXXX,保留值?你觉得它是000E0000吗?或者您希望寄存器类似于0000000E?

我会假设,除非您另有说明,您希望第二个寄存器获得000E,如您所述。在这种情况下,假设您从d0开始并想要转到d1:

move.l  d1,d0
swap    d1   

这将首先将整个32位寄存器复制到d1,然后它将交换字。 d1将包含0015000E。如果你想清除它们,可以用0000FFFF AND d1。如果您希望它们包含之前所做的任何操作,您可以首先在中间寄存器中准备0000000E,然后通过与FFFF0000进行AND运算来清除低位,然后使用OR-从中间寄存器引入0000000E,但是I'我不太确定你需要什么。

答案 1 :(得分:2)

您想要最重要的字,而不是前4位,所以32位值的最重要的16位。有几种方法可以做到这一点。如果您只是将该单词作为一个单词处理并忽略数据寄存器中的任何其他内容,那么您可以安全地使用swap。

move.l #$000E0015,d0   ; so this example makes sense :)
move.l d0,d1  ; Move the WHOLE value into your target register
swap d1   ; This will swap the upper and lower words of the register

此后d1将包含#$ 0015000E,因此如果您只将其作为一个单词进行处理,您将完全访问数据寄存器的$ 000E部分。

move.w d1,$1234  ; Will store the value $000E at address $1234

现在,如果您计划使用剩余的数据寄存器,或者使用或超出第1个字的操作,则需要确保上面的单词是清晰的。你可以很容易地做到这一点,而不是使用swap,使用lsr.l

move.l #$000E0015,d0   ; so this example makes sense :)
move.l d0,d1  ; Move the WHOLE value into your target register
moveq  #16,d2  ; Number of bits to move right by
lsr.l  d2,d1  ; Move Value in d1 right by number of bits specified in d2

您不能使用lsr.l#16,d1作为lsX.l的立即值限制为8,但您可以在另一个寄存器中指定最多32个并以此方式执行操作。

清洁(恕我直言)方式(除非你多次重复此操作)将在交换后使用AND来清理寄存器。

move.l #$000E0015,d0 ; so this example makes sense :)
move.l d0,d1         ; Move the WHOLE value into your target register
swap   d1            ; This will swap the upper and lower words of the register
and.l  #$ffff,d1     ; Mask off just the data we want

这将删除d1寄存器中不适合逻辑掩码的所有位。在d1和指定的模式($ ffff)

中,IE位都设置为true

最后,我认为执行此任务的最有效和最干净的方法是使用clr和swap。

move.l #$000E0015,d0 ; so this example makes sense :)
move.l d0,d1         ; Move the WHOLE value into your target register
clr.w  d1            ; clear the lower word of the data register 1st
swap   d1            ; This will swap the upper and lower words of the register

希望那些有所帮助? :)