मशीन कोड में कार्यक्रम सीखने के लिए संसाधन? [बन्द है]


24

मैं एक छात्र हूँ, प्रोग्रामिंग में नया हूँ और इसे प्यार करता हूँ, जावा से सी ++ और नीचे सी। मैं नंगे पांव पीछे की ओर चला गया और आगे विधानसभा तक जाने के लिए सोचा।

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

इतने शोध के बाद मैंने जो संभव बात सुनी वह यह है कि एक हेक्स संपादक मशीन भाषा की सबसे करीबी चीज है जिसे मैं इस युग और युग में पा सकता था। क्या अन्य चीजें हैं जिनसे मैं अनजान हूं? क्या मशीन कोड में प्रोग्राम सीखने के लिए कोई संसाधन हैं? अधिमानतः 8-बिट माइक्रो-कंट्रोलर / माइक्रोप्रोसेसर पर।

यह प्रश्न मेरे लिए समान है, लेकिन मैं पहले व्यावहारिक रूप से सीखने और फिर सिद्धांत को समझने में रुचि रखता हूं।


2
क्या वास्तव में समस्या यहाँ है? यदि आप पूछ रहे हैं कि क्या मशीन कोड में कोड करना संभव है, तो उत्तर शायद "हाँ" है। यदि आप ट्यूटोरियल पूछ रहे हैं तो a) यह स्पष्ट करें कि आपका प्रश्न क्या है, लेकिन b) यह एक रचनात्मक प्रश्न नहीं है।
ChrisF

6
क्या सी धातु पर्याप्त नहीं हैं?
टॉम स्क्वेयर

6
मैं program bare metalहर बार अपने सर्वर बॉक्स को किक करता हूं। अद्भुत काम करता है!
यानिस डे

7
कभी और भी नीचे जाने पर विचार किया जाता है? अपना स्वयं का सीपीयू हैक करें: opencores.org
SK-logic

3
@ एसके-तर्क, हाँ, मशीन कोड प्रोग्रामिंग लगभग 1 घंटे के बाद अपर्याप्त हो जाएगी। आप सही हैं, एक बेहतर और अधिक उत्पादक विचार सीपीयू कार्यान्वयन के लिए नीचे आना है। 6502 ( विजुअल 6502.org ) के वर्चुअल वर्जन के साथ-साथ ऐसे लोग भी हैं जिनके पास सीपीयू के आधुनिक असतत तर्क ( bradrodriguez.com/papers/piscedu2.htm ) का उपयोग करने की आकांक्षा है
एंजेलो

जवाबों:


27

लोग मशीन कोड में प्रोग्राम नहीं करते (जब तक कि वे मसोकिस्टिक न हों)। वे मशीन कोड (संकलक-विकास उपकरण सहित) या कोडर उत्पन्न करने के लिए (या विकसित) टूल का उपयोग करते हैं, या शायद लाइब्रेरी कोड मशीन कोड (LLVM, libjit, GNU लाइटनिंग, ....) उत्पन्न करते हैं। इसलिए मशीन कोड निर्माण, संकलन, ऑप्टिमाइज़र और माइक्रो-आर्किटेक्चर के बारे में संसाधन भी प्रासंगिक हैं।

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

यदि आप मशीन कोड को समझना चाहते हैं, तो पहले विधानसभा जानें। यह मशीन कोड के बहुत करीब है। इसे बुद्धिमानी से उपयोग करें, केवल उन चीज़ों के लिए जिन्हें आप C (या कुछ उच्च-स्तरीय भाषा में, जैसे Ocaml, Haskell, Common Lisp, Scala) में कोड नहीं कर सकते। एक अच्छा तरीका अक्सर सी फ़ंक्शन के अंदर asmनिर्देशों (विशेष रूप से जीसीसी विस्तारित विधानसभा सुविधा) का उपयोग करना है। असेंबली कोड (द्वारा जनरेट किया गया gcc -S -O2 -fverbose-asm) पढ़ना भी मददगार हो सकता है।

लिनक्स विधानसभा HowTo को पढ़ने के लिए एक अच्छी बात है।

वर्तमान प्रोसेसर के निर्देश सेट आर्किटेक्चर (अर्थात चिप द्वारा समझे गए निर्देशों का सेट) काफी जटिल हैं। सामान्य हैं x86 (32 बिट मोड में एक विशिष्ट पीसी), X86-64 (64 बिट मोड में एक डेस्कटॉप पीसी), एआरएम (स्मार्टफोन, ...), पावरपीसी आदि वे सभी काफी जटिल हैं (ऐतिहासिक और किफायती होने के कारण) कारणों)। शायद पहले काल्पनिक निर्देश जैसे कि नथ का MMIX सरल है, सीखना ।


8
"लोग C (...) में कार्यक्रम नहीं करते हैं। वे आधुनिक भाषाओं का उपयोग करते हैं, शायद C बैकएंड के साथ"
Abyx

मैं निश्चित रूप से सहमत हूं। और मेरी वर्तमान कार्य परियोजना ( MELT , gcc-melt.org देखें ) सी। के लिए अनुवादित एक डीएसएल है
बेसिल स्ट्रायनेविच

