2016-10-11 10 views
4

アセンブリで変数がどのように実装されているか少し混乱します。アセンブリ変数はどのように実装されていますか?

.section .data 
     var: 
       .long 23 

は、その後、次のような変数にアクセスすることができます:私は、次の宣言は、プログラムのdataセクションで指定されたメモリロケーションを作成することを知っている上で、私は明確ではないよ何

movl var, %eax //read from var location 

方法上記の指示が実際に実装されています。私は、メモリ参照、たとえ絶対メモリ参照であっても、それを使用する前にレジスタにロードする必要があるという印象を受けました。

leal var, %ebx 
movl (%ebx), %eax 

やアセンブラがvarのアドレスを追跡し、それが絶対的な即時アクセスであるかのように、その場所にアクセスしない:

は、アセンブラは、次のような複数の命令の中に上記の命令を変換する必要がありません例えば:

movl ($addr_of_var), %eax 
+0

いいえ。要件の誤解があります。アドレスをレジスタにロードする必要はありません。 'MOV'命令ファミリの命令リファレンスを見てください。 –

答えて

8

x86命令セットは、彼らが使用することができます前に、レジスタにロードされるメモリアドレスを必要としない - ほとんどすべての命令がで直接または間接的なメモリ参照を使用することができます命令。詳細はIntel architecture manualをご覧ください。

アドレスをレジスタにロードする必要があるのは、MIPSのようなRISC cpusの特徴です。

+0

ありがとう!上記の2番目のステートメントは正確ですか? (アセンブラは変数の絶対参照を追跡していますか?) – David

+2

@David:アセンブラは一般的にシンボル参照を記号的に扱い、リンカに任せてすべての最終的な位置を決定し、必要に応じてコードを修正します。 –

+0

あなたのご協力ありがとうございます! – David

関連する問題