java - MIPS编程基础for循环

标签 java assembly mips mips32

我目前正在编写一个执行阶乘的 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;
}

注意到差异了吗?你是:

  1. 在乘法之前递减 x,而不是像原始 Java 代码中那样在乘法之后递减。
  2. 乘以input ($t0),而不是乘以x ($t2)。
  3. 将乘法结果存储在不同的寄存器中,而不是将其写回到阶乘 ($t1)。因此,您始终会得到 1 * input 的乘积,这当然等于 input

关于java - MIPS编程基础for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25963935/

相关文章:

java - 使私有(private)方法最终?

java - 如何检查一棵树是否完整?

java - 调用 setOnClickListener 时传递参数?

java - RAD 中的 Websphere 在启动时挂起

assembly - 如何在GNU ARM汇编程序中为寄存器赋予其他名称?

arrays - 在 MIPS 中创建(和访问)数组

assembly - MARS(MIPS 汇编)上的中断指令是什么类型

assembly - 如何为我的引导加载程序制作内核?

windows - 如何在 NASM 中减去两个数并得到负数?

assembly - MIPS 中如何处理五个或更多参数?