Assembly 如何使用shift和add在MIPS程序集中执行乘法?

Assembly 如何使用shift和add在MIPS程序集中执行乘法?,assembly,mips,Assembly,Mips,请帮帮我,我花了5个多小时试图解决这个简单的问题,但我一辈子都搞不懂你到底是怎么做的 我应该做一些像7*5这样的问题,然后在MIPS assembly中返回结果,但我必须使用shift和add来完成。我不知道如何使用我们得到的提示并将其转换为MIPS代码。就像我100%理解下面的图片是如何工作的,以及它背后的逻辑,但我无法将其转换为MIPS汇编代码,这就是我花了5个多小时试图做的 我理解移位是如何工作的,我理解在MIPS中添加是如何工作的,我只是不知道如何用MIPS汇编语言完成图像中显示的内容

请帮帮我,我花了5个多小时试图解决这个简单的问题,但我一辈子都搞不懂你到底是怎么做的

我应该做一些像7*5这样的问题,然后在MIPS assembly中返回结果,但我必须使用shift和add来完成。我不知道如何使用我们得到的提示并将其转换为MIPS代码。就像我100%理解下面的图片是如何工作的,以及它背后的逻辑,但我无法将其转换为MIPS汇编代码,这就是我花了5个多小时试图做的

我理解移位是如何工作的,我理解在MIPS中添加是如何工作的,我只是不知道如何用MIPS汇编语言完成图像中显示的内容。(我不知道如何将英语转换成代码来做这些事情。MIPS对这个来说太简单了!)


我应该澄清一下!:这两个数字都是变量。我不知道如何编写每次使用两个不同的数字并使用shift和add得到结果的代码。7*5、6*9、17*3等。无论用户为这两个数字输入什么,只要它们不是负数,代码都必须得到结果。

我在小学时就知道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,我将在这里添加“大扰流器”,但一旦您意识到您是如何在解决方案周围绕圈运行,您可能会后悔

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
s0=a、s1=b、s2=0(将是结果)
乘法循环:
如果(s1==0)转到输出结果
t1=s1&1
如果(t1==0)转到跳过添加
s2+=s0
跳过并添加:
s0=1;对于s1和1测试,将“b”的位向右移动1
转乘循环
输出结果:
s2是乘法的结果

当然,对于较大的“a”/“b”值等,这将溢出。。首先尝试在纸上用二进制值破译它的内部工作原理。

这是一个你应该问老师的问题
sll
addu
可直接用于MIPS。听起来像是在请人解释汇编语言的基本概念。我认为这个问题不可能有一个符合stackoverflow格式的好答案。我认为你需要重新阅读这个问题。我明白如何使用这两个命令,正如我在问题中明确指出的那样,这是一个更大的问题,即使用我正在努力解决的这两个命令进行乘法运算。Shift left实际上是每次移动时将数字乘以2。按字面意思添加数字并将其存储到新的寄存器中。现在我如何使用这些来将数字相乘。我从图片中看到了一种实现方法,但我不知道如何在MIPS汇编代码中表示。7*4=
li$t0,7
(或者
addi$t0,$zero,7
如果出于任何原因没有伪指令)
sll$t0,$t0,2
。。是的,
t0=28
。(二进制
t0=00000111
,然后在
sll
之后:
t0=0001110
=旧值左移2位)。谢谢,但这两个数字都是变量。所以我必须调整代码,使之乘以21*7,或3*7,或2*3,等等。另一个提示是。。。假设您有一个保留为位掩码的临时寄存器,从值
1
开始。现在,在每个循环中,将值
b
复制到另一个临时寄存器中,用掩码值屏蔽(
指令)它,然后根据结果是否不等于零,执行操作。然后在循环结束时,您可以对位掩码和值
a
执行
sll…,1
。。。(或者,用另一种方法,将掩码右移到
b
,将掩码保持在
1
,循环直到
b
被右移归零……在纸上用很少的值尝试一下,会发生什么。当我尝试做2x2时,这对我不起作用。如果10是二进制中的2,那么我会得到这样的结果:10+(10@dmscs你应该做1)*(10@dmscs假设第二个操作数的每一位都被设置好了,你在累加器中添加了2*3而不是2*2。你不明白什么部分?移位寄存器?求和?测试零?加法?不准备为你做家庭作业。告诉我们你到目前为止有什么以及你认为它在做什么。我明白,但它看起来不起作用当我把它转换成mips时,做2*5得到的结果是16。抱歉,我的大脑在这一点上太激动了,我犯了一些错误,因为我是从旧版本上输入的。这是现在的样子,我仍然得到错误的答案5*2=5是的,这是你的代码将要做的。你必须将移位的值添加到结果中,而不是原始值每个循环的值移动越来越多,因此在第i个循环中,
s0
等于(啊,我把它修好了。果然都是我的错。我对它很失望myself@dmscs汇编编程是很正常的。这是非常不可原谅的,每个细节都很重要……不管你失败了多少次,它现在是否能正常工作都无关紧要,重要的是,你是否了解如何才能产生这样的结果自我约束。如果你能更好地理解这些评论和提示的话,也许现在就再尝试一遍。关于散步的建议也很重要(不要过早地绞尽脑汁)。
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