ARM循环停止执行指令

时间:2012-12-16 23:43:29

标签: loops assembly arm

我正在研究一个计算二进制字符串的1和0数的程序。 我的CountOnes子程序按预期工作:

countOnes   MOV r1, r0      ;mov random number into r1
            TEQ r1, #0      ;test if all 0
            MOVEQ   pc, r14     ;if all 0's, brake
onesloop    SUB r2, r1, #1  ;subtract 1
            AND r1, r2, r1  ;and on r1 and r2
            ADD r9, r9, #1  ;increment loop counter
            TEQ r1, #0      ;test if all 0
            BNE onesloop    ;if not all 0's, loop
            MOV     pc, r14     ;return


countZeros  MOV r1, r0      ;mov random number in r1
            MVN r8, #0      ;fill r8 with 1's
            TEQ r1, r8      ;test if number is all 1's
            MOVEQ   pc, r14     ;if all 1's, break
zerosloop   ADD r2, r1, #1  ;add 1 to r2
            AND r1, r2, r1  ;and r1 and r2
            ADD r9, r9, #1  ;increment loop count
            TEQ r1, r8      ;test if all ones
            BNE zerosloop   ;if not all 1's, loop
            MOV pc, r14     ;return

然而,我的countZeros子程序无限循环,在用调试器查看之后,结果是 ADD AND 指令仅在第一次执行时执行然而,循环(这是无限循环的原因),整个循环不会被破坏,寄存器9每次迭代都会继续递增。 我想不出任何理由让这些指令停止执行。任何人在遇到此行为之前或知道会导致什么?如果您需要更多信息,请询问。

2 个答案:

答案 0 :(得分:2)

zerosloop OR r1, r2, r1中,您需要AND而不是CMN r1, #1

此外,您应该使用r1来确定1是否全部是{{1}}。

答案 1 :(得分:0)

关于ARM人口计数的这篇文章可能值得一看:

http://www.sciencezero.org/index.php?title=ARM:_Count_ones_(bit_count