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

Assembly 68K汇编,如何复制数据寄存器的前4位,assembly,68000,easy68k,Assembly,68000,Easy68k,假设任意数据寄存器包含值“000E0015”。如何将前4位(000E)复制到另一个数据寄存器 你需要提供更多的信息才能得到一个好的答案 首先,000E0015是一个32位的值。“前四位”可能意味着最重要的位,即引导它的0。或者它可能意味着最低的4位,即5位。或者你可以指的是你键入的000E,它是前16位(每个4位组称为“半字节”) 第二,你想要的最终状态是什么?如果寄存器中以000E0015开头,而目标寄存器中有XXXXXXXX,是否希望它为000EXXXX,并保留值?你同意它是000E0000

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

你需要提供更多的信息才能得到一个好的答案

首先,000E0015是一个32位的值。“前四位”可能意味着最重要的位,即引导它的0。或者它可能意味着最低的4位,即5位。或者你可以指的是你键入的000E,它是前16位(每个4位组称为“半字节”)

第二,你想要的最终状态是什么?如果寄存器中以000E0015开头,而目标寄存器中有XXXXXXXX,是否希望它为000EXXXX,并保留值?你同意它是000E0000吗?或者您希望寄存器的大小类似于0000000 E

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

move.l  d1,d0
swap    d1   

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

您需要提供更多信息才能得到一个好的答案

首先,000E0015是一个32位的值。“前四位”可能意味着最重要的位,即引导它的0。或者它可能意味着最低的4位,即5位。或者你可以指的是你键入的000E,它是前16位(每个4位组称为“半字节”)

第二,你想要的最终状态是什么?如果寄存器中以000E0015开头,而目标寄存器中有XXXXXXXX,是否希望它为000EXXXX,并保留值?你同意它是000E0000吗?或者您希望寄存器的大小类似于0000000 E

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

move.l  d1,d0
swap    d1   

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

您想要的是最重要的字,不是前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
现在,如果您计划使用数据寄存器的其余部分,或对其执行扩展到第一个字以外的操作,则需要确保上面的字是清晰的。您可以很容易地做到这一点,首先,不要使用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的立即数,但可以在另一个寄存器中指定最多32,并以这种方式执行操作

一种更干净(IMHO)的方法(除非您多次重复此操作)是在交换之后使用并清理寄存器

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寄存器中与逻辑掩码不匹配的所有位。IE位在d1和指定模式中均设置为真($ffff)

最后,我认为执行此任务最有效、最干净的方法是使用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

希望这些能有所帮助?:)

您需要的是最重要的字,而不是前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
现在,如果您计划使用数据寄存器的其余部分,或对其执行扩展到第一个字以外的操作,则需要确保上面的字是清晰的。您可以很容易地做到这一点,首先,不要使用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的立即数,但可以在另一个寄存器中指定最多32,并以这种方式执行操作

一种更干净(IMHO)的方法(除非您多次重复此操作)是在交换之后使用并清理寄存器

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寄存器中与逻辑掩码不匹配的所有位。IE位在d1和指定模式中均设置为真($ffff)

最后,我认为执行此任务最有效、最干净的方法是使用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

希望这些能有所帮助?:)

前4位应该是0,你很明显想要上16位前4位应该是0,你很明显想要上16位斯诺,已经20年了,但这不应该是
移动。l d0,d1
?非常确定68K使用的是右边的目的地。现在,已经20年了,但这不应该是
move.ld0,d1
?非常确定68K使用右边的目的地。