我有以下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)的维基百科文章,并且发现关于所有汇编命令的表已经非常有用,但实际翻译对我来说仍然不清楚。你能不能告诉我一个小例子那里怎么样这样做然后我可以试试自己?谢谢!
答案 0 :(得分:1)
我认为你的家庭作业的想法是试着让你思考像C这样的高级语言如何被编译器翻译成汇编程序。考虑寄存器,逻辑测试,跳转,堆栈等。
我相信你的小程序将返回Fibonacci序列中的n
数字。如果我设置了这个,我希望写一个简单的MIPS汇编片段来做同样的事情。
所以,在这个小函数中你需要考虑五个数字,你可以使用五个寄存器(如果你聪明的话,可以使用更少的寄存器)。还有一些等式检查和循环。
因此,您应该查看add
,bne
,beq
和j
说明。另请查看标签(与bne
和beq
一起使用)并确定要使用的调用约定,以便知道要与j
一起使用的返回地址和值寄存器。
答案 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