2012-03-11 9 views
5

Cファイルのアセンブリファイルで定義された変数の読み書きはできますか?私は自分でそれを理解することができませんでした。たとえば、Cファイルは次のようになります。アセンブリから定義された変数にCからアクセスできますか?

int num = 33;

と、このアセンブリ・コード生成:私はアセンブリ学ぶために始めたので、私はスピードは私が組み立てADN下のファイルを選択する必要が理由であることが多い聞い .LONG 33

.file "test.c" 
.globl _num 
.data 
.align 4 

_numをWindows7の

+5

防御的ではない:) – UmNyobe

+6

*アセンブリを学ぶようになったので、スピードが頻繁に聞こえたので、アセンブリサイズとそのすべてのものを選ぶ必要があります。*可能な人コンパイラが適切なタイミングを正確に把握している場合とそうでない場合がある場合があります。あなたはまだそこにいるようではありません。あなたのコンパイラはあなたよりも優れたアセンブリを出力します(しかし、それは学習をやめることを意味するものではありません)。 \t '.GLOBAL NUM \t NUM: \t \t彼らは、私はそれを試してみましたが、いくつかのリンカーの問題を持っていた –

+0

がまさにそれである、ここでは組立片があります。 int 13'と私のCファイル: '#include extern int num; int main(){ \t printf( "%d \ n"、num); } 'リンカの問題があります:' math.c :(。text + 0xf):未定義の 'num''への参照何が間違っていますか? – orustam

答えて

5

はい、リンカはすべての.sファイルを結合し、1つのオブジェクトファイルを作成します。したがって、すべてのcファイルが最初にアセンブリファイルになります。各アセンブリファイルには、インポートリストとエクスポートリストがあります。エクスポートリストには、.globalディレクティブを持つすべての変数が含まれています。 Importリストには、cファイルのexternで始まるすべての変数が含まれています。あなたのアセンブリファイルが含まれているので、もしこの:

.file "test.c" 
.globl _num 
.data 
.align 4 

は、あなたがNUMを使用するために必要なこと、この

extern int num 

のようにextern変数を作成し、その後、あなたは読むことができますそれを修正するか、または変更します。

4

はい、あなたが共有することができ、変数のサイズとすべてのもの...私はmingwのを使用しています

(32ビット)、GNUアセンブリ 両方。あなたが持っているように.globlを使ってください。そして、Cでは、別のCモジュールにあるかのように外部変数を宣言しますが、代わりにそれはasmモジュールにあります。

+0

を見て最初に愚かに見えるかもしれない場合でも、i'amは質問をして、なぜ – orustam

+0

あなたは両方のファイルをまとめてコンパイルしているのですか? – theRealWorld

+0

私は次のようにコンパイルしています。gcc -m32 -o test test.c myasm.s – orustam