MC68000汇编乘法

问题描述 投票:0回答:2

假设我们有以下内容:

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

D1 的价值是多少?

  • 根据 MC68000 模拟器,它将是 0xFFFA146A
  • 按照书上说的,每个寄存器的最低位的两个字相乘,结果存为longword。因此,它将是 0xABCD * 0x0012 = 0x000C146A

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

assembly multiplication signed 68000
2个回答
2
投票

我对摩托罗拉的代码了解为 0,但我认为这与您使用带符号的乘法器有关?尝试使用无符号乘数。


1
投票

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

无符号乘法:

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 的补码中的数字是 0xFFFA146A,这是 D1 中的结果。

在这两种情况下,因子的高位词无关紧要。

PS:您可以使用任何十六进制计算器轻松检查补码: 0x100000000 - 0x0005EB96 = 0xFFFA146A

© www.soinside.com 2019 - 2024. All rights reserved.