68000 组装:乘法给出了一个奇怪的结果
68000 Assembly: Multiplying gives a weird result
我有一个关于 MULU 指令的问题。我注意到的一件事是假设我在数据寄存器中有值 000FFFFF。然后假设我想放入另一个 F,使其包含 00FFFFFF。我通常做的是将数据寄存器乘以 16,如下所示:
MULU #16, D4
然后我通过执行 ADD 指令添加另一个 F(所以我得到 00FFFFFF)。但是当我再次乘以 000FFFFF 时,数据寄存器中的所有位最终都变为零 (00000000)。相乘之后,我将得到 000FFFF0,然后剩下的将随之而来。我仍然不明白这是为什么。我查了一下this example,感觉应该可以。我还注意到,如果我简单地将 1 加到 000FFFFF
,扩展位、进位位和零位都会变为真
不要使用乘法。相反,使用 LSL.L #4, (register) 将以更好的方式产生所需的结果。
我相信这个结果的原因是由于 68000 中乘法器的限制。IIRC 它只能处理 16 位值,所以当你开始处理超过 16 位的值时,你会得到这种结果。
其他人所说的是迄今为止乘以 2 的幂(左移)的值的最有效方法。除法也是如此,因为右移将有效地除以该值。
此外,如果您使用的是带符号的值,请确保使用算术移位而不是逻辑移位来保留符号(尤其是除法:))
我有一个关于 MULU 指令的问题。我注意到的一件事是假设我在数据寄存器中有值 000FFFFF。然后假设我想放入另一个 F,使其包含 00FFFFFF。我通常做的是将数据寄存器乘以 16,如下所示:
MULU #16, D4
然后我通过执行 ADD 指令添加另一个 F(所以我得到 00FFFFFF)。但是当我再次乘以 000FFFFF 时,数据寄存器中的所有位最终都变为零 (00000000)。相乘之后,我将得到 000FFFF0,然后剩下的将随之而来。我仍然不明白这是为什么。我查了一下this example,感觉应该可以。我还注意到,如果我简单地将 1 加到 000FFFFF
,扩展位、进位位和零位都会变为真不要使用乘法。相反,使用 LSL.L #4, (register) 将以更好的方式产生所需的结果。
我相信这个结果的原因是由于 68000 中乘法器的限制。IIRC 它只能处理 16 位值,所以当你开始处理超过 16 位的值时,你会得到这种结果。
其他人所说的是迄今为止乘以 2 的幂(左移)的值的最有效方法。除法也是如此,因为右移将有效地除以该值。
此外,如果您使用的是带符号的值,请确保使用算术移位而不是逻辑移位来保留符号(尤其是除法:))