ทรัพยากรในการเรียนรู้การเขียนโปรแกรมในรหัสเครื่อง? [ปิด]


24

ฉันเป็นนักเรียนสดใหม่ในการเขียนโปรแกรมและรักมันจาก Java ไปยัง C ++ และลงไปที่ C ฉันย้ายกลับไปที่แบร์โบนและคิดว่าจะลงไปที่ Assembly ต่อไป

แต่ฉันประหลาดใจที่คนจำนวนมากบอกว่ามันไม่เป็นอย่างที่ C และมีการใช้งานไม่มี พวกเขาบอกการเรียนรู้ทั้งวิธีการเขียนโปรแกรมเคอร์เนลหรือเขียนคอมไพเลอร์ C ความฝันของผมคือการเรียนรู้ในการเขียนโปรแกรมในไบนารี (รหัสเครื่อง) หรืออาจจะเขียนโปรแกรมโลหะเปลือย (โปรแกรมไมโครคอนโทรลเลอร์ร่างกาย) หรือการเขียนประวัติหรือตักบูตหรือสิ่งที่มีลักษณะที่

สิ่งที่เป็นไปได้เพียง แต่ผมได้ยินมาหลังจากการวิจัยมากเป็นที่แก้ไข hex เป็นสิ่งที่ใกล้เคียงกับภาษาเครื่องที่ฉันสามารถหาในยุคนี้และยุค มีสิ่งอื่นที่ฉันไม่รู้หรือไม่ มีแหล่งข้อมูลเพื่อเรียนรู้การเขียนโปรแกรมในรหัสเครื่องหรือไม่? โดยเฉพาะอย่างยิ่งใน 8 บิตไมโครคอนโทรลเลอร์ / ไมโครโปรเซสเซอร์

นี้คำถามคือคล้ายกับระเบิด แต่ฉันสนใจในการเรียนรู้การปฏิบัติก่อนแล้วจึงทำความเข้าใจทฤษฎี


2
สิ่งที่ว่าเป็นปัญหาที่นี่? หากคุณถามว่าเป็นไปได้หรือไม่ที่จะใช้รหัสในรหัสเครื่องคำตอบน่าจะเป็น "ใช่" หากคุณกำลังขอบทช่วยสอนก) ทำให้ชัดเจนว่าคำถามของคุณคืออะไร แต่ข) ไม่ใช่คำถามที่สร้างสรรค์
ChrisF

6
C ไม่ได้เป็นโลหะเพียงพอหรือไม่
Tom Squires

6
ฉันprogram bare metalทุกครั้งที่ฉันเตะกล่องเซิร์ฟเวอร์ ใช้งานได้มหัศจรรย์!
yannis

7
เคยคิดว่าจะลงไปอีกหรือไม่ แฮ็ค CPU ของคุณเอง: opencores.org
SK-logic

3
@ SK-logic ใช่การเขียนโปรแกรมรหัสเครื่องจะไม่สามารถใช้งานได้หลังจากผ่านไปประมาณ 1 ชั่วโมง คุณพูดถูกแล้วความคิดที่ดีกว่าและมีประสิทธิผลมากกว่าคือการนำ CPU มาใช้ นอกจากนี้ยังมีเวอร์ชั่นเสมือนจริงของ 6502 ( visual6502.org ) รวมถึงผู้ที่มีหรือปรารถนาที่จะสร้างซีพียูโดยใช้ตรรกะที่ไม่ต่อเนื่องสมัยใหม่ ( bradrodriguez.com/papers/piscedu2.htm )
Angelo

คำตอบ:


27

ผู้คนไม่ได้เขียนโปรแกรมในรหัสเครื่อง (นอกเสียจากว่าจะร้าย) พวกเขาใช้เครื่องมือ (หรือพัฒนา) เพื่อสร้างรหัสเครื่อง (คอมไพเลอร์หรือแอสเซมเบลอร์รวมถึงเครื่องมือการพัฒนาข้าม) หรือบางทีไลบรารีที่สร้างรหัสเครื่อง (LLVM, libjit, GNU Lightning, .... ) ดังนั้นแหล่งข้อมูลเกี่ยวกับการสร้างรหัสเครื่องการรวบรวมตัวเพิ่มประสิทธิภาพและสถาปัตยกรรมไมโครจึงมีความเกี่ยวข้องเช่นกัน

