हम बाइनरी / हेक्स से असेंबली इंस्ट्रक्शन सेट्स पर कैसे जाते हैं?


13

इसलिए मैं कुछ एंबेडेड / असेंबली प्रोग्रामिंग को यहां थोड़ी देर के लिए सीखने की कोशिश कर रहा हूं, साथ ही सबसे निचले स्तर (गेट्स और ऐसे) को सीखने की कोशिश कर रहा हूं।

एक बात मुझे याद है .... हालांकि हम "निर्देश" कैसे प्राप्त करते हैं। मैं कुछ हद तक समझता हूं कि गेट्स / टीटीएल और इस तरह के काम कैसे होते हैं, लेकिन मैं यह नहीं देखता कि हम कैसे उस से mov, add, clr आदि ...?

यह शायद एक बेवकूफी भरा सवाल है .... लेकिन मेरा मतलब है कि मुझे लगता है कि पहले माइक्रो-प्रोसेसर / कंट्रोलर्स के पास वापस जाना चाहिए और सोचना .... उन्होंने वास्तव में एक निर्देश सेट कैसे बनाया और इसे काम करना है?

संपादित करें: मैं स्पष्टता के लिए अनुमान लगाता हूं, पहले माइक्रोप्रोसेसर के बारे में बात कर रहा हूं, वे बाइनरी से वास्तव में एक इंस्ट्रक्शन सेट बनाने के लिए कैसे गए?


2
हर निर्देश का एक मूल्य होता है, संकलक आपके कोड को इन निर्देशों में परिवर्तित करता है, इस आधार पर कि आपका कोड कैसे संरचित है।
रामहाउंड

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

1
एक जोड़े को बारीकी से संबंधित प्रश्नों programmers.stackexchange.com/questions/81624/... और superuser.com/questions/307116/...
jhocking

3
वे बाइनरी से वास्तव में एक इंस्ट्रक्शन सेट बनाने के लिए कैसे गए? दरअसल, "वे" नहीं था - यह दूसरा तरीका है, कम से कम आम तौर पर। CPU डिज़ाइनर (s) यह निर्धारित करता है कि CPU क्या कार्य करेगा, फिर वे उसी से निर्देश सेट बनाते हैं, और फिर वे निर्देशों (mnemonics) को opcodes (बाइनरी मशीन कोड) में मैप करते हैं। @ स्कॉट व्हॉटलॉक ने नीचे एक अच्छा उत्तर दिया, मैं सिर्फ आपके प्रश्न के अंतिम भाग को संबोधित करना चाहता था क्योंकि आपकी धारणा, कम से कम मेरे अनुभव में, पिछड़ी हुई है।
रेडियन

1
यह वास्तव में अच्छी पुस्तक है: www1.idc.ac.il/tecs यह सब मुझे क्या समझाया गया है, अधिकांश अध्याय ऑनलाइन मुफ्त उपलब्ध हैं। आप अपनी खुद की चिप (एक साधारण हार्डवेयर डिस्क्रिप्शन लैंग्वेज में) नंद गेट्स से डिज़ाइन करते हैं, फिर एक असेंबलर और फिर एक कंपाइलर, फिर अपनी बनाई हुई भाषा में एक ओएस लिखें! अद्भुत सामान, और एक कॉम विज्ञान की डिग्री के बिना किसी के रूप में यह समय मेरे लिए अच्छी तरह से बिताया गया था!
bplus

जवाबों:


18

एक सीपीयू का दिल ALU है । यह एक निर्देश लेने के लिए ज़िम्मेदार है (जैसे MOV) जो कि द्विआधारी अंकों की कुछ पूर्व-परिभाषित श्रृंखला है, और 0, 1, या 2 ऑपरेंड लेने और उन पर लागू ऑपरेशन करने के लिए भी। सबसे सरल निर्देश एक एनओपी (कोई ऑपरेशन नहीं) हो सकता है जो अनिवार्य रूप से कुछ भी नहीं करता है। एक और विशिष्ट ऑपरेशन ADD (दो मान जोड़ता है) है।

ALU "रजिस्टरों" के डेटा को पढ़ता और लिखता है। ये CPU के लिए आंतरिक मेमोरी के छोटे स्थान हैं। निर्देश का हिस्सा (प्रत्येक इनपुट के लिए 2 से 3 बिट्स आपके पास कितने रजिस्टरों के आधार पर) इंगित करता है कि किस रजिस्टर से पढ़ना है। ALU में CPU बाहरी में इकाइयाँ होती हैं जो मेमोरी से रजिस्टरों में आवश्यक डेटा (और इंस्ट्रक्शन) को लोड करती हैं, और परिणाम को रजिस्टरों से मेमोरी में वापस लिखती हैं। परिणाम लिखने का स्थान भी एक और 2 या 3 बिट्स में एन्कोड किया जाएगा।

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


1
मुझे लगता है कि इम क्या पूछ रहा है, वे कैसे चुनते हैं? और वे वास्तव में इसे कैसे निर्दिष्ट करते हैं?

