如何使用shift和add在MIPS汇编中执行乘法?

时间:2017-09-24 18:09:28

标签: assembly mips

请帮忙,我花了5个多小时试图找出这个简单的问题而且我不能为我的生活弄清楚你到底该怎么做。

我应该像7 * 5那样做一些问题并在MIPS汇编中返回结果,但我必须使用shift和add来做。我无法弄清楚如何使用我们给出的提示并将其转换为MIPS代码。就像我100%了解下面图片的工作方式及其背后的逻辑,但我不能把它变成MIPS汇编代码,这就是我花了5个多小时试图做的事情。

here is what we were given as a hint

我理解移位是如何工作的,我理解在MIPS中添加是如何工作的,我只是不知道如何用MIPS汇编语言来完成该图像中显示的内容。 (我不知道如何将英语转换成能够完成这些工作的代码.MIPS对于这个问题太过准了!)

我应该澄清!:两个数字都是VARIABLES。我不知道如何编写每次使用两个不同数字的代码并使用shift和add获得结果。无论用户输入哪两个数字,只要它们是非负数,代码必须得到结果。

2 个答案:

答案 0 :(得分:1)

我上小学时我们得知a *(b + c)= ab + ac对吗?所以7 * 5 = 7 *(4 + 1)= 7 * 4 + 7 * 1,它们都是2 ...(2 ^ 2和2 ^ 0)的幂。

如果不是常数那么重要吗?

     abcd
*    efgh
==========
     abcd  * h
    abcd   * g
   abcd    * f
+ abcd     * e
=============
我们在小学时学过的东西,除了更简单,因为efgh要么是零,要么是一个。因此,如果h位(位0)然后我们添加abcd<< 0,如果g位被置位(位1)则添加abcd<< 1如果f被置位(位2)则添加abcd<< 2等等。

所以实际上你确实知道如何做到这一点而不是如何应用它。铅笔和纸就像小学一样,没理由花5个小时......

修改

unsigned int a,b,x,y;
for(y=0,x=0;x<32;x++) if(a&(1<<x)) y+=b<<x;


for(y=0,x=1,z=b;x;x<<=1,z<<=1) if(x&a) y+=z;

答案 1 :(得分:0)

对于所显示的努力,我会在这里放置主要的剧透,但你可能会后悔,一旦你意识到你是如何绕着解决方案圈出来的。

s0 = a, s1 = b, s2 = 0 (will be result)
multiply_loop:
  if (s1 == 0) goto output_result
  t1 = s1&1
  if (t1 == 0) goto skip_add
  s2 += s0
skip_add:
  s0 <<= 1;  multiply "a" by 2
  s1 >>= 1;  shift bits of "b" to right by 1 for s1&1 test
  goto multiply_loop

output_result:
  s2 is result of multiplication

当然,这会溢出大的“a”/“b”值等。首先尝试使用二进制值在纸上解密,如何在内部工作。