我的任务是将此代码转换为汇编代码:
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表示第二个参数。
感谢您提供的任何指导!
答案 0 :(得分:0)
如果您有gcc
编译器,请使用-S
开关,例如:gcc -S helloworld.c
。这将生成带有汇编代码的.s
文件。这个问题有更多信息:How do you get assembler output from C/C++ source in gcc?
答案 1 :(得分:0)
这里有几点指示......
您开始使用的C代码中没有任何循环,因此程序集中不应有任何循环。这个函数自己调用,但是应该像任何其他子例程调用一样实现(即使用jal
),而不是试图将函数内联到自身。 (实际上,如果没有一些相当重要的重构,你就不能内联这个子程序。)
请记住在子程序调用后保存您需要恢复的堆栈上的任何寄存器,包括$v0
和$v1
中的原始参数以及返回地址$ra
。
没有ja
条指令。在子例程结束时使用的正确指令是jr $ra
,并且在执行之前需要将返回值放在$v0
中。
不要忘记分支延迟插槽!我看到一些指令可能最终执行的地方,你不想要的;你现在可能只想在每个条件分支之后粘贴一个nop
。