首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将C代码转换为MIPS汇编以在spim上工作

尝试将C代码转换为MIPS汇编以在spim上工作
EN

Stack Overflow用户
提问于 2009-12-02 11:42:09
回答 3查看 4K关注 0票数 0

我在C上写了一个计算阶乘的代码,但是我试图把它翻译成汇编语言在PCspim上工作,但我不知道怎么做??有人能帮帮忙吗?

C代码:

代码语言:javascript
复制
 #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);
 }
EN

回答 3

Stack Overflow用户

发布于 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

票数 1
EN

Stack Overflow用户

发布于 2009-12-02 12:15:11

我写了一个编译器,用C到SPIM asm语法的子集(当然支持递归)来做这件事。

根据它

代码语言:javascript
复制
int f(int x) 
{
  if (x == 1)
        return 1;
    else
        return (x*f(x-1));
}

int main (void) {
  f(8);
}

编译为

代码语言:javascript
复制
    .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

试一试,如果它工作,它根本没有优化,但你可以得到一个线索,并根据你的需要修改它。

票数 1
EN

Stack Overflow用户

发布于 2009-12-02 12:02:21

你是从头开始写阶乘,还是“编译”C代码?两种截然不同的方法。

当我做一些RISC编码时,我发现最好的办法是把它伪编码出来,然后直接实现它,而不用引用C语言。

如果你正在编译,那么每条C语句都需要扩展到等价的RISC程序集。

编辑:以下是一些信息:U of Idaho课程中使用MIPS/spim的页面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1830524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档