मशीन कोड

From Vigyanwiki
एक W65C816S सिंगल-बोर्ड कंप्यूटर में मशीन भाषा मॉनिटर, कोड डिस्सैबली प्रदर्शित करता है, साथ ही प्रोसेसर रजिस्टर और मेमोरी डंप भी।

मशीन कोड किसी भी कंप्यूटर प्रोग्रामिंग की निम्न-स्तरीय प्रोग्रामिंग भाषा होती हैl इसमें मशीन की भाषा निर्देश बहुत महत्वपूर्ण होता हैं, जिसका उपयोग कंप्यूटर की केंद्रीय प्रसंस्करण इकाई सीपीयू (CPU) को नियंत्रित करने के लिए किया जाता है। प्रत्येक निर्देश सीपीयू को सीपीयू के रजिस्टरों या मेमोरी में डेटा की एक या अधिक इकाइयों पर लोड, स्टोर, जंप, या अंकगणितीय तर्क इकाई एएलयू (ALU) ऑपरेशन जैसे बहुत विशिष्ट कार्य करने का कारण बनता है।

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

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

मशीन कोड प्रोग्रामर के लिए दिखाई देने वाले प्रोग्रामिंग डिटेल के निम्नतम स्तर की परिभाषा के अनुसार है, लेकिन आंतरिक रूप से कई प्रोसेसर माइक्रोकोड का उपयोग करते हैं या मशीन कोड निर्देशों को माइक्रो-ऑपरेशन के अनुक्रमों में माइक्रो-ऑप्स की तरह अनुकूलित और रूपांतरित करते हैं। ।यह आमतौर पर मशीन कोड नहीं माना जाता है।

निर्देश सेट

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

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

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

कार्यक्रम

एक कंप्यूटर प्रोग्राम उन निर्देशों की एक सूची है जिसे केंद्रीय प्रसंस्करण इकाई (सीपीयू) द्वारा निष्पादित किया जा सकता है। एक कार्यक्रम का निष्पादन सीपीयू के लिए किया जाता है जो इसे किसी समस्या को हल करने के लिए निष्पादित कर रहा है और इस प्रकार एक परिणाम को पूरा करता है। जबकि सरल प्रोसेसर एक के बाद एक निर्देश को निष्पादित करने में सक्षम हैं, सुपरस्केलर प्रोसेसर एक साथ कई निर्देशों को निष्पादित करने में सक्षम हैं।

कार्यक्रम का प्रवाह विशेष 'जंप' निर्देशों से प्रभावित हो सकता है जो अगले संख्यात्मक रूप से अनुक्रमिक पते के अलावा एक पते (और इसलिए निर्देश) में निष्पादन को स्थानांतरित करते हैं। क्या ये सशर्त कूदते हैं, यह एक ऐसी स्थिति पर निर्भर करता है जैसे कि मूल्य से अधिक, कम से कम, या किसी अन्य मूल्य के बराबर होना।

असेंबली भाषाएँ

मशीन भाषा का एक बहुत अधिक मानव अनुकूल प्रतिपादन, जिसे असेंबली भाषा कहा जाता हैl मशीन कोड निर्देशों को संदर्भित करने के लिए स्मृति सहायक (मनमोनिक) कोड का उपयोग करता हैl यह बजाय सीधे निर्देशों के संख्यात्मक मूल्यों का उपयोग करने के लिए, और भंडारण स्थानों और कभी -कभी रजिस्टरों को संदर्भित करने के लिए प्रतीकात्मक नामों का उपयोग करता है। उदाहरण के लिए, Zilog Z80 प्रोसेसर, मशीन कोड पर 00000101, जिसके कारण सीपीयू B प्रोसेसर रजिस्टर के अपक्षय का कारण बनता है और असेंबली भाषा में  DEC B के नाम से जाना जाता है।  

उदाहरण