1
@ सौरोन: तीसरे पैराग्राफ को फिर से पढ़ना और बाइनरी अंकगणित और डिजिटल सर्किट को समझने की कोशिश करना। मैं एक डिजिटल सर्किट में 8bit लाइन द्वारा 256 निर्देशों के साथ एक निर्देश सेट का प्रतिनिधित्व कर सकता हूं। इसका मतलब है कि मुझे हर संभव स्थिति (2 राज्यों प्रति पंक्ति ^ 8 लाइनों = 256 संभव राज्यों) को स्थानांतरित करने के लिए अपने हार्डवेयर उपकरणों पर 8 io बंदरगाहों की आवश्यकता है। प्रसंस्करण इकाई तब तय कर सकती है कि उस डिजिटल इनपुट सिग्नल का क्या करना है। एक डिजिटल सर्किट का मतलब है कि आपके पास दो हार्डवेयर राज्य हैं: हाय और लो, वोल्टेज या कोई वोल्टेज। वहीं से बाइनरी आती है। बाइनरी प्रतिनिधित्व धातु के सबसे करीब है।
फाल्कन

3
@ सौरोन - डिजिटल मल्टीप्लेक्सर्स को देखें कि डिजिटल सर्किट कई मानों में से किसी एक को कैसे चुन सकता है। यदि आपके पास 8-बिट बस है, तो आपको समानांतर में इन 8 बाइनरी डिजिटल मल्टीप्लेक्सर्स की आवश्यकता है।
स्कॉट व्हाइटलॉक

1
@ फाल्कन ओके ....... मुझे लगता है कि अधिक समझ में आता है। मैं यह भूल जाता हूं कि अंत में यह सभी बाइनरी सिग्नल के लिए नीचे चला जाता है .... और यहां तक ​​कि "mov" जैसे एक निर्देश को अभी भी बाइनरी के रूप में दर्शाया गया है।

1
@ सौरोन - सीपीयू पर कुछ शोध करें, इससे आपको यह समझने में मदद मिलेगी कि ऑप कोड क्या हैं और वे कैसे काम करते हैं। क्यों कुछ ऑप कोड चुने गए हैं, यह महत्वपूर्ण नहीं है, यहां तक ​​कि "क्यों" सवाल पूछने पर भी बहुत मायने नहीं रखता है। यह समझना कि वे कैसे चुने जाते हैं, सीपीयू और इसकी संरचना के बारे में अधिक समझने में आपकी मदद कर सकते हैं।
रामहाउंड

9

मैं आपके प्रश्न का शाब्दिक रूप से अध्ययन करूंगा और अधिकांश माइक्रोप्रोसेसरों पर चर्चा करूंगा, सामान्य रूप से कंप्यूटर नहीं।

सभी कंप्यूटरों में किसी न किसी प्रकार का मशीन कोड होता है। एक निर्देश में एक ओपकोड और एक या अधिक ऑपरेंड होते हैं। उदाहरण के लिए, इंटेल 4004 (बहुत पहले माइक्रोप्रोसेसर) के लिए ADD निर्देश को 1000RRRR के रूप में एन्कोड किया गया था जहां 1000 ADD के लिए opcode है और RRRR बाइनरी में एक रजिस्टर नंबर 0-15 (0000-1111) का प्रतिनिधित्व करता है।

अन्य सभी निर्देश जो 16 4-बिट रजिस्टरों में से एक का संदर्भ देते हैं (जैसे INC, ISZ, LD, SUB, XCHG) भी रजिस्टर संख्या को एनकोड करने के लिए कम 4-बिट्स का उपयोग करते हैं, और निर्दिष्ट करने के लिए शीर्ष 4-बिट्स के विभिन्न एनकोडिंग्स ओपकोड। उदाहरण के लिए, ADD, SUB, LD और XCHG रजिस्टर फ़ील्ड के साथ संयुक्त रूप से 1000, 1001, 1010 और 1011 (सभी बाइनरी में) opcodes का उपयोग करते हैं। तो आप देख सकते हैं कि कैसे तर्क को सरल बनाने के लिए एक पैटर्न का उपयोग किया जाता है।

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

मशीन भाषा में थकाऊ असली तेजी आती है, इसलिए कोडांतरक प्रोग्राम विकसित किए गए थे जो एक एमनेमिक असेंबलर भाषा लेते हैं और इसका अनुवाद करते हैं, आमतौर पर प्रति निर्देश विधानसभा कोड की एक पंक्ति, मशीन कोड में। इसलिए 10000001 के बजाय, कोई भी ADD R1 लिखेगा।

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

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


4

एक बहुत ही निम्न स्तर के कंप्यूटर को डेटा पथ और नियंत्रण द्वारा दर्शाया जा सकता है । इनको एक साथ देखने से आपको बहुत कुछ पढ़ने को मिल सकता है क्योंकि यह डिजिटल आर्किटेक्चर / डिज़ाइन में मौलिक है।

मैं संक्षेप में पूरी कोशिश करूँगा:

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

तो हम इसे कैसे पूरा करेंगे? जैसा कि पहले ही फिर से बताया गया है, हम निम्न स्तर के डिजिटल लॉजिक का लाभ उठा सकते हैं और विभिन्न रास्तों के लिए मल्टीप्लेक्सर्स बना सकते हैं। मल्टीप्लेक्सर्स को इनपुट के लिए बिट्स के एक सेट का उपयोग करके नियंत्रित किया जाता है - ये बिट्स कहां से लिए गए हैं? निर्देश से एनकोड किया गया। Takeaway: mov, add, आदि जैसे निर्देश केवल बिट्स का एक सेट है जो एक सीपीयू को बताता है कि किसी विशेष ऑपरेशन के लिए इसके डेटापथ को कैसे कॉन्फ़िगर किया जाए। आप जो पढ़ रहे हैं (mov, add) वह मानव पठनीय रूप (असेंबली लैंग्वेज) है और हमारा प्रोग्राम डेटापाठ और संचालन की एक प्रक्रिया को परिभाषित करता है।

