首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索数组的Keil ARM7程序

搜索数组的Keil ARM7程序
EN

Stack Overflow用户
提问于 2014-12-10 00:48:38
回答 2查看 2.6K关注 0票数 0

该程序需要读取10个数字数组的元素,并计算该数组中的零数,并将其存储在R7中。这是我到目前为止所开发的..。

代码语言:javascript
复制
    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。我真搞不懂为什么。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-10 01:05:01

R0永远不会改变,所以加载到R3中的值永远不会改变,所以循环的测试总是以同样的方式出现。(您不需要在B CNT之后使用MOVE1,因为这是下一条指令。)

票数 1
EN

Stack Overflow用户

发布于 2014-12-10 01:12:29

您没有使用R2对数组进行索引,所以您要将第一个值与零值进行10次比较。我不是ARM专家,但是,如果您想这样做,那么您将不得不使用等效的LDR R3,R0+R2语法。

事实上,何必费心呢?只需将4添加到指针(R0)中,而不是R2,它总是会找到正确的位置。

以下几点:

代码语言:javascript
复制
BEQ MOVE1
B CNT

一个有条件的分支,后面跟着一个无条件的分支,意味着你的比较错了。(除非您有大量的代码块,并且需要从相对于绝对寻址)。

不要数下去,要数下去。

代码语言:javascript
复制
MOV R1, #10
...
SUB R1, #1
BNE LOP      ; Branches unless R1 is now zero

您可能还会发现LDR设置了零标志(我只遇到过一个没有尝试或查找它的汇编程序),因此没有必要将它与零进行实际比较。

当您使用汇编程序时,您必须学会灵活地思考。一个更紧凑的代码版本可能是:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27391613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档