2014-01-06 117 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