एमआईपीएस (MIPS) आर्किटेक्चर मशीन कोड के लिए एक विशिष्ट उदाहरण प्रदान करता है जिसके निर्देश हमेशा 32 बिट्स लंबे होते हैं। सामान्य प्रकार का निर्देश ओपी (ऑपरेशन) फ़ील्ड, उच्चतम 6 बिट्स द्वारा दिया जाता है। जे-टाइप (कूद) और आई-टाइप (तत्काल) निर्देश पूरी तरह से ओपी द्वारा निर्दिष्ट हैं। आर-टाइप (रजिस्टर) निर्देशों में सटीक ऑपरेशन निर्धारित करने के लिए एक अतिरिक्त फ़ील्ड फ़ंक्शन शामिल है। इन प्रकारों में उपयोग किए जाने वाले क्षेत्र हैं:

   6        5        5         5           5           6      बिट्स
[ओपी |     रु   ।   आरटी  |   RD    |    SHAMT   |   funct  ] आर- प्रकार
[ओपी |     रु   ।   आरटी  |           पता/तत्काल             ]  आई- प्रकार
[ओपी |                          लक्ष्य पता                    ]  जे-प्रकार

आरएस, आरटी, और आरडी रजिस्टर ऑपरेंड को इंगित करते हैं; Shamt एक शिफ्ट राशि देता है, और पते या तत्काल फ़ील्ड में सीधे एक ऑपरेंड होता है।

उदाहरण के लिए, रजिस्टर 1 और 2 को जोड़ना और परिणाम को रजिस्टर 6 में रखना एन्कोड किया गया है:

[ओपी |    रु   ।    आर टी   |  RD       |  SHAMT   | फंक्शनल]
    0      1         2         6              0          32    दशमलव
 000000 00001      00010      00110        00000     100000    बाइनरी

रजिस्टर 8 में सूचीबद्ध स्थान के बाद मेमोरी सेल 68 कोशिकाओं से लिया गया रजिस्टर 8 में एक मान लोड करें:

[  ओपी |   रु     ।   आरटी    |       पता/तत्काल      ]
   35       3         8                 68            दशमलव
 100011   00011      01000       00000 00001 000100   बाइनरी

पते पर कूदना 1024:

[ओपी    |           लक्ष्य पता             ]
    2                 1024                    दशमलव
 000010   00000 00000 00000 10000 000000      बाइनरी

ओवरलैपिंग निर्देश

चर-लंबाई निर्देश सेट के साथ प्रोसेसर आर्किटेक्चर पर[2](जैसे कि इंटेल का X86 प्रोसेसर परिवार) यह नियंत्रण-प्रवाह की सीमा के भीतर है, जिसे क्रुस्कल काउंट के रूप में जाना जाता है,[3][2]कभी-कभी ओपकोड-लेवल प्रोग्रामिंग के माध्यम से संभवतः परिणामी कोड को जानबूझकर व्यवस्थित करने के लिए संभव है ताकि दो कोड पथ ओपकोड अनुक्रमों के एक सामान्य टुकड़े को साझा करें।इन्हें ओवरलैपिंग निर्देश, ओवरलैपिंग ओपकोड्स, ओवरलैपिंग कोड, ओवरलैप्ड कोड, इंस्ट्रक्शन स्केशन, या एक निर्देश के बीच में कूदते हैं, और सुपरपोजिशन के एक रूप का प्रतिनिधित्व करते हैं।[4][5][6]

1970 और 1980 के दशक में, ओवरलैपिंग निर्देशों का उपयोग कभी -कभी मेमोरी स्पेस को संरक्षित करने के लिए किया जाता था। एक उदाहरण माइक्रोसॉफ्ट के अल्टेयर बेसिक में त्रुटि तालिकाओं के कार्यान्वयन में थे, जहां इंटरलेव्ड निर्देशों ने पारस्परिक रूप से अपने निर्देश बाइट्स को साझा किया।[7][2][4]तकनीक का आज शायद ही कभी उपयोग किया जाता है, लेकिन अभी भी उन क्षेत्रों का सहारा लेना आवश्यक है जहां आकार के लिए चरम अनुकूलन बाइट-स्तर पर आवश्यक है जैसे कि बूट लोडर के कार्यान्वयन में जो बूट क्षेत्रों में फिट होना पड़ता है।[nb 1]

