MCS-51上24位数的乘法算法

时间:2016-09-15 18:08:06

标签: assembly microcontroller multiplication

我正在尝试使用MCS-51 microcontrollerthis Datasheet的汇编语言编写程序。

必须乘以24位数字。

也许我问一个愚蠢的问题,但我怎么会乘以24位的列?

在下面的图片中说明了乘以16位数字的方法。如何看待24位数的乘法方案?

1pic

2pic

1 个答案:

答案 0 :(得分:4)

根据文档的快速浏览,MCS-51具有8x8-> 16乘法。您有两个24位数AB,它们相当于:

A = a0 + (a1 * 256) + (a2 * 65536)
B = b0 + (b1 * 256) + (b2 * 65536)

其中a0是A的最低字节,a1是A的中间字节,a2是最高字节,bs是B的对应项。

因此:

A * B = (a0 + (a1 * 256) + (a2 * 65536)) * (b0 + (b1 * 256) + (b2 * 65536))
      = a0 * (b0 + (b1 * 256) + (b2 * 65536)) +
        a1 * 256 * (b0 + (b1 * 256) + (b2 * 65536)) +
        a2 * 65536 * (b0 + (b1 * 256) + (b2 * 65536))
      = a0 * b0         + a0 * b1 * 256      + a0 * b2 * 65536 +
        a1 * b0 * 256   + a1 * b1 * 65536    + a1 * b2 * 16777216 +
        a2 * b0 * 65536 + a2 * b1 * 16777216 + a2 * b2 * 4294967296
      = a0 * b0 +
        256 * (a0 * b1 + a1 * b0) +
        65536 * (a0 * b2 + a1 * b1 + a2 * b0) +
        16777216 * (a1 * b2 + a2 * b0) +
        4294967296 * (a2 * b2)

所以这九个8x8倍数,然后按组加在一起,然后根据需要移动每个组,然后在最后添加所有内容。

如果您只想要一个24位结果而不是48位结果,那么您可以从16777216 *中删除所有内容,因为很明显该部分不能用于低三字节。或者类似地停止在其他地方为其他输出尺寸做工作。