有人能解释一下为什么FF00被存储在d1之后:
MOVE.W #$FFFF, d1 ADD.B #1, d1
字符串我知道一个字在68k架构中是16位,但想知道为什么结果是FF00而不是00FF,如果使用MOVE.B或MOVE.L会有什么变化?
MOVE.B
MOVE.L
dhxwm5r41#
move.w指令将FFFF放入d1.w,这是32位d1的低16位。高16位不受此移动的影响,因此如果没有更多信息,我们无法说出d1(d1.l)中的内容,但我们知道d1中有XXXXFFFF(其中x表示未知)。因为add.b是一个字节大小的操作,所以它与d1.b相加,d1.b是d1的低8位。该指令所加的是FF和01。数学上,加法结果是0x100,然而,由于这是一个8位加法指令,结果被截断为0x00(如果程序想知道溢出是有符号的还是无符号的,则设置条件码)。加在一起并截断为8位,我们得到00,因此d1的低8位(又名d1.b)将保持00。d1.w的16位将保持FF00,然后因为FF部分不受add.b的影响,因此该部分从先前的值(由move.w设置)结转。32位寄存器d1将保存XXXXFF00,其中,由于它来自之前未显示的某些代码序列,因此不知道该位。如果使用move.b,我们就不能访问d1寄存器的高24位,因为它们不受代码序列的影响。结果将是d1寄存器中的xxxxxx00,其中x表示不知道。如果使用move.l,我们将肯定地知道d1寄存器的完整值:0000FFFF将是移动后的初始值,0000FF00是add.b后的最终值。
move.w
d1.w
d1
d1.l
add.b
d1.b
move.b
move.l
1条答案
按热度按时间dhxwm5r41#
move.w
指令将FFFF放入d1.w
,这是32位d1
的低16位。高16位不受此移动的影响,因此如果没有更多信息,我们无法说出d1
(d1.l
)中的内容,但我们知道d1
中有XXXXFFFF(其中x表示未知)。因为
add.b
是一个字节大小的操作,所以它与d1.b
相加,d1.b
是d1
的低8位。该指令所加的是FF和01。数学上,加法结果是0x100,然而,由于这是一个8位加法指令,结果被截断为0x00(如果程序想知道溢出是有符号的还是无符号的,则设置条件码)。加在一起并截断为8位,我们得到00,因此d1
的低8位(又名d1.b
)将保持00。d1.w
的16位将保持FF00,然后因为FF部分不受add.b
的影响,因此该部分从先前的值(由move.w
设置)结转。32位寄存器
d1
将保存XXXXFF00,其中,由于它来自之前未显示的某些代码序列,因此不知道该位。如果使用
move.b
,我们就不能访问d1
寄存器的高24位,因为它们不受代码序列的影响。结果将是d1
寄存器中的xxxxxx00,其中x表示不知道。如果使用
move.l
,我们将肯定地知道d1
寄存器的完整值:0000FFFF将是移动后的初始值,0000FF00是add.b
后的最终值。