2010-12-31 6 views
8

私はアセンブリプログラミング(ガス、特に)に時間を費やしています、最近、私は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バイト境界の別の理由がありますか?

文章に関する説明やヒントはありがたいです。

+2

アセンブリ言語の私の習得は、アラインメント命令を持たない6510に制限されています。しかし、C++の設定でのメモリアライメントの知識に基づいて、 "align"命令は実際のCPU命令ではないと思います。これはアセンブラディレクティブで、次のオペコードをどこに挿入するのかを示しています。その場合、行内の2つのalignディレクティブは、1つだけの場合と同じです。 –

+0

'.align 2'はコードを2^2 = 4バイトに整列させると考えました。あなたが '.align 4'を持っているあなたのケースでは、2^4 = 16バイトにアライメントがあります。 – 71GA

答えて

7

.alignディレクティブは、コンパイラが内部的に動作する方法のために複数あります。 1つは十分であり、1つだけ放出することは余分な作業を必要とする。

は限り一般的にアライメントとして、それは複雑な話題だが、ここであなたが興味を持っている問題のいくつかを説明し、インテルのx64のための記事です:

他のアーキテクチャが可能大きく異なる。

+0

私は、2番目の.alignディレクティブはコンパイラの仕組みに起因すると考えていましたが、それを今知ることは良いことです。リンクありがとう – jena

関連する問題