私はバイナリ文字列の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は、反復ごとにインクリメントされ続けます。それらの命令が実行を停止する理由は考えられません。誰かが以前にこの行動に遭遇したり、それを引き起こす原因を知っていますか?何かについてもっと情報が必要な場合は、ただ聞いてください。