Arrays MIPS汇编程序故障-数组
我有一个包含数组的汇编代码,我无法理解$s2寄存器中的实际结果。如果有人能帮我解释或简化,那就太好了。 代码如下: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 $
.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实现是“如果是奇数,则跳过,否则递增计数”。非常感谢!正是我需要的。