将C代码转换为MIPS(汇编源代码)

时间:2016-02-14 00:02:19

标签: assembly mips

我的任务是将此代码转换为汇编代码:

int prodArray (int A[], int n) {
   if (!n)
        return 1;
   else if (n == 1)
        return A[0];
   int mid = n / 2;
   int left = prodArray(A, mid);
   int right = prodArray(A + mid, n - mid);
   return left * right;
}

这是我到目前为止所做的,并注意loop,loop2和loop3几乎相同:

main:
    add $t0, $0, $0         # Initialize t0
    add $t1, $0, $0         # Initialize t1
    addi $t4, $0, 1         # Make t2 equal to 1

# Main Loop
loop:
    beq $a1, $t2, exit      # If the second argument is 0 branch to exit
    beq $a1, $0, exit2      # If the second argument is 1 branch to exit2
    srl $t2, $a1, 1         # Divide n by 2
    sll $t3, $a1, 1         # Multiply n by 2
    add $a1, $t2, $0        # make n half
    b loop2                 # branch to loop

loop2:
    beq $a1, $t2, exit
    beq $a1, $0, exit2
    srl $t2, $a1, 1
    sll $t3, $a1, 1
    add $a0, $a0, $t2       # Make a0 point to A + mid
    b loop3

loop3:
    beq $a1, $t2, exit
    beq $a1, $0, exit2
    srl $t2, $a1, 1
    sll $t3, $a1, 1
    add $a1, $t2, $0
    b loop

# exit
exit:
    ja $ra, $t4

exit2:
    ja $ra, 0(a1)

我不擅长装配,需要任何帮助。请注意,a0表示第一个参数,a1表示第二个参数。

感谢您提供的任何指导!

2 个答案:

答案 0 :(得分:0)

如果您有gcc编译器,请使用-S开关,例如:gcc -S helloworld.c。这将生成带有汇编代码的.s文件。这个问题有更多信息:How do you get assembler output from C/C++ source in gcc?

答案 1 :(得分:0)

这里有几点指示......

  1. 您开始使用的C代码中没有任何循环,因此程序集中不应有任何循环。这个函数自己调用,但是应该像任何其他子例程调用一样实现(即使用jal),而不是试图将函数内联到自身。 (实际上,如果没有一些相当重要的重构,你就不能内联这个子程序。)

    请记住在子程序调用后保存您需要恢复的堆栈上的任何寄存器,包括$v0$v1中的原始参数以及返回地址$ra

  2. 没有ja条指令。在子例程结束时使用的正确指令是jr $ra,并且在执行之前需要将返回值放在$v0中。

  3. 不要忘记分支延迟插槽!我看到一些指令可能最终执行的地方,你不想要的;你现在可能只想在每个条件分支之后粘贴一个nop