และบ่อยครั้งที่คอมไพเลอร์การเพิ่มประสิทธิภาพที่ดีสร้างรหัสเครื่องที่ดีกว่าที่คุณสามารถทำได้ คุณอาจไม่สามารถเขียนรหัสแอสเซมเบลอร์ไลน์ 200 เส้นได้ดีกว่าเครื่องมือเพิ่มประสิทธิภาพที่ดี

หากคุณต้องการเข้าใจรหัสเครื่องเรียนรู้การประกอบก่อน ใกล้กับรหัสเครื่องมาก ใช้อย่างชาญฉลาดเฉพาะกับสิ่งที่คุณไม่สามารถใช้รหัสใน C (หรือในภาษาระดับสูงกว่าบางอย่างเช่น Ocaml, Haskell, Common Lisp, Scala) วิธีที่ดีมักจะใช้asmคำสั่ง (โดยเฉพาะอย่างยิ่งคุณลักษณะการประกอบ GCC แบบขยาย ) ภายในฟังก์ชัน C การอ่านรหัสการประกอบ (สร้างโดยgcc -S -O2 -fverbose-asm) อาจมีประโยชน์เช่นกัน

การประกอบ Linux HowToเป็นสิ่งที่ดีในการอ่าน

สถาปัตยกรรมชุดคำสั่งของโปรเซสเซอร์ปัจจุบัน (เช่นชุดคำสั่งที่เข้าใจโดยชิป) นั้นค่อนข้างซับซ้อน คนทั่วไปคือx86 (พีซีทั่วไปในโหมด 32 บิต), X86-64 (พีซีเดสก์ท็อปในโหมด 64 บิต), ARM (สมาร์ทโฟน, ... ), PowerPCเป็นต้นพวกมันค่อนข้างซับซ้อน (เพราะประวัติศาสตร์และประหยัด เหตุผล) บางทีการเรียนรู้ครั้งแรกการสอนแบบตั้งสมมุติฐานอย่างเช่นMMIX ของ Knuthนั้นง่ายกว่า


8
"ผู้คนไม่ได้เขียนโปรแกรมใน C (... ). พวกเขาใช้ภาษาสมัยใหม่บางทีด้วย C backend"
Abyx

ฉันเห็นด้วยอย่างแน่นอน และโครงการทำงานปัจจุบันของฉัน (MELT ดูgcc-melt.org ) เป็น DSL แปลเป็น C.
Basile Starynkevitch

ฉันเพิ่มการอ้างอิงถึง ISAs
Basile Starynkevitch

6
สิ่งที่เกี่ยวกับผู้ที่ต้องการสร้างและประกอบ? มีเหตุผลในการเรียนรู้รหัสเครื่องแม้ว่าจะไม่เป็นเช่นนั้นก็ตาม
Jetti

ฉันจะบอกว่ามันคือการเรียนรู้สถาปัตยกรรมชุดคำสั่ง (ใช้ประกอบการจำ) คุณไม่ค่อยเรียนรู้การเข้ารหัสคำสั่งที่แน่นอน (เช่น NOP คือ 0x90) คุณหลายคนต้องรู้เมื่อเขียนแอสเซมเบลอร์หรือเครื่องกำเนิดรหัส (เช่นเดียวกันคุณไม่ค่อยจำเป็นต้องเรียนรู้ด้วยการเข้ารหัส UTF8 ของ Unicode)
Basile Starynkevitch

13

ตามที่ได้ระบุไว้ก่อนหน้าเรียนรู้สภา

ภาษาแอสเซมบลีเป็นภาษาการเขียนโปรแกรมระดับต่ำสำหรับคอมพิวเตอร์ไมโครโพรเซสเซอร์ไมโครคอนโทรลเลอร์และอุปกรณ์ที่ตั้งโปรแกรมได้อื่น ๆ มันดำเนินการเป็นตัวแทนสัญลักษณ์ของรหัสเครื่องและค่าคงที่อื่น ๆ ที่จำเป็นในการเขียนโปรแกรมสถาปัตยกรรม CPU ที่กำหนด

