それで、ビット操作に関して以前にインタビューの質問がありました。同社は有名なGPU企業です。私はアセンブリ言語のバックグラウンドがほとんどなく (コンピューター アーキテクチャの博士課程の学生であるにもかかわらず)、この話が示すように、失敗しました。質問は簡単でした:
「32 ビット レジスタの 1 の数をカウントする高速なコードを記述してください。」
現在、アームの組み立てを勉強中です。当然のことながら、私はこの問題に再び立ち返り、ISA を勉強するだけでこのコードを思いつきました。
あなたがそこにいる専門家を武装させるために、これは正しいですか?これを行うより速い方法はありますか?初心者なので当然不完全だと思います。「xx」の AND 命令は冗長に感じますが、ARM でレジスタをシフトする方法は他にありません...
R1 には最後にビット数が含まれ、R2 はカウントしたいビットを含むレジスタです。r6 は単なるダミーレジスタです。コメントは () で囲みます。
MOV R1, #0 (initialize R1 and R6 to zero)
MOV R6, #0
xx: AND R6, R6, R2, LSR #1 (Right shift by 1, right most bit is in carry flag)
ADDCS R1, #1 (Add #1 to R1 if carry flag is set)
CMP R2, #0 (update the status flags if R2 == 0 or not)
BEQ xx (branch back to xx until R2==0)