我目前正在编写一个执行阶乘的 mips 程序。我已经用java编写了阶乘示例,并且在java代码下面也有MIPS程序。我已经写出了大部分 MIPS,但很困惑为什么它处理不正确。任何提示将不胜感激。
Java code for the iteratve factorial algorithm:
import java.util.Scanner;
public class FactorMachine {
public static void main(String[] args) {
int input;
Scanner in = new Scanner(System.in);
System.out.println("Enter an integer to be factored: ");
input = in.nextInt();
{
int x, factorial = 1;
for (x = input; x > 1; x--)
factorial *= x;
System.out.println("Factorial #" + input + " is " + factorial);
}
}
}
MIPS 代码:
.data
p1: .asciiz "Enter an integer to be factored: "
ans1: .asciiz "Factorial # "
ans2: .asciiz " is "
ans3: .asciiz "\n\n"
.text
.globl main
main: li $v0, 4
la $a0, p1
syscall
li $v0, 5
syscall
move $t0, $v0 #this is input
li $t1, 1 #initilize factorial
move $t2, $t0 #initilize x
loop:
blt $t2, 1, done
sub $t2, $t2, 1
mul $t3, $t1, $t0
j loop
done:
li $v0, 4
la $a0, ans1
syscall
li $v0, 1
move $a0, $t3
syscall
jr $ra
最佳答案
让我们看看 Java 代码的作用(为了清楚起见,我将 X *= Y
更改为 X = X * Y
):
for (x = input; x > 1; x--)
factorial = factorial * x;
现在让我们看看您的汇编代码:
move $t2, $t0 #initilize x
loop:
blt $t2, 1, done
sub $t2, $t2, 1
mul $t3, $t1, $t0
j loop
以及 Java 中对应的内容:
for (x = input; x >= 1; ) {
x--;
temp = factorial * input;
}
注意到差异了吗?你是:
- 在乘法之前递减
x
,而不是像原始 Java 代码中那样在乘法之后递减。 - 乘以
input
($t0
),而不是乘以x
($t2
)。 - 将乘法结果存储在不同的寄存器中,而不是将其写回到
阶乘
($t1
)。因此,您始终会得到1 * input
的乘积,这当然等于input
。
关于java - MIPS编程基础for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25963935/