यह कभी -कभी एक कोड ऑब्फ़स्केशन तकनीक के रूप में भी उपयोग किया जाता है, जो कि डिस्सैम और छेड़छाड़ के खिलाफ एक उपाय के रूप में होता है।[2]

सिद्धांत का उपयोग वसा बायनेरिज़ के साझा कोड अनुक्रमों में भी किया जाता है जो कई निर्देश-सेट-असंगत प्रोसेसर प्लेटफार्मों पर चलना चाहिए।

इस संपत्ति का उपयोग मौजूदा कोड रिपॉजिटरी में गैजेट्स नामक अनपेक्षित निर्देशों को खोजने के लिए भी किया जाता है और रिटर्न-टू-एलआईबीसी हमलों जैसे कारनामों के लिए कोड इंजेक्शन के विकल्प के रूप में रिटर्न-उन्मुख प्रोग्रामिंग में उपयोग किया जाता है।[8][2]


माइक्रोकोड से संबंध

कुछ कंप्यूटरों में, आर्किटेक्चर के मशीन कोड को माइक्रोकोड नामक एक और भी अधिक मौलिक अंतर्निहित परत द्वारा कार्यान्वित किया जाता है, जो व्यापक रूप से भिन्न अंतर्निहित डेटा प्रवाह के साथ कंप्यूटर के विभिन्न मॉडलों की एक पंक्ति या परिवार में एक सामान्य मशीन भाषा इंटरफ़ेस प्रदान करता है। यह विभिन्न मॉडलों के बीच मशीनी भाषा कार्यक्रमों की पोर्टिंग की सुविधा के लिए किया जाता है। इस प्रयोग का एक उदाहरण आईबीएम सिस्टम/360 कंप्यूटरों का परिवार और उनके उत्तराधिकारी हैं। 8 बिट से 64 बिट और उससे आगे के डेटा प्रवाह पथ की चौड़ाई के साथ, वे फिर भी पूरी लाइन में मशीन भाषा स्तर पर एक सामान्य वास्तुकला प्रस्तुत करते हैं।

एमुलेटर को लागू करने के लिए माइक्रोकोड का उपयोग करना कंप्यूटर को पूरी तरह से अलग कंप्यूटर की वास्तुकला को प्रस्तुत करने में सक्षम बनाता है। सिस्टम/360 लाइन ने इसका उपयोग पहले आईबीएम मशीनों से कंप्यूटर के नए परिवार के लिए पोर्टिंग कार्यक्रमों की अनुमति देने के लिए किया था, उदाहरण IBM 1400 श्रृंखला | IBM 1401/1440/1460 IBM S/360 मॉडल 40 पर एमुलेटर।

बाईटकोड से संबंध

मशीन कोड आमतौर, पर बाईटकोड (जिसे पी-कोड के रूप में भी जाना जाता है) से अलग होता है, जिसे या तो एक दुभाषिया द्वारा निष्पादित किया जाता है या खुद को तेज (प्रत्यक्ष) निष्पादन के लिए मशीन कोड में संकलित किया जाता है। अपवाद तब होता है जब एक प्रोसेसर को सीधे अपने मशीन कोड के रूप में किसी विशेष बाइटकोड का उपयोग करने के लिए डिज़ाइन किया जाता है, जैसे कि जावा प्रोसेसर के साथ मामला है।

मशीन कोड और असेंबली कोड को कभी-कभी देशी कोड कहा जाता है जब भाषा सुविधाओं या पुस्तकालयों के प्लेटफ़ॉर्म-निर्भर भागों का उल्लेख किया जाता है।[9]

मेमोरी में भंडारण

