2011-11-14 17 views
2

-sフラグを使ってgccが生成したアセンブリコードを見ています。いくつかのステートメントは次のようになります。こここのアセンブリ文は何を意味しますか?

movl is_leader(%rip), destination 

、 is_leader は、CコードでタイプINTのグローバルに定義された変数です。私が理解できないのは、用語is_leader(%rip)ここです。 rip命令ポインタはありませんか?私はこのステートメントがアクセスするためにどのように使用されるのかを知る必要がありますis_leader

答えて

4

現在の命令のアドレスとオブジェクトのアドレスの差を命令ポインタに加算または減算するコードを生成するようにアセンブラに要求します。

絶対アドレスを生成せずにオブジェクトのアドレスを与えます(通常、オフセットは16ビットまたは32ビットに収まるため、結果コードも短く高速です)。

これにより、両方のアイテム間の距離が一定のままであるという制約が追加されます。これは、同じロード可能オブジェクト内のデータに対してのみ使用できます。その条件が満たされない場合、リンカはエラーにフラグを立てます。

3

おそらく位置独立コードに関連し、* .so実行可能ファイル内にあります。

+0

OKですが、どのように機能していますか? – MetallicPriest

+2

現在の命令のアドレスとオブジェクトのアドレスとの差を命令ポインタに加算または減算するコードを生成するようにアセンブラに要求します。これは絶対アドレスを生成せずにオブジェクトのアドレスを与えます(一般に、オフセットは16または32ビットに収まるため、結果として得られるコードも短く高速です)。 –

+0

これは正しい答えです。これは[AMD64](http://en.wikipedia.org/wiki/X86-64#Architectural_features)命令セットの機能です。 – Caleb

関連する問題