2010-05-09 64 views
1
int i ; 

void set_array(int num){ 
    int array[10]; 
    for(i=0;i<10;i++){ 
    array[i]=compare(num,i){ 
    } 
} 

int compare(int a ,int b){ 
    if(sub(a,b)>=0) 
    return 1; 
    else 
    return 0; 
} 

int sub(int a,int b){ 
    return a-b; 
} 

有人知道如何轉換爲MIPS代碼C在計算機組成MIPS代碼和架構

+0

給我們一個出發點,這顯然是一個作業問題。到目前爲止,你有什麼瞭解? – 2010-05-09 05:49:50

+3

通常的方法是使用一個針對MIPS的編譯器。 – 2010-05-09 05:50:31

+0

如果你懶惰,尋找交叉編譯器。如果你真的寫MIPS,目的是避免生成的代碼中罕見但偶爾的低效率。 – 2010-05-09 05:58:44

回答

2

首先,你需要一個小抄:MIPS Instruction Reference

一個很好的參考表是最有用的爲任何體系結構編寫程序集時可能的事情其次,從高層次開始打破程序。你知道功能和他們的名字,所以從那裏開始。首先定義函數併爲每個函數創建一個非常基本的定義,以便它可以被調用。

接下來,編寫將從各自的位置爲每個函數提取函數參數的代碼。你很幸運,因爲每個函數都只接受一個基本整數。在調用函數之前,您需要將任何函數參數移至$a0 - $a3。然後,您可以編寫在返回之前將您的返回值移入$v0$v1的代碼。確保在您編寫的每個函數中,將您正在使用的寄存器保存到堆棧中,然後在您的jal $ra之前恢復它們。現在你應該有一些可調用並返回值的函數,但是不要做任何事情。

最後,實際上寫了你的函數做的垃圾。再說一次,因爲你只使用int ...所以你很幸運,因此每個數字將與一個寄存器相匹配,並且在引用堆棧時只需要偏移4個字節......使事情變得更容易。我會給你一個提示爲int sub(int a, int b) ......它會是這個樣子:

sub $t2, $t1, $t0 

哈哈,看到了嗎?編寫程序集並不困難:D

當然,您必須在函數結尾處將結果移動到$v0' or $ v1`並跳回到被調用者。

無論如何,希望能讓你開始。

+0

+1「對於任何體系結構編寫程序集時,一張好的參考表是最有用的東西」。除非您正在處理一些真正簡約的架構,否則處理器指令和時序通常太複雜,除非您長時間進食,飲用和呼吸,否則無法保存在內存中。 (甚至可能不是。) – 2010-05-09 06:16:10

+0

我剛剛注意到你是多麼的邪惡,Polaris878。棧? – 2010-05-09 06:22:32

+0

@ttmrichter ...修正了哈哈,當我寫下這些時,我真的很疲憊,而且自從我編寫程序集之後已經有一段時間了:D現在應該都很好。 – Polaris878 2010-05-09 16:11:49