2015-10-22 2 views
0

Итак, у меня возникли проблемы с переводом кода на C на mips. Задача состоит в том, чтобы написать код mips для рекурсивной функции, которая суммирует четные числа и возвращает целое число. Я считаю, что мой C код правильный:MIPS рекурсия прошла неправильно

int sumRec(int arr[], int len){ 
    if(len==0){ 
     return 0; 
    } 
    else if(arr[len]%2==0){ 
     return arr[len]+sumRec(arr,len-1); 
    } 
    else{ 
     return 0+sumRec(arr,len-1); 
    } 
} 

Но, когда речь идет о переводе его в MIPS, у меня большие трудности. Я думаю, что логически это хорошо написано, но я не могу понять, почему у меня так много ошибок на моем выходе (исключения из 4 и 7 типов). Это мой код:

.data 
     test:    .word 1, 2, 3, 4, 5 
     length:   .word 5 
     x:    .word 0 
     y:    .word 2 
     summ:    .asciiz "summ: " 
     nl:    .asciiz "\n" 

    .text 

    main: 
     #prints "summ: " 
     li $v0, 4 
     la $a0, summ 
     syscall 


     #calling sumRec 
     la $a0, test   
     la $t0, length 
     lw $a1, 0($t0) 
     jal sumRec  

     #print output 
     move $a0, $v0 
     li $v0, 1 
     syscall 

     #exit 
     li $v0, 10 
     syscall 


    sumRec: 
     addi $sp, $sp, -12 
     addi $t1, $t0, -1  #compute len-1 
     lw  $t6, y 
     sw  $t1, 0($sp)   #save len-1 in stack 
     sw  $ra, 4($sp)   #save return address 
     bne  $t1, $zero, else_01 
     li  $v0, 0     #set return to 0 
     addi $sp, $sp, 12 
     jr  $ra 

    else_01: 
     li  $t7, 4     #t7 = 4 
     mult $t1, $t7    #len-1 * 4 
     mflo $t2 
     add  $t2, $t2, $a1 
     lw  $t3, 0($t2) 
     div  $t2, $t6 
     mfhi $t4 
     beq  $t4, $zero, else_02 
     sw  $t3, 8($sp) 
     move $a1, $t0 
     jal  sumaRec 
     lw  $t3, 8($sp) 
     add  $v0, $v0, $t3 
     lw  $ra, 4($sp) 
     addi $sp, $sp, 12 
     jr  $ra 

    else_02: 
     move $a1, $t1 
     jal  sumaRec 
     lw  $ra, 4($sp) 
     addi $sp, $sp, 12 
     jr  $ra 

Может кто-нибудь, пожалуйста, помогите мне разобраться? Где я неправ?

ответ

0

Последний элемент массива - arr[len-1], а не arr[len].

int sumRec(int arr[], int len){ 
    if(len==0){ 
     return 0; 
    } 
    else if(arr[len-1]%2==0){ 
     return arr[len-1]+sumRec(arr,len-1); 
    } 
    else{ 
     return 0+sumRec(arr,len-1); 
    } 
} 
+0

Это странно, но они работают так же, как и ваша, и моя версия. Как вы думаете, из-за этого у меня проблема с моим MIPS? –

+0

@NemanjaZoric. Тогда возникает проблема с вашим кодом MIPS. Подобное поведение на самом деле ожидается с учетом ваших входов, потому что 'arr [5]' заканчивается тем, что указывает на метку length:. Это заставляет вас суммировать по массиву '{2,3,4,5,5}' вместо '{1,2,3,4,5}', но нет никакого эффекта, потому что дополнительные '5' и проигнорированные' 1 не вносят вклад в сумму. Если вы измените свой «1» на «2» или уменьшите размер массива (делая длину четным «4»), вы получите другое поведение. – MooseBoys

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