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