繁体   English   中英

Tryig将C代码转换为MIPS程序集以在spim上工作

[英]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

尝试一下它是否有效,它根本没有进行优化,但是您可以根据自己的需要获得线索并对其进行修改。

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

当我进行一些RISC编码时,我发现最好将其伪编码并直接实现而不参考C。

如果要编译,则需要将每个C语句扩展为等效的RISC程序集。

编辑:这是一些信息: 爱达荷州课程的U页面使用MIPS / spim。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM