Как получить адрес постоянной в MIPS? - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь реализовать цикл for в мипах следующим образом:

#  {
#     int sum = 0;
#     for(int x = 0; x < n; x++)
#       if ( v[x] > 2 )
#           sum += v[x];
#     return sum;
#  }

У меня есть цикл правильно, но я не могу правильно определить размер цикла.Циклы работают так, как задумано, но работают еще один раз.Он должен печатать 31, но в итоге он запускает цикл в дополнительное время и получает где-то 10, а затем получает 41 в качестве конечного результата.

Вот мой код:

            .eqv        SIZE        8  
values:     .half       6, 5, 1, 9, -2, 3, 8, 2
endl:       .asciiz     "\n"
endv:

# -------------------------------------------------#  text/code section
.text
.globl  main 
main:
# ------
    #TODO: call doSum(values, SIZE)
    la  $s0, values #&v[0]
    la  $s7, endv   
    li  $a0, 0      #sum = 0

loop:
    lh  $t1, ($s0)  #v[X]
    li  $t2, 2      #$t2 = 2
    bgt $t1, $t2, sumPlus
    j   increment   #skip over sumPlus if not > 2

sumPlus:
    add $a0, $a0, $t1   #sum += v[x]

increment:
    add $s0, $s0, 2 #x++
    blt $s0, $s7, loop

1 Ответ

0 голосов
/ 11 декабря 2018

У вас есть символ перевода строки и нулевой терминатор (endl: .asciiz "\n") перед endv, поэтому вы включаете их в массив, из которого вы суммируете.Я не знаю много о MIPS, но потому что \ n имеет значение 10 (dec), а \ 0 имеет значение 0. Я предполагаю, что это байты, и это выполняется на машине с прямым порядком байтов,так что как подписанное полуслово они интерпретируются как 10 (dec).

Я думаю, что только перемещение метки endv к фактическому концу массива (непосредственно перед endl:) решит это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...