Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Keil ARM7程序,用于搜索数组_Assembly_Keil_Arm7 - Fatal编程技术网

Assembly Keil ARM7程序,用于搜索数组

Assembly Keil ARM7程序,用于搜索数组,assembly,keil,arm7,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 CM

该程序需要读取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
问题是它从未进入移动1。我真的不明白为什么


提前感谢。

R0
永远不会更改,因此加载到
R3
中的值永远不会更改,因此循环的测试结果总是相同的。(而且在
MOVE1
之后不需要
B CNT
,因为这是下一条指令。)

您没有使用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

谢谢你,先生。。。我刚刚发现了我在LOP标签中包含的post索引模式。多么迷人的汇编语言啊。