2011-03-28 52 views
0

轉換代碼我在MIPS一個初學者,我試圖寫在內存小於10個單元運行在一個給定的數組一個簡單的代碼,可以說9個細胞,並在屏幕上的打印最大的數字。MIPS - 幫助在C

我寫了一個C代碼解決了這個問題,但我不知道如何將它轉換(不MIPS GCC)的工作MIPS彙編代碼。

的代碼,我寫道:

int N = 9 , i = 0 , biggest = 0 ; 
int arr [N] = -2 , 3 , 9 , -1 , 5 , 6 , 10 , 52 , 9 ; 

while (i <= N) 
{ 
    if (arr [i] > biggest) 
     biggest = arr [i] ; 

    i++ ; 
} 

printf ("biggest number is: %d" , biggest) ; 

我會很樂意,如果有人可以寫在MIPS組件代碼,並解釋給我聽。

謝謝!

+0

這是功課? – 2011-03-28 12:43:31

+1

不做作業... – Batman 2011-03-28 13:11:34

回答

0

只是着眼於循環,嘗試類似的東西:

.text 
    .set noreorder 
    .global get_max 
get_max: 
    li $4, array    // start pointer 
    li $5, array_end-array-4 // end pointer 
    li $2, 0     // 'biggest' as result 
    lw $6, 0($4)    // load first table entry 
1: slt $3, $2, $6    // boolean flag (biggest<arr[i]) 
    movn $2, $6, $3    // update 'biggest' when flag is set 
    lw $6, 4($4)    // load next table entry 
    bne $4, $5, 1b    // continue until we hit end of array 
    addiu $4, 4     // advance to next cell (using bne delay slot) 
    jr $31      // return to the caller 
    nop       // safely fill the delay slot 

      .data 
array:  .long -2 , 3 , 9 , -1 , 5 , 6 , 10 , 52 , 9 
array_end: .long 0 

編譯成一個單獨的程序源文件和鏈接本您的主要的C代碼。

不要忘記從你的C代碼調用該函數:

printf("biggest=%d\n",get_max()); 
+0

謝謝你的詳細解答! 你是什麼意思:「請注意,你需要設置noreorder指令來使它工作」? 做你的意思是,它應該是這樣的: 的.text \t .globl __start __start: 李$ T4陣列 李$ T5 array_end 李$ T2 0 LW $ S6 0($ T4) 1:SLT $ $ S3 S2 $ S6 MOVN $ $ S2 S6 $ S3 LW $ S6 4​​($ S4) BNE $ $ S4 S5 1B addiu $ 4 S4 。數據 陣列:。長-2,3,9 ,-1,5,6,10,52,9 array_end:0。長期我 – Batman 2011-03-28 13:53:10

+0

不能寫一個正常代碼應答....可以寫,因爲它應是完整的程序?我只需要看看它的運行情況,以及如何在屏幕上添加最大數量的打印? thnx !! – Batman 2011-03-28 13:58:26

+0

我無法爲你編寫整個程序,因爲我不知道你的exec環境。如果您有興趣查看代碼運行情況,請編寫C代碼,使用objdump進行反彙編,並嘗試瞭解其中發生了什麼。如果您遇到困難,請複製粘貼部分摘錄並要求解釋。我不在乎編寫調用printf的程序集(C編譯器比我做得更好),只有循環值得手寫(在這裏我可以比編譯器做得更好) – 2011-03-28 14:20:39

0

你必須與你初始化一個問題...