2014-01-06 135 views
1

我有我用C编写的代码,我想转换成MIPS汇编,我尝试使用编译器,它给出了一个.s文件,但对我来说看起来像是废话。有人可以提供一些帮助,因为我对MIPS组装无能为力。将C转换为MIPS汇编

我的代码是Collat​​z猜想。我的C语言编程不太好,因为我迄今为止只学过Java。在此先感谢

#include<stdio.h> 

int main() 
{ 
    int n; 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 


    while (n != 1) 
    { 
     if(n == 1) 
     { 
      printf("N == 1"); 
     } 
     else if((n%2)==0) 
     { 
      printf("Integer is even : %d\n", n); 
      n = n/2; 
     } 
     else 
     { 
      n = 3*n + 1; 
      printf("Integer has been multipled by 3 and added by 1 : %d\n", n); 
     } 
    } 
} 
+1

quick comment - 'if(n == 1){printf(“N == 1”); }'不能执行,因为你的while条件阻止它。 –

+0

哦,是的,谢谢你!完全错过了! – user3166873

+2

认为该代码翻译为'asm'时,将包含对C标准库的引用。尝试以更简单的形式重写它作为开始。你还使用了哪些命令行选项? – user2485710

回答

3

这是你的代码的重新安排,将输入和输出的算法程序collatz()之外。

#include <stdio.h> 

int steps; 

void print(int n) 
{ 
    printf("%d ", n); 
    steps++; 
} 

void collatz(int n) 
{ 
    print(n); 
    while (n != 1) 
    { 
     if ((n % 2) == 0) 
     { 
      n = n/2; 
      print(n); 
     } 
     else 
     { 
      n = 3 * n + 1; 
      print(n); 
     } 
    } 
} 

int main() 
{ 
    int n; 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

    steps = 0; 
    collatz(n); 
    printf("in %d steps.\n", steps); 
} 

对于n = 6,这将被打印:

6 3 10 5 16 8 4 2 1 in 9 steps. 

酷算法,由于用于引入我!

1

当用户使用编译器编译C代码时,他们必须记住这是机器使用的代码,因此通常不是人们认为是可读代码的好例子。

这就是说,这里是我对MIPS汇编中源代码的解释。这是为了与SPIM模拟器一起使用而编写的,并将其系统调用用于I/O,记录为here

.data 

prompt:  .asciiz "Enter an integer\n" 
neq1Message: .asciiz "N == 1" 
nevenMessage: .asciiz "Integer is even : " 
noddMessage: .asciiz "Integer has been multiplied by 3 and added by 1 : " 

.text 
main: 

    #print prompt 
    la $a0 prompt 
    addi $v0 $zero 4 
    syscall 

    #read integer into $t0 
    addi $v0 $zero 5 
    syscall 
    move $t0 $v0 

    loop: 

     # quit loop if n == 1 
     addi $t1 $zero 1 
     beq $t0 $t1 loopEnd 

     #skip to even if n != 1 
     addi $t1 $zero 1 
     bne $t0 $t1 neven 

     neq1: 

      # print n is 1 
      la $a0 neq1Message 
      addi $v0 $zero 4 
      syscall 

      j loop 

     neven: 

      # skip to odd if n not even 
      andi $t1 $t0 1 
      bne $t1 $zero nodd 

      # print n is even 
      la $a0 nevenMessage 
      addi $v0 $zero 4 
      syscall 

      # print n 
      move $a0 $t0 
      addi $v0 $zero 1 
      syscall 

      # print newline 
      addi $a0 $zero 10 
      addi $v0 $zero 11 
      syscall 

      # n = n/2 
      srl $t0 $t0 1 

      j loop 

     nodd: 

      # n = 3 * n + 1 
      addi $t1 $zero 3 
      mul $t0 $t0 $t1 
      addi $t0 $t0 1 

      # print n is odd 
      la $a0 noddMessage 
      addi $v0 $zero 4 
      syscall 

      # print n 
      move $a0 $t0 
      addi $v0 $zero 1 
      syscall 

      # print newline 
      addi $a0 $zero 10 
      addi $v0 $zero 11 
      syscall 

      j loop 

    loopEnd: 

jr $ra 
+0

感谢您的代码,它的工作原理虽然它的数学错误,当我把6例如它不会将它除以2它由于某种原因将其更改为10 – user3166873

+0

@ user3166873其实,这里的代码与上面的C - 两个版本的输出相同。先回想一下,6减半到3然后再乘以3,然后加1得到10.注意第二,在你的C代码中显示数字后除以2。 –

+0

对不起,感谢纠正我:) – user3166873