用于搜索阵列的Keil ARM7程序

时间:2014-12-10 00:48:38

标签: assembly keil arm7

该程序需要读取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。我真的无法弄明白为什么。

提前致谢。

2 个答案:

答案 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