2013-11-09 461 views
2

這裏的C代碼:將C代碼轉換到MIPS彙編語言

int A[10]; 
int sum = 0; 
int i = 0; 

while (i<10){ 
sum += A[i++]; 
sum *= 2; 
} 

這裏是我採取在轉換成MIPS:

我明白,在一個基本while循環,例如:i = $s15 = $s3

i=0; 
while(i != 5) 
i=i+1; 

addi $s1, $zero, 0 #i=0 

loop: beq $s1, $s3, endloop 
add $s1, $s1, 1 
j  loop: 

endloop: 

我只是遇到了麻煩,或者遇到了困難的時間引入了sum+= A[i++];sum*= 2;的稍微更難的循環。

任何幫助,非常感謝。我不是在尋找一個完整的解決方案,所以請幫我認爲

謝謝!

+0

'總和* = 2'是'MUL <寄存器保持總和><寄存器保持總和> 2'。然後'sum + = A [i ++]'是'add sum,sum,

(i)>'(也許語法略有不同,取決於你的彙編程序如何處理內存尋址),然後是'add i, i,1'(其中'i'是保存'i'的值的寄存器)。 – 2013-11-09 07:28:04

+1

爲什麼你的編譯器不這樣做? –

回答

3

它分解:

sum += A[i++];變得sum = sum + A[i]; i = i + 1;這在MIPS組件可以表示:

add $t0 $s3 $s1 #index A at i 
lw $t1 0($t0) #load A at i 

add $s2 $s2 $t1 #add A[i] to sum 
addi $s3 $s3 1 #increment i 

sll $s2 $s2 1 #double sum 
+0

謝謝你的解釋。我今晚將會講述這件事並且說清楚。我感謝您的幫助! –

+0

歡呼,歡迎來到SO。如果您發現我的答案有幫助,請將其標記爲已接受:) –