我在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);
}发布于 2009-12-02 11:47:54
SPIM是一个MIPS解释器,所以你必须用MIPS汇编语言来编写这些程序。您可以查看以下命令的输出
gcc -s
,它生成程序集表示,但是我怀疑它仅限于您正在运行的GCC所在的体系结构(很可能是X86。X86 != MIPS)。
几周前,当我不得不为我的基础课程编写MIPS汇编时,我大量使用了维基百科的文章和以下网站:http://en.wikibooks.org/wiki/MIPS_Assembly/Arithmetic_Instructions
发布于 2009-12-02 12:15:11
我写了一个编译器,用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试一试,如果它工作,它根本没有优化,但你可以得到一个线索,并根据你的需要修改它。
发布于 2009-12-02 12:02:21
你是从头开始写阶乘,还是“编译”C代码?两种截然不同的方法。
当我做一些RISC编码时,我发现最好的办法是把它伪编码出来,然后直接实现它,而不用引用C语言。
如果你正在编译,那么每条C语句都需要扩展到等价的RISC程序集。
编辑:以下是一些信息:U of Idaho课程中使用MIPS/spim的页面。
https://stackoverflow.com/questions/1830524
复制相似问题