[英]Tryig to translate C code to MIPS assembly to work on spim
我写了一个用于在C上计算阶乘的代码,但是我试图将其转换为汇编语言以在PCspim上工作,但不知道如何? 有人可以帮忙吗?
C代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void factorial(long argument, long *result) {
if(argument < 2) {
printf("%ld", *result);
} else {
long before = argument - 1;
*result = *result * before;
argument = before;
factorial(argument, result);
}
}
int main() {
long argument, answer, *result;
printf("Factorial ");
scanf("%ld", &argument);
result = &answer;
*result = argument;
printf("%ld! = ",argument);
factorial(argument, result);
}
SPIM是MIPS解释器,因此您必须在MIPS程序集中编写这些过程。
gcc -s <文件名>
会生成程序集表示形式,但是我怀疑它仅限于运行GCC的体系结构(可能是X86。X86!= MIPS)。
几周前,当我不得不为基础课程编写MIPS程序集时,我大量使用了Wikipedia文章和以下网站: http : //en.wikibooks.org/wiki/MIPS_Assembly/Arithmetic_Instructions
我编写了一个有趣的编译器,其中包含C到SPIM asm语法的子集(当然,支持递归)。
根据它
int f(int x)
{
if (x == 1)
return 1;
else
return (x*f(x-1));
}
int main (void) {
f(8);
}
编译为
.data
.align 4
.align 1
.text
.globl main
main:
subu $sp, $sp, 32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28
li $t6, 8
move $a0, $t6
jal f
lw $ra, 20($sp)
lw $fp, 16($sp)
addu $sp, $sp, 32
jr $ra
f:
subu $sp, $sp, 36
sw $ra, 24($sp)
sw $fp, 20($sp)
addiu $fp, $sp, 32
li $t0, 1
bne $a0, $t0, equal0
li $t1, 1
b equal1
equal0:
li $t1, 0
equal1:
li $t2, 0
beq $t1, $t2, if2
li $v0, 1
lw $ra, 24($sp)
lw $fp, 20($sp)
addu $sp, $sp, 36
jr $ra
b if3
if2:
li $t3, 1
subu $t4, $a0, $t3
sw $a0, 0($sp)
move $a0, $t4
jal f
move $t5, $v0
lw $a0, 0($sp)
mulou $v0, $a0, $t5
lw $ra, 24($sp)
lw $fp, 20($sp)
addu $sp, $sp, 36
jr $ra
if3:
lw $ra, 24($sp)
lw $fp, 20($sp)
addu $sp, $sp, 36
jr $ra
尝试一下它是否有效,它根本没有进行优化,但是您可以根据自己的需要获得线索并对其进行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.