मैं माफी मांगता हूं अगर यह उन लोगों के लिए अधिक जटिल प्रक्रियाओं का निरीक्षण है जो इस क्षेत्र में अधिक जानकार हैं। FYI करें, इलेक्ट्रिकल इंजीनियरिंग स्टैक-एक्सचेंज इस प्रश्न को पूछने के लिए एक महान स्थान होगा क्योंकि यह बहुत ही निम्न स्तर के तर्क से संबंधित है।


3

अगर मैं आपके प्रश्न को समझता हूं तो मुझे समझ में नहीं आता कि बिन / हेक्स या असेंबली कैसे संबंधित हैं।

मुझे लगता है कि आपके प्रश्न का मांस यह है कि मैं मूल द्वार से कैसे प्राप्त करूं, और, या, स्थानांतरित करने, लोड करने, स्टोर करने, जोड़ने, आदि जैसे निर्देशों के लिए नहीं।

मेरा अपना शिक्षण निर्देश है जिसे मैंने खरोंच से बनाया है जिसमें कुछ विवरण हैं कि कैसे बुनियादी फाटकों और उस http://github.com/dwelch67/lsasim जैसी चीजों से काम जोड़ना और घटाना है ।

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

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

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

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

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

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

इस सत्य तालिका के बारे में बहुत संक्षेप में सोचें:

0 0 0
0 1 1
1 0 1
1 1 0

बाइनरी में:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

केवल lsbit पर ध्यान केंद्रित, एक बिट योजक, ऊपर दी गई सत्य तालिका एक बिट योजक का वर्णन करती है। इसमें एक XOR गेट भी है। एक इनपुट सही है या दूसरा लेकिन दोनों नहीं।

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

आप इस अनुरूप योजक को ADD निर्देश में कैसे बदल सकते हैं, क्या आपके पास कुछ तर्क हैं जो उस अनुदेश को देखता है जो आपके द्वारा व्यवस्थित किए गए इन द्वारों के इनपुट के रूप में बैठा है। निर्देश में कुछ बिट्स कहते हैं, यह एक ऐड निर्देश है, कुछ बिट्स कहते हैं कि एक ऑपरेंड ऐसा है और ऐसा रजिस्टर है, शायद रजिस्टर 7, अन्य बिट्स कह सकते हैं कि अन्य ऑपरेंड रजिस्टर 4 है। और आप वास्तुकला के आधार पर हो सकता है कि निर्देश में एक और रजिस्टर परिभाषित किया गया हो जो परिणाम को रजिस्टर 2 में रखता है। अब अधिक तर्क यह देखता है कि मुझे रजिस्टर 7 की सामग्री की जरूरत है अलु योजक के एक इनपुट पर रूट की जाए और 4 के इनपुट को योजक में रूट किया जाए, और आप रूट करें योजक का आउटपुट 2 रजिस्टर करने के लिए। चूंकि घड़ी इस तर्क का हिस्सा है, इसलिए घड़ी की अवधि की शुरुआत से लेकर अगली घड़ी की अवधि तक की अवधि होती है, जहां सभी एनालॉग सिग्नल बस जाते हैं और तर्क समीकरण को हल करते हैं जो वे करने के लिए वायर्ड होते हैं। इसके विपरीत नहीं जब आप एक लाइट स्विच फ्लिप करते हैं तो आप लाइट स्टेट को ऑन ऑफ़ से बदलते हैं। उस प्रकाश को गर्म होने में समय लगता है और मूल रूप से एक स्थिर अवस्था में पहुंच जाता है। यहाँ बहुत अलग नहीं है।

कुछ तर्क हैं जो कहते हैं कि अगर यह घड़ी की अवधि एक AND निर्देश का निष्पादन चरण है, तो अगली घड़ी की अवधि मैं परिणाम रजिस्टर में सहेजने जा रहा हूं। उसी समय मैं अगला निर्देश आदि लाने जा रहा हूं। इसलिए आधुनिक प्रोसेसरों के लिए जहां एलयू निष्पादन अक्सर सिर्फ एक घड़ी की अवधि होती है क्योंकि एनालॉग लॉजिक तर्क समीकरणों को तेजी से हल कर सकता है। पुराने प्रोसेसर जिन्हें आपको कुछ संख्या में गिनना है, योजक को छोड़ दिया गया है, योजक तर्क के लिए क्लॉक साइकल के x संख्या की प्रतीक्षा करें, फिर आउटपुट से परिणाम का नमूना लें, अलग-अलग इनपुट्स को खिलाएं, एक्स के लिए क्लॉक चक्र की संख्या का इंतजार करें इसे हल करने के लिए, हमेशा के लिए दोहराएं या जब तक कि बिजली बंद न हो जाए।

