首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将C语言转换为MIPS程序集

将C语言转换为MIPS程序集
EN

Stack Overflow用户
提问于 2014-05-13 16:22:40
回答 2查看 515关注 0票数 0

我有下面的C代码,我想翻译成MIPS汇编。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)的文章,发现关于所有汇编命令的表格已经很有帮助了,但是实际的翻译对我来说仍然不清楚。你能不能用上面的小例子告诉我怎么做,然后我可以自己试一下?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-08-06 23:18:39

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

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

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

因此,您应该查看addbnebeqj指令。还要查看标签(与bnebeq一起使用),并决定使用哪种调用约定,以便知道与j一起使用的返回地址和值寄存器。

祝好运!

另请参阅- MIPS Architecture and Assembly Language Overview

票数 1
EN

Stack Overflow用户

发布于 2014-08-06 23:05:09

我的gcc从你的代码中生成了这个程序集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    .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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23636644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文