68000汇编:乘法给出了一个奇怪的结果

时间:2016-11-08 03:08:20

标签: assembly multiplying instruction-set 68000

我对MULU指令有疑问。我注意到的一件事是假设我在数据寄存器中有值000FFFFF。然后假设我想要输入另一个F,使其包含00FFFFFF。我通常做的是将数据寄存器乘以16,如下所示:

MULU  #16, D4

然后我通过ADD指令添加另一个F(所以我得到00FFFFFF)。但是当我再次乘以000FFFFF时,数据寄存器内的所有位最终都变为零(00000000)。在那之后,我将有000FFFF0,然后其余的将跟随。我仍然不明白这个的原因。我查了this example,我觉得它应该有效。我还注意到,如果我只添加1到000FFFFF,则Extend,Carry和Zero位都会变为true

2 个答案:

答案 0 :(得分:1)

Do not use multiplication. Instead, use LSL.L #4, (register) and that will yield the result needed in a much better way.

答案 1 :(得分:0)

我认为这个结果的原因是由于68000中乘数的限制.IIRC它只能处理16位值,因此当你开始处理超出该值的值时,你会得到这种结果。

其他人所说的是迄今为止乘以功率为2(左移)的最有效方法。对于除法也是如此,因为右移将有效地划分该值。

此外,如果您正在使用有符号值,请确保使用算术移位而不是逻辑移位来保留符号(特别是对于除法:))