मुझे तर्क समीकरणों से क्या मतलब है? बस, अगर आप चाहें तो आप इसे AND, OR, NOT gates के संदर्भ में सोच सकते हैं। एलु योजक सर्किट के लिए प्रत्येक इनपुट बिट के लिए एक समीकरण है, एक बहुत लंबे समीकरण की संभावना है जिसमें घड़ी भी शामिल है, जिसमें फ्लिप फ्लॉप (व्यक्तिगत / एकल मेमोरी बिट्स) शामिल हैं जिसमें वर्तमान निर्देश शामिल हैं (साथ ही उनमें से प्रत्येक को खिलाने वाले समीकरण भी शामिल हैं) मेमोरी बिट्स) और पर और पर। आपके द्वारा लिखा गया एक एकल सॉफ्टवेयर फ़ंक्शन लें, जिस भाषा में आपने इसे लिखा है, यह मानते हुए कि यह एक ऐसा फ़ंक्शन है जो इनपुट्स लेता है, एक कार्य करता है और फिर समाप्त होता है और एक परिणाम देता है। इनपुट के सभी संभावित संयोजनों के बारे में सोचें और उस फ़ंक्शन के माध्यम से विभिन्न निष्पादन पथ क्या हैं। आपने इसे कुछ उच्च स्तरीय भाषा में लिखा हो सकता है, लेकिन आप शायद उस भाषा में भी इसे लिख सकते हैं कि यह कई नीडिंत और फिर संरचनाओं का उपयोग करते हुए अधिक आदिम और अधिक आदिम हो। और शायद असेंबली भाषा में नीचे जाएं। मैं जिन समीकरणों के बारे में बात कर रहा हूं, उनके विपरीत नहीं, हार्डवेयर प्रोग्रामर इन लंबे समय तक घुमावदार समीकरणों में प्रोग्राम नहीं करता है, जितना संभव है कि आप लंबे समय तक घुमावदार प्रोग्राम में तब और अधिक करते हैं, जब-तब की असेंबली भाषा में पेड़ जब पसंद की प्रोग्रामिंग भाषा इतना बचा लेती है। जिस कंपाइलर का आप उपयोग करते हैं, ठीक उसी तरह अगर-तब के बहुत सारे के साथ अपने छोटे स्रोत कोड को लंबी घुमावदार विधानसभा में बदल देता है, तो एक कंपाइलर होता है जो हार्डवेयर प्रोग्रामिंग लैंग्वेज कोड लेता है और इसे लॉजिक समीकरणों में बदल देता है।

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

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

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

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


यह वास्तव में लेखक के सवाल का जवाब नहीं देता है, यह कम से कम चर्चा में कुछ भी नहीं जोड़ता है, कि स्वीकृत उत्तर कवर नहीं किया गया है। आपका बाइनरी गणित 100% सही नहीं है 1 + 1 0 के अतिप्रवाह के साथ 0 है। रजिस्ट्री के आकार के आधार पर यह या तो 2 या 0. होगा
रामहाउंड

@ ड्वेल्च डैम! अगर कुछ कम नहीं हुआ तो मैं आपका डाई हार्ट फैन हूं। +1
AceofSpades

2

सीपीयू 0 और 1 के 1 पर काम करते हैं। सभी निर्देशों में बिट्स का एक क्रम था जो उन्हें परिभाषित करता था। Thsi मशीन कोड था। मनुष्य के लिए पढ़ना और लिखना कठिन है। पहले कदम के रूप में हमने 0 और 1 के 4 बिट्स अनुक्रमों को समूहीकृत किया और उनका प्रतिनिधित्व करने के लिए एफ के माध्यम से 0 का उपयोग किया। इससे हमें याद करने की संख्या कम हो गई, लेकिन फिर भी निर्देशों के लिए हेक्स कोड को याद रखना आसान नहीं था।

इसलिए हमने असेंबली का उपयोग करना शुरू कर दिया जिसमें MOV और ADD जैसे "शब्द" थे। कोडांतरक 0 के सही सेट के साथ निर्देशों को प्रतिस्थापित करेगा और 1 को असेंबली "लिस्टिंग" को मशीन कोड में परिवर्तित करेगा।

आखिरकार हमने "उच्च" स्तर की भाषाएं विकसित कीं, जहां "निर्देश" मशीन कोड के पूरे अनुक्रम का प्रतिनिधित्व कर सकते थे।


FYI करें, ओक्साल का उपयोग हेक्साडेसिमल से पहले एक बाइनरी शॉर्टहैंड के रूप में किया गया था।
ओसोडो

Slomojo सही है, ऑक्टल, बेस 8 में 3 बिट्स का इस्तेमाल किया गया था, हेक्स के साथ, बेस 16 का इस्तेमाल 4 बिट्स के साथ किया गया था। ऑक्टल में यह फायदा था कि हर कोई जानता था कि 0 से 7 नंबर किसका प्रतिनिधित्व करते हैं। हेक्स का उपयोग नहीं करने वाले लोग अक्सर "अंक" ए से एफ तक की खोज करते थे
जिम सी।

0

मैं हाल ही में इस क्यू / ए में आया था और लगभग एक साल पहले या जब मैंने इस रास्ते से यात्रा शुरू की थी; मुझे अपने स्वयं के संबंधित प्रश्नों के संबंध में यह एक बहुत अच्छा संसाधन और संदर्भ पृष्ठ होना चाहिए।


भाग 1: -Preface-

थोड़ा अपने बारे में:

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

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

जब मैं लगभग 3 या 4 साल का था तब से वीडियो गेम खेल रहा हूं। एक बच्चे के रूप में मेरे पास अटारी, एनईएस, सेगा जेनेसिस और पीएस 1 था। जैसे-जैसे मैं बूढ़ा होता गया और मेरी स्वर्गीय किशोरावस्था में और शुरुआती 20 की उम्र में मैंने PS2 और SNES को पसंदीदा चयन खिताब के साथ हासिल कर लिया। यह भी पीसी गेमिंग के लिए खाता नहीं है जो कि कयामत तक वापस चला जाता है!

