该程序需要读取10个数字的数组元素,并计算该数组中的零个数并将其存储在R7中。这是我迄今为止开发的内容......
AREA addition, CODE, READWRITE
ENTRY
LDR R0,=ARR
MOV R1, #0 ; Loop Iterator
MOV R2, #0 ; Array Index
MOV R7, #0 ; Number Of Zeros In The Array
LOP CMP R1, #10
BEQ EXT
LDR R3, [R0]
CMP R3, #0
BEQ MOVE1
B CNT
MOVE1 ADD R7, R7, #1
B CNT
CNT ADD R2, R2, #4
ADD R1, R1, #1
B LOP
ARR DCD 3,-5,-1,0,10,0,4,-8,7,6
EXT
END
问题是它永远不会进入MOVE1。我真的无法弄明白为什么。
提前致谢。
答案 0 :(得分:1)
R0
永远不会更改,因此加载到R3
的值永远不会更改,因此循环测试始终以相同的方式进行。 (并且B CNT
之后你不需要MOVE1
,因为无论如何这都是下一条指令。)
答案 1 :(得分:1)
您没有使用R2来索引数组,因此您要将第一个值与零值进行十次比较。我不是ARM专家,但是,如果你想这样做,那么你将不得不使用LDR R3的等效语法,[R0 + R2]。
事实上,为什么要这么麻烦?只需将4添加到指针(R0)而不是R2,它总是看到正确的位置。
有几点:
BEQ MOVE1
B CNT
条件分支后跟无条件分支意味着您的比较错误。 (除非你有大量代码,需要从相对到绝对寻址)。
不要数数,倒数。
MOV R1, #10
...
SUB R1, #1
BNE LOP ; Branches unless R1 is now zero
您可能还会发现LDR设置了零标志(我只遇到过一个没有尝试或查找它的汇编程序),因此无需将其实际与零进行比较。
当你使用汇编程序时,你必须学会灵活思考。代码的更紧凑版本可能是:
ENTRY
LDR R0,=ARR
MOV R1, #10 ; Loop Iterator
MOV R7, #0 ; Number Of Zeros In The Array
LOP LDR R3, [R0], #4 ; Get current number, adds 4 to R0 afterwards - points to next number
CMP R3, #0 ; Might not be necessary, see if it works without this
BNE CNT ; Next loop if not zero
ADD R7, R7, #1 ; Add 1 to count then drop down
CNT SUBS R1, R1, #1 ; S suffix sets z flag (New one on me).
BNE LOP
ARR DCD 3,-5,-1,0,10,0,4,-8,7,6
EXT