2014-06-16 2 views
0

У меня есть следующий код, который фактически должен увеличиваться от 1 до 6 при выполнении арифметики по переменной.Mips loop iteration

Пример в C будет

int res = 0; 
for(i=1; i<6; i++) { 

res += i*i+1; 
} 

Теперь мой MIPS код:

.data 
    res: .word 0 

.text 
    li $t0, 1 #int j = 1 

loop: 
    beq $t0, 6, end  #for(int j = 1; j < 6; j++) 
    add $t0, $t0, 1 
    mul $t1, $t0, $t0 #res += j * j + 1 
    addi $t1, $t1, 1 
    sw $t1, res 
    b loop 
end: 
    li $v0, 1  #checking the end result 
    la $a0, res 
    syscall   
    li $v0, 10  #graceful exit 
     syscall 

По какой-то причине результат я получаю к концу составляет ~ 300 миллионов, и это явно не так. Кто-нибудь видит, в чем проблема? Im довольно новичок в сборке mips.

Thanks

+0

Что такое j в коде C? ты имел в виду меня? – BlackBear

+0

Да, я сделал это, я изменил его выше – user3183230

ответ

0

Вы хотите сделать что-то вроде этого. Я предполагаю, что вы хотите что-то вроде этого:

int res = 0; 
for(i=1; i<6; i++) { 

    res += i*i+1; 
} 

.data 
    res: .word 0 

.text 
    li $t0, 1 #int i = 1 
loop: 
    bgt $t0, 6, exit 
    add $t0, $t0, 1 
    mul $t1, $t0, $t0 
    addi $t1, $t1, 1 
    sw $t1, res // I'm sure you can just move here 
    b loop 

exit: 
+0

. Команда move только позволяет перемещаться из регистров, а res - переменная. – user3183230

+0

ОК, затем придерживайтесь sw. Простите, что прошло некоторое время – KRUKUSA

+0

Это не вычисляет '+ =' часть 'res + = i * i + 1' – markgz

1

У вас есть несколько проблем здесь.

Во-первых, линия, которую вы указали #res += j * j + 1, умножается только, добавление не включено.

Вы, кажется, пытаетесь использовать res, чтобы сохранить общее количество, но вы переписываете его на каждой итерации. На самом деле, не должно быть необходимости хранить res в памяти, регистр для этой цели гораздо более подходит.

.text 
main: 

    move $t2 $zero 
    li $t0 1 

    loop: 

     mul $t1 $t0 $t0 
     addi $t1 $t1 1 
     add $t2 $t2 $t1 # res += i * i + 1 

     addi $t0 $t0 1 
     blt $t0 6 loop 

    # print res 
    li $v0 1 
    move $a0 $t2 
    syscall 

    # exit 
    li $v0 10 
    syscall 

Отпечатки 60.