2

私は TI MCU (msp430) で gnu アセンブラを使用しており、アセンブリで混合アラインメントの変数を定義したいと考えています。バイト アラインされているものもあれば、ワード (16 ビット) アラインされている必要があるものもあります。また、いくつかの変数をアセンブリ言語モジュールに対してプライベートにし、他の変数を共通 (グローバル) にしておく必要があります。したがって、デフォルトとして .lcomm を使用し、必要に応じて .global を使用して上書きしたいと思います。

しかし、バイト アライン ディレクティブを適用した後でも、GCC でコンパイルされたプログラムのリンク中にアラインメント エラーが発生します。

ssegLED.c:200: 危険な再配置: アラインされていないアドレス

そして、その行は、ワードでアラインされているはずのデータにアクセスしようとしているだけです:

if (ノブ) { ... }

問題の原因となっているアセンブリ言語モジュールでは、データ パックを効率的にメモリに入れようとしています。したがって、サブセクションを使用して、同様の種類のデータをグループ化し、異なる位置合わせのデータ間に穴が形成されないようにしたいと考えています。例: デフォルトのサブセクション (0) にはすべてのワード アライン データが必要ですが、サブセクション 1 にはアラインされていないデータが必要です。

キーストローク、直交、キー状態、およびノブの 4 つの変数を定義するために使用されるアセンブリ / .s コードを次に示します。最初の 3 つはバイト境界で整列され、最後の 3 つはワード境界で整列されます。

.section    .bss    ;; doesn't matter if .bss or .section .bss -- same err.
.subsection 1
.balign     1 ;; can add a  ,0 -- but it changes nothing

.global     keystroke
.type       keystroke,@object
.size       keystroke,1 ;; Tried with and without this line, no change...
.lcomm      keystroke,1

.lcomm      quadrature,1
.lcomm      keystate,1  

.section    .bss
.subsection 0
.balign     2 ;; tried adding ,0 -- but it fixes nothing

.global     knob  ;; Present knob value
.type       knob, @object
.size       knob, 2     ;; doesn't affect error whether commented out/not
.lcomm      knob, 2

現在、ミスアラインメントの問題を防ぐために私が行っていることが 2 つあります。GNU AS マニュアルによると、サブセクション 0 はサブセクション 1 の前にメモリに配置する必要があります。したがって、セクション 0 は、デフォルト セクションとして自動的にワード アラインされた状態で開始されます。次に、.balign ディレクティブを明示的に使用しています。

しかし、それは機能しません...そして .b2align に変更しても修正されません。

サブセクション 1 の変数 keystroke、quadrature、および keystate に別のバイト アライン変数を明示的に追加することで、エラーを解消できますサブセクション全体が単語境界で終わるようにします。しかし、問題のあるサブセクションの数値が小さい (0) ため、サブセクション (1) の位置合わせは何の効果も持たないはずです....

次に、すべての .lcomm を .comm に変更すると、エラーもなくなります。しかし、私には理由がわかりません。

どうしたの?そして、私は何を間違っていますか?

4

1 に答える 1

0

.lcomm.bss現在のセクションまたはサブセクションが何であるかに関係なく、シンボルをセクション (サブセクション 0) に暗黙的に配置します。そのため、シンボルは単にソースに表示される順序になっているためknob、シングルバイト変数の後に来ます。.balignそれが現在の(サブ)セクションに適用されるため、違いがない理由でもあります。

.fill代わりに使用してみてください。私のテストによると、うまくいくようです。

于 2013-03-05T15:41:51.403 に答える