0

该程序需要读取一个由 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。我真的不知道为什么。

提前致谢。

4

2 回答 2

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
于 2014-12-10T01:12:29.533 回答
1

R0永远不会改变,所以加载的值R3永远不会改变,所以你的循环的测试总是以同样的方式出现。(而且你不需要B CNTafter MOVE1,因为那是下一条指令,无论如何。)

于 2014-12-10T01:05:01.100 回答