2014-12-01 3 views
0

У меня есть код сборки, содержащий массив, и я просто не могу понять, что на самом деле результат в регистре $ s2. Если бы кто-то мог помочь и объяснить или упростить это для меня, это было бы здорово. Вот код:Проблема с ассемблером MIPS - массивы

.data  arr:  .word  3 2 -6 1 4 10 530 115 2231 1422 
      arrSize: .word 10 
.text 
.global main 

main: 
la  $s0, arr 
la  $t0, arrSize 
lw  $s1, 0($t0) 
add  $s2, $zero, $zero 

loop: 
lw  $t1, 0($s0) 
andi  $t2, $t1, 1 
bne  $t2, $zero, skip 
addi  $s2, $s2, 1 

skip: 
addi  $s0, $s0, 4 
addi  $s1, $s1, -1 
bne  $s1, $zero, loop 

end: 
add  $v0, $zero, $s2 

ответ

1

Я добавил некоторые псевдо-код комментарии к коду:

.data  arr:  .word  3 2 -6 1 4 10 530 115 2231 1422 
      arrSize: .word 10 
.text 
.global main 

main: 

    la  $s0, arr   ;; s0 = arr   // init s0 = pointer to start of arr 
    la  $t0, arrSize  ;; t0 = &arr_size // get no of elements in arr 
    lw  $s1, 0($t0)   ;; s1 = arr_size = 10 
    add  $s2, $zero, $zero ;; s2 = 0   // init count of even elements = 0 

    loop:       ;; do {    // for all elements in arr do 
    lw  $t1, 0($s0)   ;; t1 = *s0  // get element from arr 
    andi  $t2, $t1, 1   ;; t2 = t1 & 1 // test element for odd/even-ness 
    bne  $t2, $zero, skip ;; if (t2 != 0) // if not odd (i.e. even) then 
    addi  $s2, $s2, 1   ;;  s2++  //  increment count in s2 

skip: 
    addi  $s0, $s0, 4   ;; s0++   // increment pointer to next element in arr 
    addi  $s1, $s1, -1  ;; s1--   // decrement count of elements to process 
    bne  $s1, $zero, loop ;; } while (s1 != 0) // end of do loop 

end: 
    add  $v0, $zero, $s2  ;; v0 = s2   // return result in v0 

Кажется, что это просто перебирает элементы arr, тестирование каждого элемента, чтобы увидеть, если он четный и увеличивает количество найденных элементов. Конечный результат (в v0 и s2) будет равен 6, так как в массиве 6 элементов.

+1

Не будет ли он считать четные элементы, так как он перескакивает на 'skip', если установлен lsb? (Я предполагаю, что ассемблер заполняет слоты ветви задержки с помощью NOP или некоторых таких, так как вам не нужно принимать отложенное ветвление во внимание с помощью SPIM/MARS IIRC). – Michael

+0

@Michael: да, я думаю, что вы правы - я перепутал логику - позвольте мне исправить это ... –

+0

Возможно, комментарий для 'addi' должен быть изменен на' if (t2 == 0) 'или' if (t2! = 0) goto skip; ' – Michael