我有下面的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)的文章,发现关于所有汇编命令的表格已经很有帮助了,但是实际的翻译对我来说仍然不清楚。你能不能用上面的小例子告诉我怎么做,然后我可以自己试一下?谢谢!
发布于 2014-08-06 23:18:39
我认为你的家庭作业的想法是试图让你思考像C这样的高级语言是如何被编译器翻译成汇编语言的。考虑寄存器、逻辑测试、跳转、堆栈等等。
我相信你的小程序会返回斐波那契数列中的第th个n
数。如果我设置了这个,我希望写一个简单的MIPS汇编片段来做同样的事情。
所以,在这个小函数中,你需要考虑五个数字,你可以使用五个寄存器来处理这些数字(如果你聪明的话,也可以使用更少的寄存器)。还有一些相等检查和循环。
因此,您应该查看add
、bne
、beq
和j
指令。还要查看标签(与bne
和beq
一起使用),并决定使用哪种调用约定,以便知道与j
一起使用的返回地址和值寄存器。
祝好运!
发布于 2014-08-06 23:05:09
我的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
https://stackoverflow.com/questions/23636644
复制相似问题