2009-12-02 57 views
0

我編寫了一個C語言計算階乘的代碼,但是我試圖將它翻譯成彙編語言以在PCspim上工作,但不知道如何?有人可以幫忙嗎?Tryig將C代碼翻譯爲MIPS程序集以便在Spim上工作

C代碼:

#include <stdio.h> 

#include <stdlib.h> 

#include <string.h> 

void factorial(long argument, long *result) { 

    if(argument < 2) { 
    printf("%ld", *result); 
    } else { 
     long before = argument - 1; 
     *result = *result * before; 
     argument = before; 
     factorial(argument, result); 
     } 
} 

int main() { 

    long argument, answer, *result; 

    printf("Factorial "); 

    scanf("%ld", &argument); 

    result = &answer; 

    *result = argument; 

    printf("%ld! = ",argument); 

    factorial(argument, result); 
} 

回答

1

SPIM是MIPS的解釋,所以你必須寫在MIPS彙編這些程序...... 你可以看看的

輸出

GCC -s ​​<名>

,主要生產部件表達,但我懷疑這是李請參閱您運行GCC的體系結構(可能是X86。 X86!= MIPS)。

當我不得不寫MIPS彙編爲我的基礎課程在幾個星期前,我大量使用維基百科的文章和以下網站:http://en.wikibooks.org/wiki/MIPS_Assembly/Arithmetic_Instructions

0

你是從頭開始編寫的階乘,或「編譯」的C代碼?兩種截然不同的方法。

當我做了一些RISC編碼,我發現最好僞出來,

如果要編譯,然後每個C語句需要擴大出到直接實現它,而不參考C.等效的RISC組裝。

編輯:這裏是一些信息:U of Idaho的一個頁面使用MIPS/spim。

+0

以及我只需要將我的c代碼轉換爲MIPS彙編,然後在PCspim上運行它並確保它在那裏工作。我試圖在程序集中編寫代碼,但它不會運行在PCspim上,我猜我的代碼是錯誤的,我想知道是否有人可以幫我翻譯我的c代碼 – andrew 2009-12-02 05:30:51

1

我寫了一個編譯器,它會爲樂趣,用C來SPIM ASM語法(當然支持遞歸)的一個子集..

根據它

int f(int x) 
{ 
    if (x == 1) 
     return 1; 
    else 
     return (x*f(x-1)); 
} 

int main (void) { 
    f(8); 
} 

編譯爲

.data 
.align 4 
.align 1 

    .text 
    .globl main 
main: 
    subu $sp, $sp, 32 
    sw $ra, 20($sp) 
    sw $fp, 16($sp) 
    addiu $fp, $sp, 28 
    li $t6, 8 
    move $a0, $t6 
    jal f 
    lw $ra, 20($sp) 
    lw $fp, 16($sp) 
    addu $sp, $sp, 32 
    jr $ra 

f: 
    subu $sp, $sp, 36 
    sw $ra, 24($sp) 
    sw $fp, 20($sp) 
    addiu $fp, $sp, 32 
    li $t0, 1 
    bne $a0, $t0, equal0 
    li $t1, 1 
    b equal1 
equal0: 
    li $t1, 0 
equal1: 
    li $t2, 0 
    beq $t1, $t2, if2 
    li $v0, 1 
    lw $ra, 24($sp) 
    lw $fp, 20($sp) 
    addu $sp, $sp, 36 
    jr $ra 
    b if3 
if2: 
    li $t3, 1 
    subu $t4, $a0, $t3 
    sw $a0, 0($sp) 
    move $a0, $t4 
    jal f 
    move $t5, $v0 
    lw $a0, 0($sp) 
    mulou $v0, $a0, $t5 
    lw $ra, 24($sp) 
    lw $fp, 20($sp) 
    addu $sp, $sp, 36 
    jr $ra 
if3: 
    lw $ra, 24($sp) 
    lw $fp, 20($sp) 
    addu $sp, $sp, 36 
    jr $ra 

嘗試,如果它的工作原理,它是不是在所有優化,但你可以得到一個線索,並修改它根據您的需要..

+0

是的,你的代碼對於需要一個參數的factorial有意義,但是im只是在使用void方法編寫MIPS程序集時遇到了麻煩,因爲它使用兩個參數,像我上面發佈的代碼 – andrew 2009-12-02 05:34:47

+0

您的源代碼和我的唯一區別在於您必須作爲參數傳遞(在** $ a0上, $ a1 .. **)將結果地址轉換爲階乘函數,並直接修改它,而不是在每次調用時分配臨時堆棧。 * result *應該在數據段或堆棧中分配,然後你得到地址,並將它傳遞給* factorial * – Jack 2009-12-02 10:53:11

+0

行了!我翻譯了代碼並使其工作!非常感謝 – andrew 2009-12-03 04:13:21