【问题标题】:MIPS - help converting code from CMIPS - 帮助从 C 转换代码
【发布时间】:2011-03-28 11:42:25
【问题描述】:

我是 MIPS 的初学者,我正在尝试编写一个简单的代码,该代码在内存中的给定数组上运行,该数组小于 10 个单元,比如说 9 个单元,并在屏幕上打印最大的数字。

我写了一个 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 汇编中编写该代码并向我解释,我将非常高兴。

谢谢!

【问题讨论】:

    标签: c assembly mips


    【解决方案1】:

    只关注循环,尝试类似的方法:

       .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());
    

    【讨论】:

    • 感谢您的详细解答!您是什么意思:“请注意,您需要设置 noreorder 指令才能使其正常工作”?你的意思是它应该是这样的: .text .globl __start __start: li $t4 array li $t5 array_end li $t2 0 lw $s6 0($t4) 1:slt $s3 $s2 $s6 movn $s2 $ s6 $s3 lw $s6 4($s4) bne $s4 $s5 1b addiu $s4 4 .data 数组:.long -2 , 3 , 9 , -1 , 5 , 6 , 10 , 52 , 9 array_end: .long 0
    • 我不能写一个正常的代码回复......你能写出完整的程序吗?我只需要看看它是如何运行的,以及如何在屏幕上添加一个最大的数字?谢谢!!
    • 我不能为你写整个程序,因为我不知道你的执行环境。如果您对查看代码运行感兴趣,请编写 C,使用 objdump 反汇编并尝试了解那里发生了什么。如果您遇到困难,请复制粘贴该程序集的摘录并寻求解释。我不在乎编写调用 printf 的程序集(C 编译器比我做得更好),只有循环值得手写(这里我可以比编译器做得更好)
    【解决方案2】:

    你的初始化有问题...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多