मैंने
आईएसएएस के

6
उन लोगों के बारे में क्या जो बनाना चाहते हैं और कोडांतरक? मशीन कोड सीखने के कुछ कारण हैं, हालांकि वे इतने सामान्य नहीं हैं।
15

मैं कहूंगा कि यह एक निर्देश सेट वास्तुकला (असेंबली mnemonics का उपयोग करके) सीख रहा है। आप शायद ही कभी निर्देश के सटीक एन्कोडिंग को सीखते हैं (जैसे कि NOP 0x90 है)। असेंबलर या मशीन कोड जनरेटर लिखते समय आपको कई बार यह जानने की आवश्यकता होती है। (इसी तरह, आपको यूनिकोड की यूएनएफ 8 एनकोडिंग को हृदय से सीखने की आवश्यकता शायद ही हो)।
बेसिल स्टायरनेविच 15

13

जैसा कि पहले कहा गया था विधानसभा जानें

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

इसलिए विधानसभा ए symbolic representation of machine code

अब आप पूछ रहे होंगे "ठीक है, तो मैं यह सब कैसे सीखूं?" मुझे खुशी है कि आपने पूछा:

  1. समझें कि यह क्या है। यह बहुत निम्न स्तर का है और आपको कंप्यूटर की बहुत गहराई से समझ देगा। आप विकिपीडिया से शुरू करना चाहते हैं और फिर इस छोटे से मार्ग को पढ़ सकते हैं ।
  2. यह जानें! सर्वोत्तम पुस्तकें संभवतः असेम्बली लैंग्वेज और असेम्बली लैंग्वेज स्टेप-बाय-स्टेप की कला हैं : लिनक्स के साथ प्रोग्रामिंग
  3. कोडिंग प्राप्त करें!

मैं इस दूसरे सूत्र को पढ़ रहा था और मुझे लगता है कि मैं इस पर ठोकर खाता हूं: प्रोग्रामर.स्टैकएक्सचेंज. com/a/82573/43388 उस प्रकृति का कुछ भी जिस पर मुझे ट्यूटोरियल मिल सकता है? लेकिन, संक्रमण को आसान बनाने के लिए मुझे पहले विधानसभा सीखने की जरूरत है।
ऐसोफास्पीड्स

1
धन्यवाद, मुझे लगता है कि मुझे लोकप्रिय मांग पर विधानसभा सीखने की आवश्यकता है। +1
AceofSpades

8

मैं दृढ़ता से सुझाव देता हूं कि आप अपने लक्ष्य पर पुनर्विचार करें और यहां बताया गया है:

मैंने पहली बार बीबीसी माइक्रो कंप्यूटर (मॉडल बी, 32 के) पर 6502 असेंबली लैंग्वेज सीखी। इसमें एक भयानक बेसिक कार्यान्वयन था जिसमें एक मैक्रो असेंबलर शामिल था। हमारे पास स्कूल में था इसलिए मैंने सभी प्रकार के शरारती कार्यक्रम लिखे जो कि प्रत्येक स्क्रीन पर, कमरे के आसपास (वे नेटवर्क किए गए थे) यदि मशीन 10 मिनट तक उपयोग नहीं की गई थी । यह मेरे वर्ष 7 दोस्तों के बीच गिगल्स के फिट बैठता है।

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

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

विश्वविद्यालय में मुझे C ++ से परिचित कराया गया था और इस प्रकार मैं इसे Sun / Solaris और कुछ अन्य बड़े मेनफ्रेम कंप्यूटर प्रोग्राम करने के लिए उपयोग करने में सक्षम था। मुझे पता नहीं है कि इन मशीनों पर सीपीयू आर्किटेक्चर क्या चलता था - मुझे एसेंबलर या रीड मशीन कोड का उपयोग करने की आवश्यकता नहीं थी क्योंकि सी ++ टूल ने मुझे पेशेवर अनुप्रयोगों का उत्पादन करने के लिए आवश्यक शक्ति दी।

यूनी के बाद, मैंने विंडोज और यूनिक्स के कई स्वादों पर काम किया। C और C ++ ने इन सभी मशीनों पर काम किया और अंततः जावा ने भी किया।

फिर मैंने डिबगिंग के लिए व्यापक टूल चेन के साथ डायरेक्टएक्स के साथ सी ++ का उपयोग करके विंडोज और ड्रीमकास्ट पर काम किया।

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

अगली नौकरी विंडोज पर सी ++, सी # और जावास्क्रिप्ट के साथ काम कर रही थी। कोई मशीन कोड नहीं।

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

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

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

जावास्क्रिप्ट, जावा, C #, C ++ या ObjC जैसी किसी चीज़ की तुलना में एक अद्भुत असेंबली भाषा / मशीन कोड प्रोग्रामर के लिए उपलब्ध रोजगार के अवसरों की संख्या में कमी है।

मैं आपको एक मुख्य लक्ष्य के बजाय इसे एक शौक / पक्ष-हित बनाने की सलाह दूंगा।


6
यह एक शौक है। मुझे दिलचस्पी है कि चीजें कैसे काम करती हैं और यदि संभव हो तो बहुत ही बुनियादी स्तर पर उन्हें हेरफेर करना सीखें। +1
AceofSpades