symbolic representation of machine codeดังนั้นสมัชชาเป็น

ตอนนี้คุณอาจถามว่า "โอเคแล้วฉันจะเรียนรู้ทั้งหมดนี้ได้อย่างไร" ฉันดีใจที่คุณถามว่า:

  1. เข้าใจว่ามันคืออะไร มันอยู่ในระดับต่ำมากและจะทำให้คุณมีความเข้าใจในเชิงลึกของคอมพิวเตอร์ คุณอาจต้องการเริ่มต้นด้วยWikipediaแล้วอ่านบทความสั้น ๆนี้
  2. เรียนรู้มัน! การอ่านที่ดีที่สุดน่าจะเป็นThe Art of Assembly LanguageและAssembly Language ทีละขั้นตอน: การเขียนโปรแกรมด้วย Linux
  3. รับการเข้ารหัส!

ฉันกำลังอ่านหัวข้ออื่น ๆ นี้และฉันคิดว่าฉันสะดุดกับสิ่งนี้: programmers.stackexchange.com/a/82573/43388อะไรที่เป็นลักษณะนั้นฉันสามารถหาบทเรียนได้หรือไม่ แต่ฉันต้องเรียนรู้การชุมนุมก่อนเพื่อให้การเปลี่ยนแปลงง่ายขึ้น
AceofSpades

1
ขอบคุณฉันเดาว่าฉันต้องเรียนรู้การชุมนุมตามความต้องการที่เป็นที่นิยม +1
AceofSpades

8

ฉันขอแนะนำให้คุณพิจารณาเป้าหมายของคุณใหม่และนี่คือเหตุผล:

ฉันเรียนรู้ภาษาแอสเซมบลี 6502 ครั้งแรกบน BBC Microcomputer (รุ่น B, 32K) มันมีการใช้งานพื้นฐานที่ยอดเยี่ยมซึ่งรวมถึงแอสเซมเบลอร์แมโคร เรามีพวกเขาที่โรงเรียนดังนั้นฉันจึงเขียนโปรแกรมซุกซนทุกประเภทที่จะทำสิ่งต่าง ๆ เช่นการจัดการบัฟเฟอร์หน้าจอโดยตรงเพื่อให้ Lemming เดินข้ามแต่ละหน้าจอรอบห้อง (พวกเขาอยู่ในเครือข่าย) หากเครื่องไม่ได้ใช้งานเป็นเวลา 10 นาที . มันส่งผลให้หัวเราะคิกคักในหมู่เพื่อนปี 7 ของฉัน

เมื่อฉันได้ Commodore 64 ที่บ้านฉันได้เรียนรู้ว่ามันมี 6510 CPU ซึ่งใช้ภาษาแอสเซมบลี 6502 ด้วย แต่ก็มีสิ่งพิเศษที่น่าสนใจ ฉันต้องซื้อแอสเซมเบลอร์ (มาพร้อมตลับ ) และเรียกใช้โปรแกรมผ่าน BASIC ด้วยวิสัยทัศน์ที่ยิ่งใหญ่ของการเขียนเกมที่ขายดีที่สุดในที่สุดฉันก็สามารถสร้างการสาธิตหลายอย่างที่ฮาร์ดแวร์การแสดงผลวิดีโอแบบสองมิติที่ลงทะเบียนเพื่อขัดจังหวะการทำเอฟเฟกต์แถบสีที่น่าสนใจ น่าประทับใจ แต่ไม่มีประโยชน์

ฉันได้ Acorn Archimedes A310 ซึ่งมีซีพียู ARM2 ดังนั้นฉันจึงใช้การใช้งาน BASIC แบบเดียวกันกับแอสเซมเบลอร์แมโครในตัวเช่นเดียวกับ BBC Micro (มรดกเดียวกัน) ฉันพยายามที่จะรวบรวมเกมสองสามเกมที่เพื่อนอาร์ทตี้จัดหากราฟิกให้รวมถึงการสาธิต trippy ที่ใช้ไซน์ ทั้งสองอย่างนี้เป็นงานที่ยากในการเขียนโปรแกรมและรหัสที่ไม่ดีอาจทำให้เครื่องเสียหายได้ (โดยไม่ได้ตั้งใจลงทะเบียนการรีเซ็ตฮาร์ดแวร์ ฯลฯ ) ทำให้สูญเสียทุกอย่างหากฉันไม่ได้บันทึก (เพื่อฟลอปปี้!)

