преобразовать факторный код C в MIPS факториал - PullRequest
0 голосов
/ 01 июля 2019

У меня проблемы с преобразованием следующего кода C в MIPS

#include <stdio.h>

int main (void)
{
    int n = 0;
    printf ("n  = ");
    scanf ("%d", &n);
    int fac = 1;
    for (int i = 1; i <= n; i++)
        fac *= i;
    printf ("n! = %d\n", fac);
    return 0;
}

Мой код не распечатывает ожидаемый результат, но он может успешно напечатать "n:" и т. Д.

### Global data
   .data
msg1:
   .asciiz "n: "
msg2:
   .asciiz "n! = "
eol:
   .asciiz "\n"

### main() function

   .data
   .align 2
   .word 4

   .text
main:
   la   $a0, msg1
   li   $v0, 4  #printf("n: ")
   syscall  

   li   $v0, 5  #scanf("%d", &n) 
   syscall

   li   $t0, 1
   li   $t1, 1
   mul  $t1, $t1, $t0 #t1 = t1*t0
   add  $t0, $t0, 1 #t0 = t0+1

   la   $a0, msg2
   li   $v0, 4  #printf("n!= ")
   syscall

   li   $v0, 1  #print %d
   la   $a0, eol
   li   $v0, 4 #printf("\n")
   syscall

   li   $v0, 0
   jr   $ra #return from main

Мой код не выдает никаких выходных данных, поэтому, я думаю, что-то пошло не так в моем цикле

1 Ответ

0 голосов
/ 12 июля 2019

Вы выполняете секцию цикла в коде, который превращается в цикл for в коде c, и вы не устанавливаете значение и не вызываете syscall для кода printf ("% d").

### Global data
  .data
msg1:
  .asciiz "n: "
msg2:
  .asciiz "n! = "
eol:
  .asciiz "\n"

### main() function

  .data
  .align 2
  .word 4

  .text

main:
  la   $a0, msg1
  li   $v0, 4  #printf("n: ")
  syscall  

  li   $v0, 5  #scanf("%d", &n) 
  syscall      
  move $t2, $v0 # n = t2

  li   $t0, 1  # i = 1
  li   $t1, 1  # fact = 1

loop:
  bgt  $t0, $t2, end_loop # i > b - stop looping
  mul  $t1, $t1, $t0 #t1 = t1*t0
  add  $t0, $t0, 1 #t0 = t0+1
  j loop
end_loop:

  la   $a0, msg2
  li   $v0, 4  #printf("n!= ")
  syscall

  li   $v0, 1  #print %d
  move $a0, $t1
 syscall

 la   $a0, eol
 li   $v0, 4 #printf("\n")
 syscall

 li   $v0, 0
 jr   $ra #return from main
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...