2012-03-11 8 views
5

क्या मैं अपनी सी फाइल में मेरी असेंबली फ़ाइल में परिभाषित एक चर से पढ़ या लिख ​​सकता हूं? मैं इसे अपने आप नहीं समझ सका। उदाहरण के लिए सी फ़ाइल निम्नानुसार दिखती है:क्या सी से असेंबली में परिभाषित चर का उपयोग करना संभव है?

int num = 33;

और इस विधानसभा कोड का उत्पादन:

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

_num: .long 33

के रूप में मैं विधानसभा में जानने के लिए शुरू कर दिया मैं अक्सर सुना गति कारण है कि मैं विधानसभा ए डी एन कम फ़ाइल लेने के लिए है आकार और जो कुछ सामान ...

मैं MinGW उपयोग कर रहा हूँ (32 बिट) windows7

+5

इतना रक्षात्मक मत बनो :) – UmNyobe

+6

* जैसा कि मैंने असेंबली सीखना शुरू किया था, मैंने अक्सर सुना है कि मुझे असेंबली एडीएन कम फ़ाइल आकार और उन सभी चीजों को चुनना है ... * कोई भी जो सक्षम है कंपाइलर की तुलना में बेहतर अनुकूलक असेंबलर जानता है कि यह कब उचित है और जब यह नहीं है। आप अभी तक ऐसा प्रतीत नहीं कर रहे हैं। आपका कंपाइलर आपके से बेहतर असेंबली आउटपुट करता है (लेकिन इसका मतलब यह नहीं है कि सीखना बंद करो!)। \t '.global संख्या \t संख्या: \t \t –

+0

बिल्कुल यही वजह है कि i'am प्रश्न पूछने भले ही वे पहले – orustam

उत्तर

5

हां, लिंकर सभी .s फ़ाइलों को जोड़ता है और एक ऑब्जेक्ट फ़ाइल बनाता है। तो आपकी सभी सी फाइलें पहले असेंबली फाइलें बन जाएंगी। प्रत्येक असेंबली फ़ाइल में एक आयात सूची होगी, और एक निर्यात सूची होगी। निर्यात सूची में वे सभी चर शामिल हैं जिनमें एक .global निर्देश है। आयात सूची में वे सभी चर शामिल हैं जो सी फ़ाइल में बाहरी के साथ शुरू होते हैं। तो अपने विधानसभा फ़ाइल है कि अगर यह:

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

आप सभी आदेश संख्या का उपयोग करने के क्या करने की जरूरत है, इस

extern int num 

की तरह एक extern चर बनाने के लिए है और फिर आप को पढ़ने के लिए सक्षम हो जाएगा इसे या संशोधित करें।

4

चर हाँ, आप साझा कर सकते हैं पर जीएनयू विधानसभा दोनों तरीके। आपके पास .globl का उपयोग करें और फिर सी में बाहरी चर घोषित करें जैसे कि यह किसी अन्य सी मॉड्यूल में था लेकिन इसके बजाय यह एक एएसएम मॉड्यूल में है।

+0

मैं इसे करने की कोशिश की लेकिन कुछ लिंकर समस्याओं लिया है देखने पर मूर्ख प्रकट हो सकता है, यहां विधानसभा टुकड़ा है। int 13' और मेरी सी फ़ाइल: '# शामिल करें बाहरी int num; int मुख्य() { \t printf ("% d \ n", num); } 'मेरे पास एक लिंकर समस्या है:' math.c :(। Text + 0xf): 'num''' के अपरिभाषित संदर्भ मैं गलत क्या कर रहा हूं? – orustam

+0

क्या आप दोनों फाइलें एक साथ या सिर्फ अपनी सी फाइल संकलित कर रहे हैं? – theRealWorld

+0

मैं उन्हें निम्नानुसार संकलित कर रहा हूं: gcc-m32 -o test test.c myasm.s – orustam