2011-03-28 53 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

你必须与你初始化一个问题...