如何在不使用内置指令的情况下在MIPS汇编中实现乘法和除法?

如何在不使用内置指令的情况下在MIPS汇编中实现乘法和除法?,mips,Mips,好的,问题出在这里。我必须编写一个MIPS程序,从用户那里得到2个输入数字。然后,我必须编写一个代码,输出用户输入的2个数字的乘积、商和余数 现在,这很直截了当。然而,我没有意识到我们不能在程序中使用乘法和除法操作数。现在我不知道该怎么做,因为我不知道在没有乘法和除法操作数的情况下该怎么做。我在整个程序中只使用了两次,效果很好,但我的教授不会接受,现在我感到很难过。任何帮助都将不胜感激。多谢各位 这是我的密码 # Given positive integers a and b, output a

好的,问题出在这里。我必须编写一个MIPS程序,从用户那里得到2个输入数字。然后,我必须编写一个代码,输出用户输入的2个数字的乘积、商和余数

现在,这很直截了当。然而,我没有意识到我们不能在程序中使用乘法和除法操作数。现在我不知道该怎么做,因为我不知道在没有乘法和除法操作数的情况下该怎么做。我在整个程序中只使用了两次,效果很好,但我的教授不会接受,现在我感到很难过。任何帮助都将不胜感激。多谢各位

这是我的密码

# Given positive integers a and b, output a/b and a%b.
  .data
str1: .asciiz "Enter a: "
str2: .asciiz "Enter b: "
str3: .asciiz "a/b = "
str4: .asciiz "a%b = "
str5: .asciiz "a*b = "
newline: .asciiz "\n"
  .text

main: li   $v0, 4            # system call code for print_string
  la   $a0, str1         # address of str1
  syscall                # print str1

#get the first number from user, put it into $s0

li   $v0, 5            # system call code for read_int
  syscall                # read an integer into $v0 from console
  add  $s0, $v0, $zero   # copy $v0 into $s0 (a)


#read print_string for str2
li   $v0, 4            # system call code for print_string
  la   $a0, str2         # address of str1
  syscall                # print str1

# get second number from user, put it into $t1  
li  $v0, 5      #load syscall for read_int
syscall         #make the syscall
move $s1, $v0       #move the number read into $s1(b)

#DO THE CALCULATIONS................................................
div $s0, $s1        #diving $s0 by $s1
mflo    $t0         #storing value of lo(quotient) in
                #register $t0
mfhi    $t1         #storing value of hi(remainder) in
                #register $t1

mult $s0, $s1
mflo $t2


li $v0,1
move $a0, $t2
syscall

li $v0,4
la $a0, str5
syscall

#read print_string for str3
li   $v0, 4            # system call code for print_string
  la   $a0, str3         # address of str1
  syscall                # print str1   

#print a/b
li  $v0, 1      #load syscall print_int into $v0
move $a0, $t0      #move the number to print into $t2
syscall
# read print string for str4
li $v0, 4
    la $a0, str4
    syscall
# print remainder
li $v0, 1
move $a0, $t1
syscall

#end of program
li  $v0, 10     #system call code for exit
syscall
从:

因为按整数缩放的结果可以被认为是由原始的一些副本组成,所以大于1的整数乘积可以通过重复加法来计算

换句话说,要把a*b相乘,就要把a和b相加

你在评论中提到的策略(比特转换)很有趣——可能更有效,但肯定要复杂得多


类似的策略适用于除法/余数。

您需要的是按位乘法/除法。

我不确定我能否简明扼要地总结一下,但这里我举一个例子:

繁衍 假设您希望将数字6乘以数字5。
如果a=数字6,则(简化为8位)为:
a=00000110

如果b=数字5,则(简化为8位)为:
b=00000101

要将这些数字相乘,您需要将其移动到数字以下两个数字的最接近倍数,然后进行相加

例如,5以下2的最近倍数是4,也就是说它是2^2
所以我们按位左移
a
(数字6)2次:

a尝试以下乘法算法:
这是Boothe算法的MIPS实现:

你需要问自己:“什么是乘法?什么是除法?”维基百科上关于乘法的条目可能会有所帮助(我是认真的)我是这么做的,老实说……我理解这样一个概念,如果你把二进制移到左边,它就会除法……如果你把它移到右边,我只是不知道如何把它放进mipsoh,伙计,我甚至没有想过这样做;这可能是可能的,但特里基肯定注意到,姆夫兰克利上面关于乘法的回答可以接受地很好,但对于除法来说就没那么有用了,我想乘法:加法::除法:减法?哦,天哪,我现在都没在想;你说得很对——如果你想把a除以b,你可以一直从a中减去b,直到你剩下的量小于b(这构成了你的余数)。java是有意义的……只是我不知道如何将它转换成MIPS
     00011000  
    +00000110  
    =00011110  
    =30 (base 10)
    00001100 = 12
    //Let's bitshift by 3
    01100000 = 96
    //Let's add 12 3 times
    01100000
   +00001100
   =01101100 = 108
   +00001100
   =01111000 = 120
   +00001100
   =10000100 = 132 = 12*11