2014-09-21 6 views
1

Je suis en train d'écrire un programme Mips factoriel. J'ai écrit l'exemple factoriel dans Java, et j'ai aussi le programme MIPS sous le code java. J'ai la majorité du MIPS écrit, mais je suis confus pourquoi il ne traite pas correctement. Tous les conseils seraient grandement appréciés.MIPS programmation de base pour boucle

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); 
     } 
    } 
} 

CODE 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 

Répondre

1

Regardons ce que le code Java fait (je l'ai changé X *= Y-X = X * Y pour plus de clarté):

for (x = input; x > 1; x--) 
     factorial = factorial * x; 

Maintenant, regardons votre code d'assemblage:

move $t2, $t0  #initilize x 
loop: 
    blt $t2, 1, done 
    sub $t2, $t2, 1 
    mul $t3, $t1, $t0 
    j loop 

et ce qui correspondrait à Java:

for (x = input; x >= 1;) { 
    x--; 
    temp = factorial * input; 
} 

Remarquez les différences? Vous êtes:

  1. Décrémentant x avant la multiplication, au lieu de après comme dans le code Java d'origine.
  2. En multipliant par input ($t0) au lieu de x ($t2).
  3. Stockage du résultat de la multiplication dans un registre différent au lieu de l'écrire à factorial ($t1). Donc, vous aurez toujours le produit de 1 * input, ce qui est bien sûr égal à input.
+0

Va certainement dans les langues en perspective. –