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サブルーチンは無期限にループし、デバッガーで確認した後、ADDおよびAND命令はループを介して初めて実行されるだけであることがわかりました(これが無限ループの理由です)。ループは中断されません。レジスター9は、反復ごとにインクリメントされ続けます。それらの命令が実行を停止する理由は考えられません。誰かが以前にこの行動に遭遇したり、それを引き起こす原因を知っていますか?何かについてもっと情報が必要な場合は、ただ聞いてください。

4

2 に答える 2

2

あなたの代わりにzerosloopする必要があります。OR r1, r2, r1AND

また、すべてがであるかどうかを確認するために使用するCMN r1, #1必要があります。r11

于 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 に答える