私はアセンブリプログラミング(ガス、特に)に時間を費やしています、最近、私はalign命令について学びました。私は非常に基本的なことを理解していると思いますが、その性質やアライメントをいつ使うべきかをより深く理解したいと思います。アセンブリで明示的な整列指示文を使用する必要があるのはいつですか?
たとえば、私は単純なC++ switch文のアセンブリコードについて疑問を持っていました。
.section .rodata
.align 4
.align 4
.L8:
.long .L2
.long .L3
.long .L4
.long .L5
...
.ALIGN 4は、これらのメモリをフェッチすることを保証する次の4バイト境界上の次のデータを整列させる:私は、特定の状況下でのステートメントをスイッチは、コードの次の数行のように、ジャンプテーブルに基づいていることを知っています場所は効率的ですよね?ミスアライメントを引き起こすswitch文の前に何か起こっている可能性があるので、これが行われると思います。しかし、なぜ実際に.alignへの2つの呼び出しがありますか? .alignを呼び出す際に、またはデータの新しいブロックがメモリに保存されていて、これ以前に何かがミスアラインメントを引き起こしていた場合には、単に実行する必要があるかどうかについての大まかなルールはありますか?
配列の場合、配列が少なくとも32バイトを占めるとすぐに32バイトの境界で整列が行われるようです。このようにする方が効率的ですか、32バイト境界の別の理由がありますか?
文章に関する説明やヒントはありがたいです。
アセンブリ言語の私の習得は、アラインメント命令を持たない6510に制限されています。しかし、C++の設定でのメモリアライメントの知識に基づいて、 "align"命令は実際のCPU命令ではないと思います。これはアセンブラディレクティブで、次のオペコードをどこに挿入するのかを示しています。その場合、行内の2つのalignディレクティブは、1つだけの場合と同じです。 –
'.align 2'はコードを2^2 = 4バイトに整列させると考えました。あなたが '.align 4'を持っているあなたのケースでは、2^4 = 16バイトにアライメントがあります。 – 71GA