6

मेरा सुझाव? MIPS सीखें और एक सरल (सरल) MIPS प्रोसेसर बनाना सीखें। यह वास्तव में ऐसा लगता है की तुलना में आसान है।

कुछ अन्य आर्किटेक्चर पर MIPS का लाभ सरलता है। आप छोटे विवरणों के एक टन में फंस नहीं पाएंगे, लेकिन आप अभी भी सभी बड़े विचारों को सीखेंगे जो आपको अन्य आर्किटेक्चर में कोड लिखने की आवश्यकता है।

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

अन्य बातों के अलावा, हम किया था कवर कैसे MIPS कोड बाइनरी में बदल जाता है; हमें परीक्षा में कुछ (बहुत ही सरल) मशीन कोड को भी डीकोड करना पड़ा।

यहां तक ​​कि अगर आप सब कुछ कवर नहीं करना चाहते हैं, तो अधिकांश व्याख्यान छात्रों के पसंदीदा व्याख्याताओं में से एक द्वारा दिए गए थे और स्वयं द्वारा देखने के लिए मजेदार हैं।


लिंक के लिए बहुत बहुत धन्यवाद और समझाता हूं कि मुझे कहां से शुरू करना चाहिए। +1
AceofSpades

6

मैं एक छात्र हूँ, प्रोग्रामिंग में नया हूँ और इसे प्यार करता हूँ, जावा से सी ++ और नीचे सी। मैं नंगे पांव पीछे की ओर चला गया और आगे विधानसभा तक जाने के लिए सोचा।

उत्कृष्ट पथ लेने के लिए। C से असेंबली और लोअर तक मेरा जंप (फॉल?) एक यूनिवर्सिटी कोर्स कंप्यूटर ऑर्गनाइजेशन एंड डिज़ाइन था , जो इसी नाम से किताब पर आधारित था ।

मूल MIPS असेंबली पर पहले अध्याय के लिए इस पुस्तक की अत्यधिक अनुशंसा करें, सभी तरह से पाइपलाइनिंग और मेमोरी आर्किटेक्चर के माध्यम से। इससे भी बेहतर होगा कि आप एक ही विषय पर कोर्स करें, या ऑनलाइन कुछ व्याख्यान खोजें।

अपने हाथों को गंदे लेखन असेंबली पाने के लिए MARS MIPS सिम्युलेटर भी देखें ।


4

यदि आप यह समझना चाहते हैं कि मशीन पूरी तरह से कैसे काम करती है, तो आप सबसे निचले स्तर पर क्यों नहीं जाते हैं और अपना रास्ता बनाते हैं जहां आप हैं (जैसे, सी, सी ++)?

इसके द्वारा मेरा मतलब है: आप सर्किट पर ट्रांजिस्टर के साथ अपने स्वयं के 4-बिट योजक का निर्माण क्यों नहीं करते हैं (यदि आप निर्देश / ट्यूटोरियल की तलाश कर रहे हैं तो Google इसे केवल)?

उसके बाद कुछ रैम के साथ एक छोटा कंप्यूटर बनाएं, और फिर असेंबली सीखना शुरू करें और इसके साथ एक या दो प्रोग्राम लिखें।


यदि मूल पोस्टर खरोंच से एक कंप्यूटर का निर्माण करता है, तो उसे अपनी विधानसभा को परिभाषित करना होगा (न कि केवल सीखना)।
बेसिल स्टारीनेवविच

@ डैनियल मैं बिट्स से जोड़कर तर्क को समझता हूं जो कि सच्चा निम्न स्तर है। +1
AceofSpades

स्क्रैच से कंप्यूटर बनाने का एक विकल्प Z80 या 6502 की तरह कुछ पुराने प्रोसेसर (और इसकी असेंबली लैंग्वेज) को सीख सकता है जो अभी भी समझने में काफी सरल है। मुझे लगता है कि ऐसे भी एमुलेटर हैं जिनसे आप खेल सकते हैं।
जियोर्जियो

@AceofSpades सीपीयू और सीपीयू घटकों (जैसे कि एक योजक) को आसानी से बनाने का एक शानदार तरीका Minecraft में रेडस्टोन के साथ है, मैं इसकी सिफारिश करूंगा। मैंने Minecraft में कुछ सरल मशीनों पर काम करना शुरू कर दिया है, और इसने कंप्यूटर के पीछे सिद्धांत और तर्क की मेरी समझ को बहुत बढ़ा दिया है।
आरोन

1

मेरे पास एक निर्देश सेट है जो इसके लिए बनाया गया था, एक सिम्युलेटर और मूल पाठ पर कुछ ट्यूटोरियल प्रति पाठ या निर्देश। बस प्रोग्राम टाइप करें, इसे चलाएं फिर जानें कि यह क्या करता है, अगले पाठ पर आगे बढ़ें।

http://www.github.com/dwelch67/lsasim

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


1

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

और मैंने अभी इस प्रश्न को Electronics.stackexchange पर पढ़ा है जो उपयोग का भी हो सकता है


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.