हार्वर्ड आर्किटेक्चर कोड (निर्देश) और डेटा के लिए शारीरिक रूप से अलग भंडारण और सिग्नल मार्ग के साथ एक कंप्यूटर आर्किटेक्चर है। आज, अधिकांश प्रोसेसर प्रदर्शन कारणों से इस तरह के अलग -अलग सिग्नल मार्गों को लागू करते हैं, लेकिन एक संशोधित हार्वर्ड आर्किटेक्चर को लागू करते हैंl[citation needed] इसलिए, वे डेटा के रूप में डिस्क स्टोरेज से एक निष्पादन योग्य प्रोग्राम लोड करने और फिर इसे निष्पादित करने जैसे कार्यों का समर्थन कर सकते हैं। हार्वर्ड आर्किटेक्चर वॉन न्यूमैन आर्किटेक्चर के विपरीत है, जहां डेटा और कोड को उसी मेमोरी में संग्रहीत किया जाता है जिसे प्रोसेसर द्वारा पढ़ा जाता है, जिससे कंप्यूटर को कमांड निष्पादित करने की अनुमति मिलती है।

एक प्रक्रिया के दृष्टिकोण से, कोड स्थान अपने पता स्थान का हिस्सा होता है जहां निष्पादन में कोड संग्रहीत है। मल्टीटास्किंग सिस्टम में इसमें प्रोग्राम के कोड सेगमेंट और आमतौर पर साझा किए गए लाइब्रेरी शामिल होती हैं। मल्टी-थ्रेडिंग वातावरण में, प्रक्रिया के अलग-अलग थ्रेड्स डेटा स्पेस के साथ-साथ कोड स्पेस को साझा करते हैं, जो प्रक्रिया स्विचिंग की तुलना में संदर्भ स्विचिंग के ओवरहेड को कम करता है।

मनुष्यों द्वारा पठनीयता

पामेला सैमुएलसन ने लिखा है कि मशीन कोड इतना अपठनीय है कि संयुक्त राज्य अमेरिका कॉपीराइट कार्यालय यह नहीं पहचान सकता है कि क्या कोई विशेष एन्कोडेड कार्यक्रम लेखक का एक मूल काम हैl[10] हालांकि, यूएस कॉपीराइट कार्यालय कंप्यूटर प्रोग्राम के कॉपीराइट पंजीकरण के लिए अनुमति देता है[11]और एक कार्यक्रम के मशीन कोड को कभी -कभी मनुष्यों के लिए अपने कामकाज को अधिक आसानी से समझने के लिए विघटित किया जा सकता है।[12]हालांकि, एक डिकम्पिलर या डिस्सेम्बलर का आउटपुट टिप्पणियों और प्रतीकात्मक संदर्भों को याद नहीं करेगा, इसलिए जब आउटपुट ऑब्जेक्ट कोड की तुलना में पढ़ना आसान हो सकता है, तब भी यह मूल स्रोत कोड की तुलना में अधिक कठिन होगा। यह समस्या स्क्वॉज़ जैसे ऑब्जेक्ट-कोड प्रारूपों के लिए मौजूद नहीं है, जहां स्रोत कोड फ़ाइल में शामिल है।

संज्ञानात्मक विज्ञान के प्रोफेसर डगलस हॉफस्टैडर ने मशीन कोड की तुलना जेनेटिक कोड से की है, जिसमें कहा गया है कि मशीन भाषा में लिखे गए एक कार्यक्रम को देखकर परमाणु द्वारा डीएनए अणु परमाणु को देखने के लिए अस्पष्ट रूप से तुलनीय है।[13]

यह भी देखें

  • सभा की भाषा
  • एंडियननेस
  • मशीन भाषाओं की सूची
  • मशीन कोड मॉनिटर
  • ओवरहेड कोड
  • पी-कोड मशीन
  • कम निर्देश सेट कंप्यूटिंग (RISC)
  • बहुत लंबा निर्देश शब्द
  • शिक्षण मशीन कोड: माइक्रो-प्रोफेसर MPF-I

