4

私はx86を学んでおり、.alignディレクティブが何をするのか、そしてそれがどのように役立つのかを理解しようとしています。

Oracleリファレンスマニュアルには次のように書かれています。

.alignディレクティブを使用すると、次に生成されるデータが整数バイトを法として整列されます。整数は正の整数式である必要があり、2の累乗である必要があります。指定されている場合、padはパディングに使用される整数バイト値です。テキストセクションのpadのデフォルト値は0x90(nop)です。他のセクションの場合、padのデフォルト値はゼロ(0)です。

しかし、それが何を意味するのかわかりません。それについてもっと読むことができる場所を参照するか、例を挙げて簡単に説明していただけますか?

4

1 に答える 1

9

それが何をするのかを理解するための鍵は、なぜそこにあるのかを理解することです。

すべてのコンピューターには、 wordsizeと呼ばれる自然な境界があります。この境界は通常、4バイトまたは8バイトです。

4バイトと8バイトの値がこれらの境界にある場合、CPUはメモリからのロードとストアをより高速に、キャッシュスペースを無駄にすることなく実行できます。一部のタイプのCPUは、ずれた値をまったくフェッチできません。

したがって、ラベルとストレージ割り当てディレクティブをより効率的なアドレスで開始できるように、次の境界にスキップするメカニズムがアセンブラに存在する必要があります。

手順については、ほとんどのコンピューターで奇数の境界が機能しますが、それでもパフォーマンスに影響があり、キャッシュスペースが無駄になります。

   .string "ab\0"
; this next address is 3

vs

    .string "ab\0"
    .align 4 # sometimes interpreted as 2**n, so, .align 2
; this next address is 4, and would still be 4 if the string was just "a"
于 2013-01-27T05:11:13.413 に答える