将C转换为MIPS程序集

时间:2014-05-13 16:22:40

标签: c assembly mips

我有以下C代码,我想将其转换为MIPS程序集。

int fib_iter(int n) {
  int i, f0, f1, f;
  f0 = 0;
  f1 = 1;
  if (n == 0) return f0;
  if (n == 1) return f1;
  for (i = 2; i <= n; i = i + 1) {
    f = f0 + f1;
    f0 = f1;
    f1 = 1;
  }
  return f;
}

我不知道如何做到这一点,我无法在任何地方找到一个好的教师。我已经阅读了关于MIPS(https://en.wikipedia.org/wiki/MIPS_instruction_set)的维基百科文章,并且发现关于所有汇编命令的表已经非常有用,但实际翻译对我来说仍然不清楚。你能不能告诉我一个小例子那里怎么样这样做然后我可以试试自己?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你的家庭作业的想法是试着让你思考像C这样的高级语言如何被编译器翻译成汇编程序。考虑寄存器,逻辑测试,跳转,堆栈等。

我相信你的小程序将返回Fibonacci序列中的n数字。如果我设置了这个,我希望写一个简单的MIPS汇编片段来做同样的事情。

所以,在这个小函数中你需要考虑五个数字,你可以使用五个寄存器(如果你聪明的话,可以使用更少的寄存器)。还有一些等式检查和循环。

因此,您应该查看addbnebeqj说明。另请查看标签(与bnebeq一起使用)并确定要使用的调用约定,以便知道要与j一起使用的返回地址和值寄存器。

祝你好运!

另见 - MIPS Architecture and Assembly Language Overview

答案 1 :(得分:-1)

我的gcc通过你的代码生成了这个程序集。

    .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  fib_iter
    .ent    fib_iter
fib_iter:
    .frame  $fp,24,$31      # vars= 16, regs= 1/0, args= 0, extra= 0
    .mask   0x40000000,-8
    .fmask  0x00000000,0
    subu    $sp,$sp,24
    sw  $fp,16($sp)
    move    $fp,$sp
    sw  $4,24($fp)
    sw  $0,4($fp)
    li  $2,1            # 0x00000001
    sw  $2,8($fp)
    lw  $2,24($fp)
    bne $2,$0,$L2
    lw  $3,4($fp)
    move    $2,$3
    j   $L1
$L2:
    lw  $2,24($fp)
    li  $3,1            # 0x00000001
    bne $2,$3,$L3
    lw  $3,8($fp)
    move    $2,$3
    j   $L1
$L3:
    .set    noreorder
    nop
    .set    reorder
    li  $2,2            # 0x00000002
    sw  $2,0($fp)
$L4:
    lw  $2,0($fp)
    lw  $3,24($fp)
    slt $2,$3,$2
    beq $2,$0,$L7
    j   $L5
$L7:
    lw  $2,4($fp)
    lw  $3,8($fp)
    addu    $2,$2,$3
    sw  $2,12($fp)
    lw  $2,8($fp)
    sw  $2,4($fp)
    li  $2,1            # 0x00000001
    sw  $2,8($fp)
$L6:
    lw  $2,0($fp)
    addu    $3,$2,1
    sw  $3,0($fp)
    j   $L4
$L5:
    lw  $3,12($fp)
    move    $2,$3
    j   $L1
$L1:
    move    $sp,$fp         # sp not trusted here
    lw  $fp,16($sp)
    addu    $sp,$sp,24
    j   $31
    .end    fib_iter