Arrays MIPS汇编程序故障-数组

Arrays MIPS汇编程序故障-数组,arrays,assembly,mips,mars-simulator,Arrays,Assembly,Mips,Mars Simulator,我有一个包含数组的汇编代码,我无法理解$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寄存器中的实际结果。如果有人能帮我解释或简化,那就太好了。 代码如下:

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

我在代码中添加了一些伪代码注释:

.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
.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个偶数元素。

如果设置了lsb,它会跳到
skip
,所以它不会计算偶数元素吗?(我假设汇编程序正在用NOP或类似的东西填充延迟分支槽,因为SPIM/MARS IIRC不必考虑延迟分支)。@Michael:是的,我认为你是对的-我得到了逻辑颠倒-让我来修正……也许
addi
的注释应该更改为
if(t2==0)
如果(t2!=0)转到跳过我更新了注释以使逻辑更清晰-结构化的等价物是“如果不是奇数,则递增计数”,而asm实现是“如果是奇数,则跳过,否则递增计数”。非常感谢!正是我需要的。