1

我正在开发一个计算二进制字符串的 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子程序无限循环,用调试器查看后发现ADDAND指令只在第一次循环中执行(这就是无限循环的原因),然而,整个循环没有中断,寄存器 9 每次迭代都会继续递增。我想不出任何理由让这些指令停止执行。任何人都遇到过这种行为或知道会导致它的原因吗?如果您需要有关任何事情的更多信息,请询问。

4

2 回答 2

2

在你的zerosloop你需要OR r1, r2, r1代替AND.

你也应该用它CMN r1, #1来找出是否r1都是1s。

于 2012-12-17T00:16:22.220 回答
0

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

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

于 2012-12-17T12:27:54.683 回答