假设我们有以下内容:
MOVE.L #$1234ABCD,D0 MOVE.L #$45670012,D1 MULS D0,D1
D1的值是多少?
我注意到146A的值与模拟器中的相同,但FFFA是从哪里来的?模拟器错了吗?
hpcdzsge1#
我知道摩托罗拉的代码是0,但我认为这与你使用有符号乘法器的事实有关?尝试使用无符号乘法器。
axkjgtzd2#
其他评论已经正确地告诉了发生了什么。这里只是一个(希望)清晰的总结:无符号乘法:
MOVE.L #$1234ABCD,D0 MOVE.L #$45670012,D1 MULU D0,D1
计算如下
0xABCD x 0x0012 = 0x000C146A
这是D1之后的内容。而在有符号乘法中:
0xABCD是值-0x5433的2的补码表示
-0x5433 x 0x0012 = -0x0005EB96
32位2的补码中的数字是0xFFFA 146 A,它是D1中的结果。在这两种情况下,因子的上位词并不重要。编辑(感谢Sep罗兰和Peter Cordes):事实上,用长值加载寄存器是原始问题的一部分,但只会增加混乱。cpu将两个字大小的值相乘,因此加载字是有意义的:
MOVE #$ABCD,D0 MOVE #$0012,D1
PS:你可以用任何十六进制计算器轻松地检查结果的32位补码:0x100000000 - 0x0005EB96 = 0xFFFA146A
2条答案
按热度按时间hpcdzsge1#
我知道摩托罗拉的代码是0,但我认为这与你使用有符号乘法器的事实有关?尝试使用无符号乘法器。
axkjgtzd2#
其他评论已经正确地告诉了发生了什么。这里只是一个(希望)清晰的总结:
无符号乘法:
计算如下
这是D1之后的内容。
而在有符号乘法中:
0xABCD是值-0x5433的2的补码表示
32位2的补码中的数字是0xFFFA 146 A,它是D1中的结果。
在这两种情况下,因子的上位词并不重要。
编辑(感谢Sep罗兰和Peter Cordes):
事实上,用长值加载寄存器是原始问题的一部分,但只会增加混乱。
cpu将两个字大小的值相乘,因此加载字是有意义的:
PS:你可以用任何十六进制计算器轻松地检查结果的32位补码:
0x100000000 - 0x0005EB96 = 0xFFFA146A