0

我有一个包含数组的汇编代码,我根本无法理解 $s2 寄存器中实际显示的结果。如果有人可以为我提供帮助并解释或简化它,那就太好了。这是代码:

.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
4

1 回答 1

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,测试每个元素以查看它是否是偶数,并增加找到的偶数元素的计数。最终结果(inv0s2)将为 6,因为数组中有 6 个偶数元素。

于 2014-12-01T12:52:39.327 回答