मैं हमेशा एक शौकीन चावला कंसोल और पीसी गेमर रहा हूं और इसमें पिनबॉल और आर्केड गेम शामिल नहीं हैं।

मुझे अपना पहला पीसी दिया गया था जब मैं 90 के दशक की शुरुआत में क्रिसमस के लिए लगभग 12 साल का था। DOS 6.0 के दिन और या तो 3.11 या OS / 2 जीतें। तब से मैं हमेशा ऑपरेटिंग सिस्टम के "विंडोज" परिवार से परिचित रहा हूं और मेरे पास मौजूद सभी सिस्टम इंटेल आर्किटेक्चर थे। मुझे स्कूल या कॉलेज से Apple या Mac के साथ सीमित अनुभव है, लेकिन मुझे लिनक्स सिस्टम पर काम करने का सौभाग्य कभी नहीं मिला। मेरे पास साइगविन है और मैंने सीखने की कोशिश में अपना हाथ आजमाया है, लेकिन मैं डॉस या कमांड प्रॉम्प्ट सिंटैक्स का आदी हूं।

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

यह हमेशा मेरा जुनून रहा है कि न केवल यह जानना चाहता हूं कि इलेक्ट्रॉनिक उपकरणों ने डिजिटल और तार्किक स्तर पर कैसे काम किया, ताकि कंप्यूटर को कैसे सीखा जा सके, लेकिन मुझे हमेशा अपने वीडियो बनाने की इच्छा थी खेल। यहां तक ​​कि 90 के दशक की शुरुआत में मैं गेम को फ्रॉगर और टेट्रिस बनाना चाहता था ...


यह कंप्यूटर विज्ञान के क्षेत्र में सबसे कठिन प्रकार की प्रोग्रामिंग या सॉफ्टवेयर विकास में से एक से निपटने के लिए मेरी अग्रणी प्रेरणा और इच्छा बन गई और वह है 3D गेम इंजन डिज़ाइन। कंप्यूटर विज्ञान में अन्य क्षेत्र भी हैं जो उतने ही कठिन हैं, हालांकि किसी भी परिष्कृत गेम इंजन में आमतौर पर या आमतौर पर लगभग सभी शामिल होते हैं क्योंकि व्यक्तिगत घटकों या उप इंजनों को उनकी तकनीकों और गुणों की आवश्यकता होती है।

मेरे हाई स्कूल के दिनों से प्रोग्रामिंग में कुछ पृष्ठभूमि थी, लेकिन यह भयानक विज़ुअल बेसिक तक सीमित थी। मैंने 2002 - 2003 के आसपास C / C ++ सीखना शुरू किया और 1999 में हाई स्कूल से स्नातक होने के कुछ साल बाद तक नहीं। यहां तक ​​कि आज तक मुझे कंप्यूटर साइंस या कंप्यूटर इंजीनियरिंग में कॉलेज का कोई भी अनुभव नहीं है, लेकिन समर्पण और दृढ़ संकल्प, मैंने बस हर अवधारणा के बारे में सीखा है, जब यह कंप्यूटर, हार्डवेयर, प्रोग्रामिंग, एल्गोरिदम, आदि की बात आती है और मैं अभी भी उतना ही सीखता हूं जितना मैं कर सकता हूं ...

C / C ++ सीखने के शुरुआती दिनों के दौरान, मेरे पास इंटरनेट तक पहुंच थी, लेकिन इंटरनेट तब अपने शुरुआती दौर में था, Amazon, Youtube, Facebook आदि जैसी वेबसाइटें अभी तक मौजूद नहीं थीं, यह अभी भी 56k का दिन था। यदि आपके पास एक दूसरी समर्पित लाइन नहीं है, तो अपने फ़ोन लाइन पर ज्वार-भाटे को डायल करें। एक छवि को स्क्रीन पर प्रस्तुत करने के लिए सिर्फ मिनट लगेंगे, कभी भी निरंतर वीडियो प्लेबैक को ध्यान में न रखें।

इसलिए जब यह शोध और सीखने के लिए आया कि C ++ में प्रोग्राम कैसे किया जाए, तो संसाधन सीमित थे और अधिकांश पाठ प्रारूप में थे। शुरुआती इंटरनेट ट्यूटोरियल दिनों से परियोजनाओं से निपटने की कोशिश करते समय, उन परियोजनाओं में से कई पूरी तरह से पूरी नहीं थीं, लेखक या तो पेशेवर या कॉलेज के छात्र थे और उन्होंने कई धारणाएं बनाईं कि पाठक पहले से ही आवश्यक अवधारणाओं जैसे संकलन से कई परिचित थे। , जोड़ने और डिबगिंग और पुस्तकालय एकीकरण।

किसी के लिए जो उन विषयों के बारे में कुछ भी नहीं जानते हैं, वे नुकसान में हैं क्योंकि वे नहीं जानते कि क्या गलत हुआ, न ही इसे कैसे ठीक किया जाए, और इसे ठीक से काम करने के लिए कैसे प्राप्त किया जाए। मुझे उन दिनों बहुत सीमित संसाधनों के साथ कई घंटों का परीक्षण और त्रुटि हुई। इस वेबसाइट से अब हम मदद के लिए पूछ सकते हैं या विस्तृत स्पष्टीकरण की तलाश कर सकते हैं जो आप cppreference पर पा सकते हैं उपलब्ध नहीं था! यदि आप व्यक्तिगत रूप से किसी को नहीं जानते हैं, तो आप सहायता के लिए बहुत से लोग नहीं कर सकते थे!

