Raspberry Pi で ARM アセンブリを調べ始めたところです (コメントで適切なドキュメントへのリンクをいただければ幸いです)。
次のコマンドを使用してアセンブラーにコンパイルした C++ プログラムがあります。
g++ -S -fverbose-asm -march=armv6j -mtune=arm1176jzf-s file.cpp
その後、file.s を調べることができます。これは素晴らしいことであり、何らかの意味があります。ただし、ARMチップには15個の汎用レジスタがあると思いました。このコードを読んだところ、r1-r3のみを使用していることがわかりました
mov r3, r3, asl #1 @ tmp166, tmp166,
add r3, r3, r2 @ tmp166, tmp166, D.24883
mov r2, r3, asl #3 @ tmp167, tmp166,
add r3, r3, r2 @ tmp166, tmp166, tmp167
rsb r2, r3, r1 @ D.24883, tmp166, tmp161
生成されたコードで r3 よりも上位のレジスタの発生を確認できません。私が根本的に理解していることはありますか?これには正当な理由がありますか?または、生成されたコードは最適ではありませんか?
アップデート
- コンパイルすると
-O2
、より多くのレジスタが使用されるため、GCC が選択したものであると想定しています。なぜ、またはどのスイッチがこの動作を制御するのかはよくわかりません。 - r1 -r4 は状態をリセットせずに使用できることも読んだので、小さな関数の場合、これはより効率的だと思いますか?