【发布时间】:2013-11-10 17:18:10
【问题描述】:
老师给我们一个作业,让我们编写一个程序,将 2 个 8 位长度的数字相乘。我们的微控制器仅支持 8 位寄存器,因此必须将结果放入 2 个寄存器中。这就是我卡住的地方。
要将这两个数字相乘,我必须将其中一个向左移动。而且我不知道该怎么做,因为当向左移动时,只剩下进位位,我可以将数字粘贴到其中,但是当我必须移动不止一位时,进位-有点不够。
我也不明白如何添加这些数字。示例:
Number1: Number2:
0000'0111 * 1111'1111
---------------------
1111'1111
1'1111'111< The 1 number on the left would be outside the register.
11'1111'11<< The 2 numbers on the left would be outside the register.
------------
110'1111'1001
这是纸上的方法。但是我该如何实现呢?
【问题讨论】:
-
如果您将 8b x 8b 乘以结果也是 8 位,则有时会溢出(如您的示例中所示)。对此你无能为力。如果您可以监控架构上的进位位,则只需在这种情况下报告溢出即可。
-
是的,这是一种方式。但是我们必须让它成为一个乘法器,它实际上能够乘以 8x8,然后得到一个 16 位的结果。这意味着结果必须在两个寄存器中,我不知道如何计算。
-
你能在 4x4 乘法的多次传递中做到这一点吗?或者以某种方式翻译数字并像二进制编码的十进制一样处理它?即:您似乎与想要在 32 位处理器上做 64 位数学的人有同样的问题。它是可行的,只是速度慢。
-
我刚刚得到了我们必须这样做的信息,如下所示: Number1:只有 1 个寄存器 Number2:2 个寄存器,Number2_Low 和 Number2_High 现在做起来容易多了。我想我已经有了解决方案。非常感谢,我现在有了。
-
每个处理器都有一个左移指令,将进位移到第 0 位。即使是低端的 8051,例如 RL 与 RLC。
标签: assembly