我有這樣的代碼轉換成裝配任務:轉換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