好的,问题来了。我必须编写一个 MIPS 程序,从用户那里获得 2 个输入数字。然后,我必须编写一个代码来输出用户输入的 2 个数字的乘积、商和余数。现在,这很简单。但是,我没有意识到我们不能在程序中使用乘法和除法操作数。现在我不知道该怎么做,因为我对如何在没有乘法和除法操作数的情况下做到这一点感到困惑。我在整个程序中只使用了两次,效果很好,但我的教授不会接受它,现在我很伤心。任何帮助,将不胜感激。谢谢这是我的代码# Given positive integers a and b, output a/b and a%b. .datastr1: .asciiz "Enter a: "str2: .asciiz "Enter b: "str3: .asciiz "a/b = "str4: .asciiz "a%b = "str5: .asciiz "a*b = "newline: .asciiz "\n" .textmain: 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 $s0li $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 str2li $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 $t1li $v0, 5 #load syscall for read_intsyscall #make the syscallmove $s1, $v0 #move the number read into $s1(b)#DO THE CALCULATIONS................................................div $s0, $s1 #diving $s0 by $s1mflo $t0 #storing value of lo(quotient) in #register $t0mfhi $t1 #storing value of hi(remainder) in #register $t1mult $s0, $s1mflo $t2li $v0,1move $a0, $t2syscallli $v0,4la $a0, str5syscall#read print_string for str3li $v0, 4 # system call code for print_string la $a0, str3 # address of str1 syscall # print str1#print a/bli $v0, 1 #load syscall print_int into $v0move $a0, $t0 #move the number to print into $t2syscall# read print string for str4li $v0, 4 la $a0, str4 syscall# print remainderli $v0, 1move $a0, $t1syscall#end of programli $v0, 10 #system call code for exitsyscall 最佳答案 您正在寻找的是 按位乘法/除法。 我不确定我能不能简明扼要地总结一下,但我举个例子:乘以假设您希望将数字 6 乘以数字 5。如果 a = 数字 6,那么(在简化的 8 位中)这是:a=00000110如果 b = 数字 5,那么(在简化的 8 位中)这是:b=00000101要将这些数字相乘,您需要移动数字下方最接近的 2 的倍数,然后相加。比如2在5以下最接近的倍数是4,也就是2^2;所以我们将 a(数字 6)按位左移 2 次:a << 2现在使它成为 00011000这意味着我们现在已经乘以 4;现在将其乘以 5,我们只需再次添加 a: 00011000 +00000110 =00011110 =30 (base 10)这是 6*5。让我们用 12*11 再试一次11 以下最接近的 2 倍数是 8 (2^3)。这意味着我们需要将数字按位移动 12 3 次,然后将其再添加 3 次。 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划分把 12 除以 11,你走另一条路;从 132 中减去 12,3 次,然后向右移位 3 次(除以 8)相关资源这是我此刻能做的最好的事情;如果你想要更多,使用 C 中的相关算法,看看 http://www.programmersheaven.com/mb/CandCPP/295363/295363/bitwise-multiplication--division/如果您希望扩展此答案中的任何一个,请在下面发表评论;附言我已经向你展示了两个质数的例子(讨厌)但是如果你得到一个像 12 这样的数字怎么办?从逻辑上讲,根据我所说的,最接近的 2 倍数是 8 (2^3),因此您必须向左移动 3,然后将 12 添加到数字 4 次。但是如果你做数学运算,你会发现 12 实际上是 = (2^3 + 2^2)...这意味着你可以得到 (12关于mips - 如何在不使用内置指令的情况下在 MIPS 汇编中实现乘法和除法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9798813/
10-11 15:33