2008-12-21 11 views
12

बनाना मुझे एक सीपीयू आर्किटेक्चर के लिए एक असेंबलर बनाने की आवश्यकता है जिसे मैंने बनाया है। वास्तुकला एमआईपीएस के समान है, लेकिन यह कोई महत्व नहीं है।एक असेंबलर

मैंने सी # का उपयोग शुरू किया, हालांकि सी ++ अधिक उपयुक्त होगा। (सी # का मतलब है मेरे लिए तेजी से विकास का समय)।

मेरी एकमात्र समस्या यह है कि मैं इस एप्लिकेशन के लिए एक अच्छी डिजाइन के साथ नहीं आ सकता। मैं एक 2 पास असेंबलर बना रहा हूँ। मुझे पता है कि मुझे प्रत्येक पास में क्या करना है। \

मैंने पहला पास लागू किया है और मुझे एहसास हुआ कि अगर मुझे एक ही पंक्ति पर असेंबली कोड लाइन करना है ... कोई त्रुटि नहीं फेंक दी गई है। इसका मतलब है केवल एक चीज खराब पार्सिंग तकनीकें।

तो सर्वशक्तिमान प्रोग्रामर, असेंबलर के पिता मुझे बताते हैं कि मुझे कैसे आगे बढ़ना चाहिए। मुझे केवल प्रतीकों और डेटा घोषणा का समर्थन करने की आवश्यकता है। निर्देशों का आकार निश्चित है।

अगर आपको अधिक जानकारी चाहिए तो कृपया मुझे बताएं।

+0

क्या यह एक होमवर्क प्रश्न है? – ConcernedOfTunbridgeWells

उत्तर

11

मैंने तीन या चार सरल असेंबलर लिखे हैं। एक पार्सर जेनरेटर का उपयोग कर के बिना, क्या मैंने किया था S-C assembler कि मैं 6502.

के लिए सबसे अच्छा पता था कि ऐसा करने के लिए मॉडल था, मैं एक साधारण वाक्य रचना का इस्तेमाल किया - एक पंक्ति निम्न में से एक था:

nothing 
[label] [instruction] [comment] 
[label] [directive] [comment] 

एक लेबल एक पत्र था जिसके बाद किसी भी अक्षर या संख्याएं थीं।

एक अनुदेश < खाली स्थान के था > < स्मरक > [ऑपरेंड]

एक निर्देश था < खाली स्थान के > .XX एक पंक्ति के अंत में * [ऑपरेंड]

एक टिप्पणी थी।

संचालन निर्देश और निर्देश पर निर्भर करता है।

निर्देशों .EQ को परिभाषित स्थिरांक

के लिए समानता शामिल

कोड की .या सेट मूल पते

.HS बाइट्स बाइट्स की

.as ascii स्ट्रिंग के हेक्स स्ट्रिंग - सफेद स्थान को छोड़कर किसी भी सीमांकक - जो कुछ भी शुरू कर दिया है कि यह उत्पादन

के लिए यह

.tf लक्ष्य फ़ाइल समाप्त हो गया।एन बाइट्स

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

सभी स्रोत लाइनों के पारित होने के बाद, मैंने "ठीक करने के लिए" तालिका को देखा और प्रतीक तालिका में एक प्रविष्टि खोजने की कोशिश की, अगर मैंने किया, तो मैंने निर्देशों को पैच किया। यदि नहीं, तो यह एक त्रुटि थी।

मैंने निर्देशों के लिए एक निर्देश रखा है और ऑपरेटरों के लिए सभी मान्य एड्रेसिंग मोड रखे हैं। जब मुझे कोई निर्देश मिला, तो मैंने कुछ एड्रेसिंग मोड को तब तक पर्स करने की कोशिश की जब तक कि कुछ काम नहीं करता।

इस संरचना को देखते हुए, इसे पूरी चीज़ करने के लिए एक दिन लग सकता है।

+0

