assembly MC68000组件倍增

ttp71kqs  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(114)

假设我们有以下内容:

MOVE.L #$1234ABCD,D0
MOVE.L #$45670012,D1
MULS   D0,D1

D1的值是多少?

  • 根据MC68000模拟器,它将是0xFFFA146A
  • 根据这本书,每个寄存器的两个最低顺序的字将被相乘,结果将被存储为一个长字。因此,它将是0xABCD * 0x0012 =0x000C146A

我注意到146A的值与模拟器中的相同,但FFFA是从哪里来的?模拟器错了吗?

hpcdzsge

hpcdzsge1#

我知道摩托罗拉的代码是0,但我认为这与你使用有符号乘法器的事实有关?尝试使用无符号乘法器。

axkjgtzd

axkjgtzd2#

其他评论已经正确地告诉了发生了什么。这里只是一个(希望)清晰的总结:
无符号乘法:

MOVE.L #$1234ABCD,D0
MOVE.L #$45670012,D1
MULU   D0,D1

计算如下

0xABCD x 0x0012 = 0x000C146A

这是D1之后的内容。
而在有符号乘法中:

MOVE.L #$1234ABCD,D0
MOVE.L #$45670012,D1
MULS   D0,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

相关问题