मैंने सी में वर्चुअल मशीन लिखी है जिसमें गैर-जेआईटी वीएम के लिए अच्छा प्रदर्शन है, लेकिन मैं कुछ नया सीखना चाहता हूं, और प्रदर्शन में सुधार करना चाहता हूं। मेरा वर्तमान कार्यान्वयन केवल वीएम बाइटकोड से निर्देशों के लिए अनुवाद करने के लिए एक स्विच का उपयोग करता है, जो एक कूद तालिका में संकलित किया जाता है। जैसे मैंने कहा, यह क्या है इसके लिए सभ्य प्रदर्शन, लेकिन मैंने एक बाधा डाली है जिसे केवल एक जेआईटी कंपाइलर से दूर किया जा सकता है।असेंबली में एक जेआईटी कंपाइलर लिखना
मैंने पहले ही एक ही प्रश्न पूछा है जो स्वयं को संशोधित कोड के बारे में नहीं था, लेकिन मुझे एहसास हुआ कि मैं सही सवाल नहीं पूछ रहा था।
तो मेरा लक्ष्य इस सी वर्चुअल मशीन के लिए एक जेआईटी कंपाइलर लिखना है, और मैं इसे x86 असेंबली में करना चाहता हूं। (मैं अपने असेंबलर के रूप में NASM का उपयोग कर रहा हूं) मुझे पूरा यकीन नहीं है कि यह करने के बारे में कैसे जाना है। मैं असेंबली के साथ सहज हूं, और मैंने कुछ स्व-संशोधित कोड उदाहरणों को देखा है, लेकिन मुझे यह पता लगाने के लिए नहीं आया है कि अभी तक कोड जनरेशन कैसे करें।
मेरा मुख्य ब्लॉक अब तक मेमोरी के निष्पादन योग्य टुकड़े, के साथ निर्देशों की प्रतिलिपि बना रहा है। मुझे पता है कि मैं NASM में एक निश्चित पंक्ति को लेबल कर सकता हूं, और उस पते से संपूर्ण तर्क को स्थिर तर्कों के साथ प्रतिलिपि बना सकता हूं, लेकिन यह बहुत गतिशील नहीं है, और यह एक जेआईटी कंपाइलर के लिए काम नहीं करता है। मुझे बाइटकोड से निर्देश की व्याख्या करने में सक्षम होना चाहिए, इसे निष्पादन योग्य स्मृति में कॉपी करें, पहले तर्क की व्याख्या करें, इसे स्मृति में कॉपी करें, फिर दूसरे तर्क की व्याख्या करें, और इसे स्मृति में कॉपी करें।
मुझे कई पुस्तकालयों के बारे में सूचित किया गया है जो इस कार्य को आसान बना देंगे, जैसे जीएनयू बिजली, और यहां तक कि एलएलवीएम। हालांकि, बाहरी संसाधनों का उपयोग करने से पहले, मैं इसे पहले हाथ से लिखना चाहता हूं, यह समझने के लिए कि यह कैसे काम करता है।
क्या इस समुदाय को शुरू करने में मेरी सहायता करने के लिए कोई समुदाय या उदाहरण उपलब्ध हैं? निष्पादन योग्य कोड उत्पन्न करने के लिए "एड" और "mov" जैसे दो या तीन निर्देशों का उपयोग करने वाला एक सरल उदाहरण, गतिशील रूप से, स्मृति में, चमत्कार में, चमत्कार करेगा।
सिर्फ इसलिए कि एक जिटर जेनरेट करता है मशीन कोड * नहीं * का मतलब है कि इसे स्वयं असेंबली में लिखा जाना चाहिए। ऐसा करने का कोई मतलब नहीं है। –
जीसीसी के गणना वाले गोटो एक्सटेंशन ('शून्य * ऑप्टेबल [] = {&& op_add, && op_subtract, ...}' का उपयोग करके थ्रेड किए गए प्रेषण का प्रयास करने के लिए एक मध्यवर्ती चरण है और प्रत्येक ऑपरेंड 'op_add: ... goto * optable [* ip ++] है ; ')। मैंने आपके जैसे वर्णन किए गए स्विच किए गए दुभाषियों में बड़े लाभ देखा है। –