आपके उत्तर के लिए धन्यवाद। देखो मैं निम्नलिखित समस्या है: LOOP1: LOOP2: LOOP3: r1 जोड़ें, r2 जेएमपी LOOP1 तरह से मैं कोडांतरक यह पंक्ति है कि LOOP2 और इसे जोड़ने के अनुदेश के लिए कूद करना चाहिए पर चला जाएगा लिखा था। मैं रेखा से रेखा को पार्स कर रहा हूं। क्या आपने पूरे कोड को एक पंक्ति के रूप में माना? – John

+0

आपको अगले निर्देश के पते को लेबल के मान के रूप में निष्पादित करने की आवश्यकता है। इसका मतलब है कि आप अपने लेबल लूप (1,2,3) में सभी लेबलों का ट्रैक रखें और जब आप अगले वास्तविक निर्देश (जोड़ें) पर जाएं, तो आप लेबल के मान को जानते हैं, इसलिए आप वापस जाते हैं और उन्हें भरते हैं में। – Bearddo

4

प्रसिद्ध के रैंडी हाइड के लेखक की ओर से इस असेंबलर डेवलपमेंट किट में "विधानसभा भाषा की कला" देखो:

The Assembler Developer's Kit

+0

लिंक अब और काम नहीं करता है। – NilsB

2

एक दो पास कोडांतरक के पहले पास कोड असेंबल और के लिए प्लेसहोल्डर डालता है प्रतीकों (जैसा कि आप नहीं जानते हैं कि जब तक आप असेंबलर नहीं चलाते हैं तब तक सब कुछ कितना बड़ा होता है)। दूसरा पास पते में भरता है। यदि बाद में कोड को बाहरी संदर्भों से जोड़ा जाना आवश्यक है, तो यह नामांकित लिंकर का काम है।

1

यदि आप एक असेंबलर लिखना चाहते हैं जो सिर्फ काम करता है, और एक हेक्स फ़ाइल को माइक्रोकंट्रोलर पर लोड करने के लिए थूकता है, तो यह आसान और आसान हो सकता है। मेरी सीफर्थ लाइब्रेरी का हिस्सा लगभग 150 लाइनों की इनलाइन परिभाषाओं को जोड़ने के लिए एक पूर्ण पेंटियम असेंबलर है। 8080 के दो दर्जन लाइनों के लिए एक असेंबलर है।

सिद्धांत http://home.hccnet.nl/a.w.m.van.der.horst/postitfixup.html समझाया गया है। यह समस्या के लिए ब्लैकबोर्ड डिज़ाइन पैटर्न को लागू करने की मात्रा है। आप निर्देश को बिछाने के साथ शुरू करते हैं, किसी भी और सभी ऑपरेटरों के लिए छेद छोड़ते हैं। जब आप पैरामीटर का सामना करते हैं तो आप छेद भरते हैं।
सामान्य उपकरण और निर्देश सेट के बीच एक सख्त अलगाव है।

यदि आपके लिए आवश्यक असेंबलर केवल आपके लिए है, और प्रयोज्यता (होमवर्क असाइनमेंट नहीं) की तुलना में कोई आवश्यकता नहीं है, तो आप http://home.hccnet.nl/a.w.m.van.der.horst/forthassembler.html में एक उदाहरण कार्यान्वयन कर सकते हैं। यदि आप फर्थ से नापसंद करते हैं, तो पर्ल में एक उदाहरण कार्यान्वयन भी है। यदि पेंटियम निर्देश सेट बहुत अधिक चबाना है, तो फिर भी आप सिद्धांत और सामान्य भाग को समझने में सक्षम होना चाहिए। आपको सलाह दी जाती है कि asi8080.frt फ़ाइल पहले देखें। यह 38 9 डब्ल्यूओसी (कोड का शब्द, कोड की रेखा नहीं है)। निर्देश सेट से परिचित एक अनुभवी फर्शर शाम को एक असेंबलर को क्रैंक कर सकता है। पेंटियम एक कुतिया है।

संबंधित मुद्दे