टिप्पणियाँ

  1. As an example, the DR-DOS MBRs and boot sectors (which also hold the partition table and BIOS Parameter Block, leaving less than 446 respectively 423 bytes for the code) were traditionally able to locate the boot file in the FAT12 or FAT16 file system by themselves and load it into memory as a whole, in contrast to their counterparts in MS-DOS/PC DOS, which instead relied on the system files to occupy the first two directory entries in the file system and the first three sectors of IBMBIO.COM to be stored at the start of the data area in contiguous sectors containing a secondary loader to load the remainder of the file into memory (requiring SYS to take care of all these conditions). When FAT32 and LBA support was added, Microsoft even switched to require 386 instructions and split the boot code over two sectors for code size reasons, which was no option to follow for DR-DOS as it would have broken backward- and cross-compatibility with other operating systems in multi-boot and chain load scenarios, as well as with older PCs. Instead, the DR-DOS 7.07 boot sectors resorted to self-modifying code, opcode-level programming in machine language, controlled utilization of (documented) side effects, multi-level data/code overlapping and algorithmic folding techniques to still fit everything into a physical sector of only 512 bytes without giving up any of their extended functionality.
Cite error: <ref> tag with name "NB_List" defined in <references> is not used in prior text.


संदर्भ

  1. Kjell, Bradley. "Immediate Operand".
  2. 2.0 2.1 2.2 2.3 2.4 Jacob, Matthias; Jakubowski, Mariusz H.; Venkatesan, Ramarathnam (20–21 September 2007). Towards Integral Binary Execution: Implementing Oblivious Hashing Using Overlapped Instruction Encodings (PDF). Proceedings of the 9th workshop on Multimedia & Security (MM&Sec '07). Dallas, Texas, USA: Association for Computing Machinery. pp. 129–140. CiteSeerX 10.1.1.69.5258. doi:10.1145/1288869.1288887. ISBN 978-1-59593-857-2. S2CID 14174680. Archived (PDF) from the original on 2018-09-04. Retrieved 2021-12-25. (12 pages)
  3. Lagarias, Jeffrey C.; Rains, Eric; Vanderbei, Robert J. (2009) [2001-10-13]. Brams, Stephen; Gehrlein, William V.; Roberts, Fred S. (eds.). The Kruskal Count (PDF). pp. 371–391. arXiv:math/0110143. ISBN 978-3-540-79127-0. Archived (PDF) from the original on 2021-12-25. Retrieved 2021-12-25. {{cite book}}: |journal= ignored (help) (22 pages)
  4. 4.0 4.1 "Unintended Instructions on x86". Hacker News. 2021. Archived from the original on 2021-12-25. Retrieved 2021-12-24.
  5. Kinder, Johannes (2010-09-24). Static Analysis of x86 Executables [Statische Analyse von Programmen in x86 Maschinensprache] (PDF) (Dissertation). Munich, Germany: Technische Universität Darmstadt. D17. Archived from the original on 2020-11-12. Retrieved 2021-12-25. (199 pages)
  6. "What is "overlapping instructions" obfuscation?". Reverse Engineering Stack Exchange. 2013-04-07. Archived from the original on 2021-12-25. Retrieved 2021-12-25.
  7. Gates, William "Bill" Henry, Personal communication (NB. According to Jacob et al.)
  8. Shacham, Hovav (2007). The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls (on the x86) (PDF). Proceedings of the ACM, CCS 2007. ACM Press. Archived (PDF) from the original on 2021-12-15. Retrieved 2021-12-24.
  9. "Managed, Unmanaged, Native: What Kind of Code Is This?". developer.com. 28 April 2003. Retrieved 2008-09-02.
  10. Samuelson, Pamela (September 1984). "CONTU Revisited: The Case against Copyright Protection for Computer Programs in Machine-Readable Form". Duke Law Journal. 1984 (4): 663–769. doi:10.2307/1372418. JSTOR 1372418. PMID 10268940.
  11. "Copyright Registration for Computer Programs" (PDF). US Copyright Office. August 2008. Retrieved 2014-02-23.
  12. "What is decompile? - Definition from WhatIs.com". WhatIs.com (in English). Retrieved 2016-12-26.
  13. Hofstadter, Douglas R. (1980). Gödel, Escher, Bach: An Eternal Golden Braid. p. 290.


अग्रिम पठन