जैसे-जैसे समय बीतता गया मैंने अपना कुछ ज्ञान इधर-उधर सुधारा, और अंततः इंटरनेट डीएसएल में सुधर गया, और अब हाई स्पीड इंटरनेट, वेबसाइट्स अधिक संवादात्मक हो गए, वीडियो दिखाई देने लगे, वीडियो की गुणवत्ता समय के साथ बेहतर होती गई, जैसे साइट्स जैसा कि Youtube ने दिखाना शुरू किया और शोध पक्ष पर चीजें थोड़ी आसान हो गईं। अधिक से अधिक ट्यूटोरियल आसानी से उपलब्ध हो गए, कुछ अच्छे और उपयोगी थे जहां अन्य ने बुरी प्रथाओं को सिखाया ...

मैंने विकास के लिए आवश्यक उपकरणों को खोजने और प्राप्त करने में बहुत समय बिताया था। मुझे भाषा सिंटैक्स, कंपाइलर और संकलन प्रक्रिया, लिंकिंग, बिल्डिंग और डीबगिंग सीखना था। फिर मुझे उन विभिन्न उपलब्ध पुस्तकालयों और एपीआई के बारे में सीखना पड़ा जो वहाँ हैं और उन सभी आश्रितों को जोड़ने के लिए अपनी परियोजनाओं या समाधानों को कैसे कॉन्फ़िगर किया जाए।

पिछले कुछ वर्षों में मैंने C ++ भाषा देखी है, समय के साथ विकसित और अनुकूलित हुई है। शुरुआत में यह कई वर्षों तक लगभग एक जैसा रहा, लेकिन पिछले 10 वर्षों में इसकी शुरुआत के बाद से इस छोटी अवधि में नाटकीय रूप से बदल गया है।

मैं इस सब का उल्लेख करता हूं क्योंकि सी ++ अपनी बहुमुखी प्रतिभा, शक्ति, समृद्ध विशेषता सेट और आपको पैर में खुद को शूट करने की अनुमति देने की क्षमता के कारण पूरी तरह से मास्टर करने के लिए सबसे कठिन भाषाओं में से एक है! और यहां तक ​​कि अपने सभी केवेट के साथ, यह सबसे शक्तिशाली और पसंदीदा भाषाओं में से एक है जो इस प्रकार के विकास के लिए एक शीर्ष मानक उद्योग में उपयोग किया जाता है क्योंकि जब यह सही ढंग से किया जाता है तो यह तेज, संक्षिप्त, विश्वसनीय और उपयोग करता है। सबसे छोटा पैर प्रिंट।

तब से मैं 3 डी ग्राफिक्स प्रोग्रामिंग और गेम इंजन डिज़ाइन सीखने के इरादे से कई वर्षों के लिए सी / सी ++ में स्वयं पढ़ाया गया हूं। मैंने 100 से 1,000 से एक घंटे के खोज, अनुसंधान और बहुत कुछ पढ़ने, सीखने और उपयोगी काम करने वाले उत्पादों और अनुप्रयोगों के डिजाइन में उस ज्ञान को लागू करने में लगाया है। मुझे हमेशा अपने कौशल सेट और शिल्प में सुधार करने के लिए और अधिक सीखने की इच्छा रखने की इच्छा और इच्छा हुई है।


यह पहला चरण था, तब मैंने शुरू में डायरेक्टएक्स 9. सी के साथ पढ़ना और काम करना शुरू कर दिया था, जो मैंने सी / सी ++ और यहां तक ​​कि सी # में किया है। फिर मैं डायरेक्टएक्स 10 और लिगेसी ओपनजीएल 1.0 पर चला गया। उनके आने से डायरेक्टएक्स 11 और ओपनजीएल 3.x - 4.x और अब मैंने वुलकन में भी अपना हाथ आजमाया है।

मैंने पाठ और वीडियो प्रारूपों दोनों में विभिन्न ऑनलाइन ट्यूटोरियल के माध्यम से काम करने वाले सफल गेम इंजन बनाए हैं। मैंने पहले ही कहा था कि मेरी गणित में एक मजबूत पृष्ठभूमि थी लेकिन यह कैलकुलस I & II तक सीमित थी। मुझे अपने आप को वेक्टर कैलकुलस सिखाना था जिसके बारे में मुझे कॉलेज के अपने कैलकुलस आधारित फिजिक्स क्लास से कुछ ज्ञान था, लेकिन जैसा कि अफारे ट्रांसफॉर्मेशन और एनालिटिकल ज्योमेट्री के साथ रैखिक बीजगणित के लिए था, जब मुझे कुछ समीकरणों, कार्यों, विधियों, एल्गोरिदम और अवधारणाओं की आवश्यकता थी। तब मुझे यह सीखना था कि उन लोगों को कुशल, पठनीय, विश्वसनीय, पुन: प्रयोज्य कोड में कैसे अनुवाद किया जाए जो सामान्य और बग मुक्त था और सैकड़ों से हजारों घंटों के डिबगिंग में संभव था।

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

