我正在研究一个计算二进制字符串的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每次迭代都会继续递增。 我想不出任何理由让这些指令停止执行。任何人在遇到此行为之前或知道会导致什么?如果您需要更多信息,请询问。
答案 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)