2010-07-25 14 views
6

मैं एमआईपीएस आर्किटेक्चर के लिए एक बहुत ही सरल डिकंपेलर पर काम कर रहा हूं और जैसा कि मैंने प्रगति की है, मुझे कोड विश्लेषण के लिए कई नियमों को परिभाषित करना है, उदाहरण के लिए "यदि यह ऑपोड है लूप बना पेड़ पार्स करने में परिभाषा "- लुई और अगले opcode addiu तो वर लौट = मूल्य" या "इस opcode BNE है और यह वर्तमान से पहले पता करने के लिए चर्चा करते हुए दी जाती है। समस्या - ऐसे कई नियम हैं और मुझे उन्हें परिभाषित करने का एक अच्छा तरीका नहीं मिल रहा है। मैंने प्रत्येक नियम के लिए अलग-अलग कार्यों को लिखने की कोशिश की है, अच्छे ओओपी बेस लॉजिक क्लास को परिभाषित किया है और नियम बनाने के लिए उन्हें विस्तारित किया है, यहां तक ​​कि असम्बद्ध कोड पर नियमित अभिव्यक्तियों की कोशिश की है (मेरे आश्चर्य से यह अपेक्षा से बेहतर काम करता है) लेकिन इससे कोई फर्क नहीं पड़ता कि मैंने क्या प्रयास किया है, मेरा कोड जल्द ही बड़ा हो गया और पढ़ना मुश्किल हो गया, इससे कोई फर्क नहीं पड़ता कि मैं इसे दस्तावेज और संरचना करने की कोशिश कर रहा हूं।डिकंपेलर के नियमों को परिभाषित करने के लिए एक अच्छा तरीका खोजना, सलाह की आवश्यकता है

यह मुझे निष्कर्ष पर लाता है कि मैं गलत उपकरण का उपयोग करके इस कार्य को हल करने की कोशिश कर रहा हूं (इस तरह के जटिल कार्य के लिए बहुत बेवकूफ होने का उल्लेख नहीं करना :)), लेकिन मुझे कोई वास्तविक विचार नहीं है कि मुझे क्या प्रयास करना चाहिए। वर्तमान में मेरे पास दो अवांछित विचार हैं, कोई किसी प्रकार का डीएसएल उपयोग कर रहा है (मुझे इसमें बिल्कुल कोई अनुभव नहीं है, इसलिए मैं पूरी तरह से गलत हो सकता हूं), और दूसरा ओपोड मिलान के लिए किसी प्रकार का बाइनरी रीगेक्सपी-जैसे टूल लिख रहा है।

मुझे उम्मीद है कि कोई मुझे सही दिशा में इंगित कर सकता है, thx।

+0

मुझे नहीं लगता कि निर्देश पैटर्न को देखकर एक डिकंपेलर लिखना संभव है। कोड ब्लॉक और अभिव्यक्तियों को सही ढंग से बनाने के लिए कोड प्रवाह और डेटा विश्लेषण आवश्यक है। –

+2

AFAIK ओपोड पैटर्न अवलोकन कोड प्रवाह प्राप्त करने का तरीका है, जैसे कि मेरे दूसरे उदाहरण में (आपको बनी ऑपोड मिल जाता है जो स्वयं से पहले पते को संदर्भित करता है = यह एक लूप है), लेकिन आप सही हैं कि यह केवल चरणों में से एक है मुझे इस लूप के लिए स्थिति की गणना करने की आवश्यकता है, जिसका अर्थ है कि मुझे पहले कोड को देखने और मेमोरी \ रजिस्टर्स संशोधनों की जांच करने की आवश्यकता है। तो, यह दो पास विश्लेषण है - पहले अंदर सबकुछ की गणना करने के बजाय प्रवाह पेड़ का निर्माण करें। – Riz

+1

द्विआधारी regex विधि वास्तव में एक बहुत अच्छा विचार की तरह लगता है। एकमात्र अन्य चीज जिसे मैं सोच सकता हूं, एलआईएलवीएम को एक एमआईपीएस फ्रंटएंड लिखना होगा, और कोड प्राप्त करने के लिए सी बैकएंड का उपयोग करना होगा (हालांकि मुझे नहीं पता कि जेनरेट कोड कितना पठनीय होगा, उदाहरण के लिए यह 'गोटो के लिए' गोटो 'का उपयोग कर सकता है और रीसायकल चर, आदि) – Zifre

उत्तर

2

मुझे लगता है कि आपके कुछ नियम बहुत कम स्तर हैं, और यही कारण है कि वे अप्रबंधनीय बन रहे हैं।

lui पहचानने के बाद addiu 32-बिट निरंतर लोड के रूप में निश्चित रूप से बहुत उचित लगता है; लेकिन व्यक्तिगत ओपोड स्तर पर शाखा निर्देशों से नियंत्रण प्रवाह प्राप्त करने की कोशिश करना अधिक संदेहजनक लगता है - मुझे लगता है कि आप वहां बुनियादी ब्लॉक के साथ काम करना चाहते हैं।

Cifuentes 'Reverse Compilation Techniques एक संदर्भ है जो मैंने देखा है कि विघटन के विचार-विमर्श में फसल को रोकता है; काफी संक्षिप्त स्किम से, ऐसा लगता है कि आपकी परियोजना के लिए कुछ समय पढ़ने के लिए खर्च करना उचित होगा।

कुछ x86- विशिष्ट सामान प्रासंगिक नहीं होंगे - विशेष रूप से, चरण जो x86 को निम्न स्तर के मध्यवर्ती प्रतिनिधित्व में अनुवाद करता है शायद एमआईपीएस के लिए आवश्यक नहीं है (एमआईपीएस अनिवार्य रूप से केवल एक ओपोड प्रति मूल ऑपरेशन है) - लेकिन अन्यथा सामग्री में से अधिकांश ऐसा लगता है कि यह बहुत उपयोगी होना चाहिए।

+0

ओह, यह कागजात का उत्कृष्ट स्रोत खराब पढ़ रहा है, मैं व्यक्त नहीं कर सकता कि मैं कितना आभारी हूं (कृपया, मुझसे मत पूछें कि मैं इसे कैसे याद कर सकता हूं :)) – Riz

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