यहाँ उन विषयों या विषय सूची को शामिल किया गया है जिनमें एक पूरी तरह कार्यात्मक खेल इंजन शामिल है, जिसमें विभिन्न प्रकार की रेंडिंग तकनीकें शामिल हैं, जिसमें रेंडरिंग और शेडर पाइपलाइनों की स्थापना, शेडिंग और पूर्व प्रसंस्करण, फ्रेम बफ़र्स, बैक बफ़र्स के माध्यम से छायांकन और प्रकाश तकनीक शामिल हैं। , छवि लोड हो रहा है, ऑडियो और मॉडल लोड हो रहा है और पार्सिंग, रंग सामग्री गुणों, बनावट और मैनुअल बनावट मानचित्रण, वस्तु परिवर्तनों, कैमरा प्रकार, दृश्य ग्राफ पदानुक्रम, बनावट के लिए प्रबंधक वर्गों, ऑडियो, फोंट, और shaders और के साथ सामान्य निर्देशांक के साथ आदिम आकार बनाने। स्मृति प्रबंधन, अपवाद हैंडलिंग, बहु-थ्रेडेड और समानांतर प्रोग्रामिंग तकनीक, नेटवर्किंग, भौतिकी इंजन, टक्कर का पता लगाने, कण जनरेटर, एनीमेशन, गेम AI, इलाके पीढ़ी, आकाश बक्से और आकाश गुंबदों, जल प्रतिपादन, के साथ लॉगिंग सिस्टमपत्ते और अधिक ..., पाठ प्रतिपादन, HUD ओवरले, इन्वेंट्री, मैप और मैक्रो जेनरेशन, स्टेट सिस्टम और स्टेट मशीन के लिए GUI की बनावट फ़ॉन्ट के साथ है, और अंत में इन ऑब्जेक्ट्स के बहुत से स्वचालित करने के लिए अपनी स्क्रिप्टिंग भाषा बनाने के लिए एक पार्सर लिख रहा है एप्लिकेशन स्टार्टअप पर अपने संबंधित कंटेनरों के भीतर डेटा ऑब्जेक्ट्स और संरचनाओं को पॉप्युलेट करने के लिए डेटा फ़ाइलों में लोड करके सिर्फ कंप्यूटर को फिर से जोड़ने के बिना इंजन के भीतर डेटा मूल्यों को बदलने की क्षमता।और अंत में अपनी खुद की स्क्रिप्टिंग भाषा बनाने के लिए अपनी खुद की स्क्रिप्टिंग भाषा बनाने के लिए इन वस्तुओं को स्वचालित करने के लिए इंजन के भीतर डेटा मूल्यों को बदलने की क्षमता है बिना डेटा फ़ाइलों में लोड करके केवल डेटा को लोड करने के लिए अपने संबंधित कंटेनरों के भीतर और संरचनाओं को पॉप्युलेट करने के लिए। एप्लिकेशन स्टार्टअप पर।और अंत में अपनी खुद की स्क्रिप्टिंग भाषा बनाने के लिए अपनी खुद की स्क्रिप्टिंग भाषा बनाने के लिए इन वस्तुओं को स्वचालित करने के लिए इंजन के भीतर डेटा मूल्यों को बदलने की क्षमता है बिना डेटा फ़ाइलों में लोड करके केवल डेटा को लोड करने के लिए अपने संबंधित कंटेनरों के भीतर और संरचनाओं को पॉप्युलेट करने के लिए। एप्लिकेशन स्टार्टअप पर।


इन वर्षों के दौरान और बाद में मुझे असेंबली भाषा सीखने की इच्छा हुई है, मैं उनसे कंपाइलर, असेम्बलर्स और सिंपल ऑपरेटिंग सिस्टम के बारे में सीखना चाहता था। मेरा मतलब है कि उनके आंतरिक कामकाज, उनका निर्माण और डिजाइन कैसे किया जाता है।

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

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

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

मैं यह सब अपने खाली समय पर सीख रहा हूं जब मैं पिछले 15 - 18 वर्षों में कर सकता था।


