1

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 よりも上位のレジスタの発生を確認できません。私が根本的に理解していることはありますか?これには正当な理由がありますか?または、生成されたコードは最適ではありませんか?

アップデート

  1. コンパイルすると-O2、より多くのレジスタが使用されるため、GCC が選択したものであると想定しています。なぜ、またはどのスイッチがこの動作を制御するのかはよくわかりません。
  2. r1 -r4 は状態をリセットせずに使用できることも読んだので、小さな関数の場合、これはより効率的だと思いますか?
4

3 に答える 3

1

レジスターの使用は 2 つの制約によって定義されますが、それらがどの程度効果的に使用されるかはコンパイラー次第です。

  • アビ
  • ARM/Thumb 実行状態

ABI は規約です。その名前が示すように、バイナリ互換性を提供することを示しています。ABI の一部であるARM ABIは、関数呼び出しに使用されるレジスタを定義します。ARM ABIステート r0 ~ r3 は関数呼び出しに使用されます。ARM ABI をサポートする ARM コンパイラは、このように動作する必要があります。つまり、これはレジスタの使用に関する制約です。

もう 1 つの制約は、ARM/Thumb 実行モードです。一部の ARM CPU は、ほとんどの命令が ARM コア レジスタの最初の 8 つの r0 ~ r7 (ARM ARM 4.1) にのみアクセスできる Thumb 実行モードで実行できます。これにより、コンパイラーが使用できるレジスターの数にも制約が課されます。

残りは、コンパイラの品質、最適化モード、およびデバッグ サポート次第です。

于 2013-06-21T16:59:09.997 に答える
1

The ARM ABI, which is not uncommon to other processor families, is that when the compiler generates code for the target, some registers are used for passing in parameters, one/some registers are used for returning a result, and some registers dont have to be preserved, basically you can muck with them without worry, and the rest of the registers you need to preserve (push/pop to/from stack) if you need to use them.

arm uses r0-r3 to pass in parameters, and r0 to return a result. r0-r3 are also considered disposable (and perhaps one more high register) so if the program is simple enough and doesnt need too many registers it will try to use r0-r3 for performance (not needing to use the stack).

Crafting high level code to drive the machine code is an art form you need to understand the compilers and processor, etc. You are on the right path but need to write many many more functions compile and examine the machine code generated.

于 2013-06-21T15:01:23.653 に答える