2014-09-21 2 views
1

В настоящее время я пишу программу mips, которая делает факториал. Я написал факториальный пример в java и также имею программу MIPS под кодом Java. У меня большинство выписано MIPS, но я смущен, почему он неправильно обрабатывает. Любые советы будут очень признательны.Программирование MIPS basic for-loop

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 

ответ

1

Давайте посмотрим на то, что делает код 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. Decrementing x перед умножением, а не после, как в исходном Java-коде.
  2. Умножение на input ($t0) вместо x ($t2).
  3. Сохранение результата умножения в другом регистре, вместо того, чтобы записать его обратно в factorial ($t1). Таким образом, вы всегда получите продукт 1 * input, который, конечно, равен input.
+0

Определенно ставит вперед и назад языки в перспективе. –

Смежные вопросы