我有这样的代码转换成装配任务:转换C代码,以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;
}
这里是我到目前为止,并注意循环,循环2和循环3相当大致相同:
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是第二个参数。
感谢您的任何指导!
我看错了,还是原来的函数可以实现为一个简单的线性循环?当然,对于浮点数不是这样,但对于整数,顺序应该没有区别。 – sh1
它可能是。我没有做这个功能,我的一位教授做了。 @ sh1 – Logan
在那些情况下(尽管在面试中更多),我想知道他们是否在测试你是否在修改代码之前修改了代码(这是一个很好的行业惯例,因为你不需要真正想在优化算法之后再对程序进行手工编码),或者他们只是没有正确地考虑他们的测试用例,并会因为改变算法而给你打分。 – sh1