ที่มหาวิทยาลัยฉันได้รับการแนะนำให้รู้จักกับภาษาซีพลัสพลัสและซีฉันจึงสามารถใช้มันเพื่อเขียนโปรแกรม Sun / Solaris และคอมพิวเตอร์เมนเฟรมขนาดใหญ่อื่น ๆ ฉันไม่รู้ว่าซีพียูสถาปัตยกรรมเครื่องเหล่านี้ทำงานได้อย่างไร - ฉันไม่เคยต้องการใช้แอสเซมเบลอร์หรืออ่านรหัสเครื่องเนื่องจากเครื่องมือ C ++ มอบพลังที่ฉันต้องการในการผลิตแอพพลิเคชั่นมืออาชีพ

หลังจาก Uni ฉันทำงานบน Windows และ Unix หลายรสชาติ C และ C ++ ทำงานบนเครื่องเหล่านี้ทั้งหมดและในที่สุดก็ทำ Java

ฉันทำงานบน Windows และ Dreamcast โดยใช้ C ++ กับ DirectX พร้อมด้วยโซ่เครื่องมือที่ครอบคลุมสำหรับการดีบัก

จากนั้นฉันทำงานที่ทำงานกับชิปเซ็ต ARM สำหรับสมาร์ททีวี (ในปี 2000) แม้ว่าประสบการณ์ของฉันกับ ARM2 อาจเกี่ยวข้องกันที่นี่ แต่งานนั้นเป็นพื้นฐานของ C ฉันพบว่าทุกสิ่งที่เกี่ยวกับฮาร์ดแวร์ที่ฉันทำกับอาร์คิมีดีสนั้นสามารถทำได้ใน C โดยใช้การดำเนินการ bit-twiddling ที่ตรงไปตรงมา ส่วนหนึ่งของบทบาทของฉันคือการโยกย้ายฐานรหัสไปยัง Windows, Playstation 2, Linux, ทีวีและชิปเซ็ตมือถืออื่น ๆ แพลตฟอร์มเหล่านี้ทั้งหมดมีทั้งคอมไพเลอร์ C (มักจะเป็น GCC) และระดับ API บางส่วนในการเขียนไปยังเครื่องต้นแบบ - โลกที่ฝังตัวนั้นแทบจะเป็นเคอร์เนล O / S ฉันไม่จำเป็นต้องรู้รหัสเครื่องเต็มรูปแบบสำหรับแพลตฟอร์มเฉพาะใด ๆ นอกเหนือจากการเขียนบูตโหลดเดอร์และมินิไบออสซึ่งทั้งคู่กระโดดลงไปในรหัส C ในโอกาสแรกที่มีอยู่ (หลังจากตั้งค่าเวกเตอร์ดัก

งานต่อไปคือทำงานกับ C ++, C # และ JavaScript บน Windows ไม่มีรหัสเครื่อง

งานปัจจุบันทำงานกับ C ++, JavaScript, Python, LUA, HTML และภาษาอื่น ๆ บนแพลตฟอร์มต่างๆ ฉันไม่รู้ว่าแพลตฟอร์มเหล่านี้รันโค้ดเครื่องใดและฉันไม่จำเป็นต้องรู้คอมไพเลอร์แปลโค้ดของเราเป็นสิ่งที่จำเป็นต้องมี ถ้ามันล้มเหลวฉันจะตรวจพบข้อผิดพลาดในดีบักเกอร์หรือผ่านการวินิจฉัยรันไทม์ (ข้อยกเว้นสัญญาณ ฯลฯ )

เพื่อความสนุกฉันพัฒนาแอพพลิเคชั่น iOS ในเวลาว่างที่บ้าน มันใช้ Objective-C และ API ที่ใช้งานได้กับชิปเซ็ตจำนวนมาก เห็นได้ชัดว่าพวกเขาใช้ ARM แต่ฉันไม่เคยเห็นรหัสเครื่องใด ๆ ในการพัฒนาของฉัน

ในขณะที่มันเป็นแบบฝึกหัดที่น่าสนใจในการเรียนรู้ภาษาแอสเซมบลีขณะนี้มีเครื่องมือและภาษาระดับสูงกว่ามากซึ่งช่วยให้คุณมีลำดับความสำคัญมากขึ้น (หรือสอง) มีประสิทธิภาพมากขึ้น

จำนวนของโอกาสในการทำงานที่มีให้กับโปรแกรมเมอร์ภาษาแอสเซมบลี / รหัสเครื่องน่าพิศวงเมื่อเปรียบเทียบกับ JavaScript, Java, C #, C ++ หรือ ObjC

ฉันขอแนะนำให้คุณทำให้งานอดิเรก / ผลประโยชน์ด้านข้างแทนที่จะเป็นเป้าหมายหลัก


6
มันเป็นงานอดิเรก ฉันสนใจในสิ่งที่ทำงานและเรียนรู้ที่จะจัดการกับพวกเขาในระดับพื้นฐานมากถ้าเป็นไปได้ +1
AceofSpades

6

คำแนะนำของฉัน? เรียนรู้ MIPS และเรียนรู้วิธีสร้างโปรเซสเซอร์ MIPS (ง่าย) มันง่ายกว่าที่คิดจริงๆ

ข้อได้เปรียบของ MIPS เหนือสถาปัตยกรรมอื่น ๆ คือความเรียบง่าย คุณจะไม่จมอยู่กับรายละเอียดเล็ก ๆ น้อย ๆ แต่คุณจะยังคงได้เรียนรู้แนวคิดใหญ่ทั้งหมดที่คุณต้องเขียนโค้ดในสถาปัตยกรรมอื่น ๆ

บังเอิญนี่เป็นโครงการสุดท้ายสำหรับอินโทร CS ของฉัน (ที่สาม) ถ้าคุณต้องการคุณสามารถอ่านได้รับมอบหมายและเรียกดูผ่านการบรรยายเป็นวิดีโอหรือภาพนิ่ง

เหนือสิ่งอื่นใดเราได้กล่าวถึงวิธีการที่รหัส MIPS กลายเป็นไบนารี เราต้องถอดรหัสรหัสเครื่อง (ง่ายมาก) บางส่วนในการสอบ

แม้ว่าคุณจะไม่ต้องการปกปิดทุกอย่าง แต่การบรรยายส่วนใหญ่จะได้รับจากอาจารย์ที่ชื่นชอบของนักเรียนคนหนึ่งและสนุกกับการดูด้วยตนเอง


ขอบคุณมากสำหรับลิงก์และอธิบายว่าฉันควรเริ่มจากตรงไหน +1
AceofSpades

6

ฉันเป็นนักเรียนสดใหม่ในการเขียนโปรแกรมและรักมันจาก Java ไปยัง C ++ และลงไปที่ C ฉันย้ายกลับไปที่แบร์โบนและคิดว่าจะลงไปที่ Assembly ต่อไป

เส้นทางที่ยอดเยี่ยมที่จะใช้ กระโดดของฉัน (ฤดูใบไม้ร่วง?) จาก C ไปสภาและล่างเป็นหลักสูตรมหาวิทยาลัยองค์การคอมพิวเตอร์และการออกแบบบนพื้นฐานของหนังสือชื่อเดียวกัน

ขอแนะนำหนังสือเล่มนี้สำหรับบทแรกในชุด MIPS พื้นฐานตลอดจนการวางท่อและสถาปัตยกรรมหน่วยความจำ ยิ่งไปกว่านั้นคือการเรียนหลักสูตรในหัวข้อเดียวกันหรือค้นหาการบรรยายออนไลน์

นอกจากนี้ดูที่MIPS SimulatorของMARSเพื่อให้ชุดประกอบการเขียนของคุณสกปรก


4

หากคุณต้องการเข้าใจวิธีการทำงานของเครื่องอย่างสมบูรณ์ทำไมคุณไม่ไปที่ระดับต่ำสุดเท่าที่จะเป็นไปได้

โดยที่ฉันหมายถึง: ทำไมคุณไม่สร้าง adder 4 บิตของคุณเองด้วยทรานซิสเตอร์ในวงจร (แค่ Google ถ้าคุณกำลังมองหาคำแนะนำ / การสอน)

หลังจากนั้นสร้างคอมพิวเตอร์ขนาดเล็กที่มี RAM บางส่วนแล้วเริ่มการเรียนรู้แอสเซมบลีและเขียนโปรแกรมหนึ่งหรือสองด้วย


หากโปสเตอร์ต้นฉบับสร้างคอมพิวเตอร์จากศูนย์เขาจะต้องกำหนด (ไม่ใช่แค่เรียนรู้) การประกอบของเขา
Basile Starynkevitch

@ แดเนียลฉันเข้าใจเหตุผลโดยการเรียนรู้การเพิ่มจากบิตซึ่งเป็นระดับต่ำจริง +1
AceofSpades

อีกทางเลือกหนึ่งในการสร้างคอมพิวเตอร์จากศูนย์คือการเรียนรู้โปรเซสเซอร์เก่า (และภาษาแอสเซมบลี) เช่น Z80 หรือ 6502 ที่ยังง่ายพอที่จะเข้าใจ ฉันเดาว่ายังมีอีมูเลเตอร์ที่คุณสามารถเล่นได้
Giorgio

@ AceofSpades วิธีที่ยอดเยี่ยมในการสร้างซีพียูและส่วนประกอบของ CPU (เช่นแอดเดอร์) คือการจับกลุ่มใน Minecraft ฉันอยากจะแนะนำ ฉันเริ่มทำงานกับเครื่องจักรง่าย ๆ ใน Minecraft และมันช่วยเพิ่มความเข้าใจเกี่ยวกับทฤษฎีและตรรกะเบื้องหลังคอมพิวเตอร์
แอรอน

1

ฉันมีชุดคำสั่งที่สร้างขึ้นสำหรับสิ่งนี้เครื่องจำลองและบทเรียนบางอย่างเกี่ยวกับพื้นฐานหนึ่งคำแนะนำหรือแนวคิดต่อบทเรียน เพียงแค่พิมพ์โปรแกรมเรียกใช้แล้วเรียนรู้สิ่งที่มันทำไปที่บทเรียนต่อไป

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

ฉันยังมีตัวจำลองสำหรับชุดคำสั่งหลักสองสามชุดด้วยเช่นกัน สิ่งใดสิ่งหนึ่งหรือทั้งหมดที่ดีสำหรับการใช้เรียนรู้ asm (ถ้าคุณรู้สึกว่าคุณต้องเรียนรู้ x86 เรียนรู้ที่ผ่านมาและใช้โปรแกรมจำลองเช่นเดียวกับที่ฉันคดเคี้ยว 8088/86 ก่อนจากนั้นก้าวไปข้างหน้า) การเรียนรู้กับตัวจำลองมีข้อดีข้อเสียหนึ่งโปรหลักเมื่อเริ่มต้นคือคุณไม่ผิดพลาดอะไรและคุณมีทัศนวิสัยที่ยอดเยี่ยม กระโดดเข้าหาหัวก่อนเข้าสู่แพลตฟอร์มที่ฝังตัวไมโครคอนโทรลเลอร์ ฯลฯ เพื่อเรียนรู้ชุดคำสั่งใหม่ที่คุณต้องเอาชนะอุปสรรคที่ไม่สามารถมองเห็นสิ่งที่เกิดขึ้นนำไปสู่รายการยาว ๆ ของวิธีที่ล้มเหลว ...


1

รหัสโดย Charles Petzoldเป็นการแนะนำที่ดีมากสำหรับหัวเรื่องและอธิบายกระบวนการสร้างคอมพิวเตอร์รวมถึงวิธีการสร้างส่วนเสริมเคาน์เตอร์และ RAM อาร์เรย์และแนะนำรหัสเครื่องและภาษาแอสเซมบลีและความสัมพันธ์กับภาษาระดับสูงขึ้น นอกจากนี้ยังเป็นการอ่านที่ยอดเยี่ยมเกี่ยวกับประวัติของการคำนวณ

และฉันเพิ่งอ่านคำถามเกี่ยวกับอุปกรณ์อิเล็กทรอนิกส์การแลกเปลี่ยนที่สามารถใช้งานได้เช่นกัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.