2013-11-09 4 views
2

Вот код C:Преобразование C код MIPS ассемблере

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

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

Вот мое взятие на преобразование в MIPS:

Я понимаю, что в основной во время цикла, такие как: i = $s1, 5 = $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: 

Я просто возникли проблемы, или с трудом всесторонни ding несколько более сложный цикл, где вводятся sum+= A[i++]; и sum*= 2;.

Любая помощь очень ценится. Я не ищу полного решения, поэтому, пожалуйста, помогите мне думаю.

Спасибо!

+0

'сумма * = 2' является' мул <регистр, который содержит сумму><регистр, который содержит сумму> 2'. Тогда 'sum + = A [i ++]' is 'add sum, sum,

(i)>' (возможно, немного другой синтаксис, в зависимости от того, как ваш ассемблер обрабатывает адресацию памяти), а затем 'add i, i, 1' (где 'i' - регистр, содержащий значение' i'). –

+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. Если вы нашли мой ответ полезным, отметьте его как принято :) –

Смежные вопросы