【问题标题】:C code translation into MIPSC 代码翻译成 MIPS
【发布时间】:2013-02-11 21:48:19
【问题描述】:

如何将以下代码翻译成 MIPS 汇编语言?

# include < stdio .h >
int fibRecursive ( int n )
{
   int answer ;
   if ( n < 2 ) {
   answer = n ;
   }
   else {
     answer = fibRecursive ( n - 1 ) + fibRecursive ( n - 2 ) ;
   }
   return answer ;
}

int main ( int argc , char * argv [] )
{
   int input = 10;
   int result = fibRecursive ( input ) ;
   printf ( " The %d - th Fibonacci number is % d .\ n " , input , result ) ;
   return 0;
}

感谢您的帮助。 我的线路有问题:

answer = fibRecursive ( n - 1 ) + fibRecursive ( n - 2 ) ;

这是我目前拥有的 MIPS:

fibRecursive:
addi $sp, $sp, -4
sw $ra, 0($sp)
addi $s0, $zero, 0
slti $t0, $a0, 2
beq $t0, $zero, ELSE
add $s0, $a0, $zero
j EXIT

ELSE:
addi $sp, $sp, -4
sw $a0, 0($sp)
addi $a0, $a0, -1
jal fibRecursive

EXIT:
add $v0, $zero, $s0

【问题讨论】:

  • 我认为编译器可以帮助您完成这项任务?
  • 这是你的作业,你自己做吧。
  • @user1998581 你知道 MIPS 汇编语言吗?
  • gcc 或 armcc 或任何带有 -S 标志的东西。输出一个不错的汇编文件供您查看。看看编译器是怎么做的,如果需要的话,你可以自己动手做工作或家庭作业。
  • @user1998581 “递归”调用函数没有区别,它与其他调用一样。标签的名称只是“偶然”与调用者的标签相同。

标签: c assembly mips


【解决方案1】:

我会运行带有标志的编译器(如 GCC)以发出汇编代码。 (例如,对于 GCC,您可以使用 -S 选项)

【讨论】:

  • 如何在编译器上加一个标志?
  • 它将生成 Intel 程序集,而不是 MIPS!
  • @Blood 取决于你调用的交叉编译器,不是吗?
  • mips 编译器不支持这种东西
  • @Blood:如果你不是在 MIPS 平台上开发,你很可能需要一个交叉编译器
【解决方案2】:


// Swapped to MIPs syntax :)
main:
  jal function
  ...

function:
  // if code here
  // return value here
  jal function
  // gather answer into reg.
  jal function
  // add away
  // return value here
  ...

在那里,您现在看到了如何在 main.js 中调用递归函数两次。清理终端案例留给用户作为练习。

【讨论】:

  • answer = fibRecursive ( n - 1 ) + fibRecursive ( n - 2 ) 是我在不是主要功能时遇到问题的行
  • 同样的事情...如果您可以调用该函数两次,将答案收集到寄存器中,那么问题出在哪里。这里我将稍微改变一下这个例子......
  • 那不是 ARM 程序集吗?认为 MIPS 是 JAL?
  • 我只是不明白在哪里放置第二个递归调用......我知道我可能听起来像个白痴,但我只是在学习这个。我已经添加了我拥有的代码
  • @MichaelDorgan 我明白你现在在说什么。我想我明白了,谢谢
【解决方案3】:

编译到 MIPS 我明白了 .file 1“c2mips.c”

 # -G value = 8, Cpu = 3000, ISA = 1
 # GNU C version cygnus-2.7.2-970404 (mips-mips-ecoff) compiled by GNU C version cygnus-2.7.2-970404.
 # options passed:  -msoft-float
 # options enabled:  -fpeephole -ffunction-cse -fkeep-static-consts
 # -fpcc-struct-return -fcommon -fverbose-asm -fgnu-linker -msoft-float
 # -meb -mcpu=3000

gcc2_compiled.:
__gnu_compiled_c:
    .text
    .align  2
    .globl  fibRecursive
    .ent    fibRecursive
fibRecursive:
    .frame  $fp,40,$31      # vars= 8, regs= 3/0, args= 16, extra= 0
    .mask   0xc0010000,-8
    .fmask  0x00000000,0
    subu    $sp,$sp,40
    sw  $31,32($sp)
    sw  $fp,28($sp)
    sw  $16,24($sp)
    move    $fp,$sp
    sw  $4,40($fp)
    lw  $2,40($fp)
    slt $3,$2,2
    beq $3,$0,$L2
    lw  $2,40($fp)
    sw  $2,16($fp)
    j   $L3
$L2:
    lw  $3,40($fp)
    addu    $2,$3,-1
    move    $4,$2
    jal fibRecursive
    move    $16,$2
    lw  $3,40($fp)
    addu    $2,$3,-2
    move    $4,$2
    jal fibRecursive
    addu    $3,$16,$2
    sw  $3,16($fp)
$L3:
    lw  $3,16($fp)
    move    $2,$3
    j   $L1
$L1:
    move    $sp,$fp         # sp not trusted here
    lw  $31,32($sp)
    lw  $fp,28($sp)
    lw  $16,24($sp)
    addu    $sp,$sp,40
    j   $31
    .end    fibRecursive
    .rdata
    .align  2
$LC0:
    .ascii  " The %d - th Fibonacci number is % d . n \000"
    .text
    .align  2
    .globl  main
    .ent    main
main:
    .frame  $fp,32,$31      # vars= 8, regs= 2/0, args= 16, extra= 0
    .mask   0xc0000000,-4
    .fmask  0x00000000,0
    subu    $sp,$sp,32
    sw  $31,28($sp)
    sw  $fp,24($sp)
    move    $fp,$sp
    sw  $4,32($fp)
    sw  $5,36($fp)
    jal __main
    li  $2,10           # 0x0000000a
    sw  $2,16($fp)
    lw  $4,16($fp)
    jal fibRecursive
    sw  $2,20($fp)
    la  $4,$LC0
    lw  $5,16($fp)
    lw  $6,20($fp)
    jal printf
    move    $2,$0
    j   $L4
$L4:
    move    $sp,$fp         # sp not trusted here
    lw  $31,28($sp)
    lw  $fp,24($sp)
    addu    $sp,$sp,32
    j   $31
    .end    main

【讨论】:

  • 你是如何“编译成 MIPS”的?
  • @bafromca 我用了工具MipsIT
  • 那是你们学校的网站吗?它说找不到页面,可能是因为我不是那里的学生?你有机会上传可执行文件吗?
  • @bafromca 是的。是的。他们将其关闭,链接失效。我们得到了文件。我的学校项目是使用 MIPS。你可以从我这里得到它(nik AT kth.se)或者在链接失效或类似之前在这个新地方尝试download it
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 2023-03-08
  • 1970-01-01
  • 2019-07-21
  • 2016-06-26
  • 2011-09-05
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多