该程序需要读取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。我真搞不懂为什么。
提前谢谢。
发布于 2014-12-10 01:05:01
R0永远不会改变,所以加载到R3中的值永远不会改变,所以循环的测试总是以同样的方式出现。(您不需要在B CNT之后使用MOVE1,因为这是下一条指令。)
发布于 2014-12-10 01:12:29
您没有使用R2对数组进行索引,所以您要将第一个值与零值进行10次比较。我不是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
EXThttps://stackoverflow.com/questions/27391613
复制相似问题