2016-09-13 32 views
0

Thumb対応のARMv7では、BX命令を使用してすべてのベニアを回避できるのは間違いありませんか?ARM Cortex A7:メモリベニアを避けますか?

この命令は32ビットのレジスタを使用するので、良いですか?

「はい」の場合、生成されたコードにベニアが表示されたら、マシンの出力を特殊化する必要があります。

おかげ

+0

一般的に、リンカーは、ターゲットが遠すぎる場合には、ベニアリングブランチを開始します。コードの大きさはどれくらいですか? – Notlikethat

+0

ARMv4Tインターワーキングベニアの場合(私が忘れてしまったことがあった)、最適な解決策は、必要なものに応じて「ARMv4Tをターゲットにしない」または「Thumbコードを気にしない」のいずれかですサポートする。私たちはCコード(この場合は命令を正確に選ぶことはできません)またはアセンブリコード(この場合、適切な場合は 'blx'を使用する位置にあるべきです)を話していますか? – Notlikethat

+0

これは本質的にgpuスタックであり、アドレスは互いに離れている可能性があります。 BX命令は私の問題を解決し、最終的にAndreaが示唆したように、相対ジャンプが使用されます。ありがとうNotlikethat :) – Larry

答えて

0

BXは、32ビットのレジスタがかかるため、あなたが全体のアドレス空間をカバーすることができますので、はい、veenersのための必要はありません。

もちろん、32ビットの値をレジスタにロードする必要があります。これは通常、定数プーリングを意味します。そのため、すべてのサイクルを絞り込み、プログラムが大きすぎない場合は、相対的な枝でオフ。 @Notlikethatが指摘しているように、レジスタにまだアドレスがない場合は、の場合はLDR PC, ...しか使用できません(ARMv4Tインターワーキングをサポートする必要がない場合)。

相対非条件付き32ビットThumbブランチには24ビットのアドレス空間があるため、+/- 16MBに達することができます(他の場合はhereを参照)。 ELFを実行している場合、は実際にはで、16ビットの相対Thumb分岐には注意が必要です。ターゲットを24ビットでアドレス指定できない場合、32ビットブランチは24ビットの再配置を生成し、リンカはビアを挿入します。 16ビットのブランチは11ビットの再配置を生成し、ELF for ARMは、それらのためにビーナーを生成するためにでなく、であることを指定しているため、リンク時に範囲外の分岐が発生する可能性があります。

+0

ポイントに。ありがとうAndrea – Larry

+0

2番目の段落を再入力してください。もしあなたがまだレジスタにアドレスを持っていなければ、実際に 'ldr pc、...'しかできないときは 'bx'を使ってポイントがありません。 ARMv4Tインターワーキングをサポートする必要があります)。 – Notlikethat

+0

@Notlikethat確かに、答えを編集しました。 –

関連する問題