यहां कुछ ऐसी साइटें और लिंक हैं, जिन्होंने मुझे वर्षों तक मार्गदर्शन किया है। इनमें से कई हाल ही में उन साइटों में से कई हैं जिन्हें मैंने मूल रूप से सीखा है या तो अब मौजूद नहीं है, मैंने उनके लिंक खो दिए हैं और याद नहीं है, या खोज इंजन ने उन्हें अपनी खोज सूचियों के बहुत पीछे धकेल दिया है ...

  • भाषाएँ - सी ++

  • 3 डी ग्राफिक्स ट्यूटोरियल और संसाधन वेबसाइट

  • Youtube श्रृंखला और चैनल इन विषयों को ऊपर के साथ-साथ हार्डवेयर, कंप्यूटर और इलेक्ट्रिकल इंजीनियरिंग को कवर करते हैं। सूची में बहुत सारे हैं इसलिए मैं उनमें से कुछ को यहां सूचीबद्ध करूंगा कि मुझे सबसे उपयोगी और संसाधन मिलें। मैं लिंक प्रदान नहीं करूंगा लेकिन आप इन चैनलों के लिए youtube खोज सकते हैं।

    • 3Blue1Brown - उन्नत गणित
    • बिसकविट - उन्नत सी / सी ++ प्रोग्रामिंग (एप्लीकेशन प्रोजेक्ट्स) - एनईएस हार्डवेयर एमुलेटर
    • जेसन टर्नर - उन्नत आधुनिक सी ++ प्रोग्रामिंग तकनीक
    • javidx9 - उन्नत C / C ++ प्रोग्रामिंग (एप्लिकेशन प्रोजेक्ट) - NES हार्डवेयर एमुलेटर / कुछ असेंबली
    • एमआईटी ओपनकोर्स - गणित और कंप्यूटर विज्ञान में कॉलेज पाठ्यक्रम
    • बिल्केंट ऑनलाइन पाठ्यक्रम - कंप्यूटर विज्ञान और कंप्यूटर इंजीनियरिंग में कॉलेज पाठ्यक्रम (सीपीयू डिजाइन एमआइपी)
    • द चेरनो - एडवांस्ड सी / सी ++ प्रोग्रामिंग टॉपिक्स एंड एप्लिकेशन - गेम इंजन डेवलपमेंट
    • बेन इटर - हार्डवेयर इंजीनियरिंग - ब्रेडबोर्ड के माध्यम से व्यावहारिक अनुप्रयोग
    • नेसो एकेडमी - हार्डवेयर इंजीनियरिंग - थ्योरी एंड कॉन्सेप्ट्स
    • सुकराती - पायथन प्रोग्रामिंग
    • सीधे शब्दों में कहें - हार्डवेयर इंजीनियरिंग - सिद्धांत और अवधारणाओं
    • बिटवाइज़ - एडवांस्ड सी / सी ++ हार्डवेयर एमुलेशन के माध्यम से एक असेंबलर डिज़ाइन करना
    • बो कियान - सी ++ डेटा संरचनाओं और एल्गोरिदम में विषय।
    • लाइनबायलाइन - वल्कन प्रोग्रामिंग
    • जोशुआ शकर - वल्कन प्रोग्रामिंग
    • www.MarekKnows.com - C ++, 3D गणित और गेम इंजन विकास

और इन विषयों पर मेरे पास विभिन्न पुस्तकों में से कुछ को ध्यान में नहीं रखा गया है।

-नोट- कृपया इस पर वोट न करें क्योंकि यह केवल मेरे अपने व्यक्तिगत अनुभव के पाठक के लिए एक संदेश है और मूल प्रश्न का उत्तर या संदर्भ देने के किसी भी प्रयास से शून्य है। अगले कुछ दिनों में जब मेरे पास समय होगा; मैं एक संदर्भ और संसाधनों के सेट के रूप में उपयोगी लिंक प्रदान करते समय ओपी के प्रश्न के बारे में अपने विचार देने के लिए एक अनुवर्ती उत्तर जोड़ूंगा और इस उत्तर को अद्यतन करने के साथ-साथ कुछ लिंक भी शामिल करूंगा और इस नोट को संशोधित करूंगा। यह देर हो चुकी है और मेरे पास वर्तमान में मेरे द्वारा पहले से लिखी गई बातों को प्रमाणित करने और संपादित करने का समय नहीं है। मैं यह करूँगा जब मैं करूँगा ”।


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

-2

इसके मूल में, एक CPU आमतौर पर सिर्फ एक राज्य मशीन है। तो आपको यह समझने की आवश्यकता होगी कि लॉजिक गेट्स और फ्लिप-फ्लॉप या रजिस्टर राज्य मशीनों को बनाने के लिए कैसे संयोजित होते हैं।

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

एक बार जब आपके पास निर्देशों को अनुक्रमित करने का एक तरीका होता है, तो आप इन अनुदेश बिट्स को नियंत्रित करने के लिए तर्क का उपयोग कर सकते हैं, साथ ही वर्तमान स्थिति, नियंत्रण बिट्स के एक और गुच्छा में। इनमें से कुछ नियंत्रण बिट्स तर्क के एक समूह को नियंत्रित करने के लिए इनपुट के रूप में कार्य कर सकते हैं जो अंकगणित और शब्द-व्यापी तर्क कर सकते हैं, इसे ALU कहते हैं। अन्य बिट्स ALU के लिए सामान को लोड कर सकते हैं या इनपुट का चयन कर सकते हैं। अन्य बिट्स ALU के परिणामों को संग्रहीत करने के लिए कह सकते हैं। या रजिस्टरों को संबोधित करते हुए लोड करें। या स्मृति या अन्य आउटपुट के लिए लिखें। आदि।

एक निर्देश सेट को डिज़ाइन करने का एक हिस्सा सिर्फ यह पता लगाना है कि कौन सा बिट्स का संयोजन, जब डिकोड किया जाता है, सभी रजिस्टरों और राज्य मशीन अनुक्रमण को नियंत्रित करें। यह किया गया था और (पुनः) हजारों अलग-अलग तरीकों से अनुकूलित किया गया था।

इस गैर-तुच्छ विषय पर विश्वविद्यालय की पाठ्यपुस्तकों के कम से कम 3 स्तर हैं।


2
यह व्याख्या नहीं करता है कि एमओवी ऑपरेशन को बाइनरी वैल्यू में कैसे कवर किया जाता है। यह निर्देश MOV ऑपरेशन का उल्लेख नहीं करता है, इसका एक कीवर्ड है, जिसका हम उपयोग करते हैं, इसलिए हमें 16 से 32 बिट के द्विआधारी मूल्य को याद करने की आवश्यकता नहीं है।
रामहाउंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.