私は 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 に変更すると、エラーもなくなります。しかし、私には理由がわかりません。
どうしたの?そして、私は何を間違っていますか?