เราไปจาก Binary / Hex ไปยังชุดคำสั่งประกอบได้อย่างไร?


13

ดังนั้นฉันจึงพยายามเรียนรู้การเขียนโปรแกรม Embedded / Assembly บางส่วนในระยะหลัง ๆ นี้รวมถึงการพยายามเรียนรู้ระดับต่ำสุด (ประตูและสิ่งอื่น ๆ )

สิ่งหนึ่งที่ทำให้ฉันเข้าใจว่า .... คือชุดคำสั่ง "รับ" ของเรา ฉันค่อนข้างเข้าใจว่าเกต / TTL และงานดังกล่าวเป็นอย่างไร แต่ฉันไม่เห็นว่าเราได้รับจากวิธีนั้นไปยัง mov เพิ่มเพิ่ม clr ฯลฯ ... ?

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

แก้ไข: ฉันเดาว่าสำหรับความชัดเจนแกล้งฉันพูดคุยเกี่ยวกับไมโครโปรเซสเซอร์แรกพวกเขาไปจากไบนารีเพื่อสร้างชุดคำสั่งได้อย่างไร


2
ทุกคำสั่งมีค่าคอมไพเลอร์แปลงรหัสของคุณเป็นคำแนะนำเหล่านี้ขึ้นอยู่กับวิธีที่โครงสร้างของรหัสของคุณ
Ramhound

1
ผมไม่แน่ใจว่าถ้าผมเข้าใจคำถามของคุณอย่างสมบูรณ์ แต่ฉันคิดว่าคุณสามารถหาคำตอบของคุณที่นี่ , ที่นี่หรือที่นี่
e-MEE

1
คู่คำถามที่เกี่ยวข้องอย่างใกล้ชิดprogrammers.stackexchange.com/questions/81624/…และsuperuser.com/questions/307116/…
jhocking

3
พวกเขาเปลี่ยนจากไบนารีไปสู่การสร้างชุดคำสั่งได้อย่างไร อันที่จริง "พวกเขา" ไม่ได้ - เป็นวิธีอื่น ๆ อย่างน้อยโดยทั่วไป ผู้ออกแบบ CPU พิจารณาการดำเนินการที่ CPU จะดำเนินการจากนั้นพวกเขาจะสร้างชุดคำสั่งจากนั้นและพวกเขาแมปคำแนะนำ (ช่วยในการจำ) กับ opcodes (รหัสเครื่องไบนารี) @Scott Whitlock ให้คำตอบที่ดีด้านล่างฉันเพียงต้องการที่จะตอบคำถามสุดท้ายของคุณเพราะสมมติฐานของคุณอย่างน้อยก็ย้อนหลัง
เรเดียน

1
หนังสือเล่มนี้ดีจริงๆ: www1.idc.ac.il/tecsเป็นสิ่งที่อธิบายให้ฉันฟังทั้งหมดบทส่วนใหญ่เป็นแบบออนไลน์ฟรี คุณออกแบบชิปของคุณเอง (ในภาษาที่ใช้อธิบายฮาร์ดแวร์อย่างง่าย) จาก nand gates จากนั้นแอสเซมเบลอร์จากนั้นก็คอมไพเลอร์แล้วเขียนระบบปฏิบัติการในภาษาที่คุณสร้างขึ้น! สิ่งที่น่าอัศจรรย์ใจและในฐานะคนที่ไม่มีปริญญาวิทยาศาสตรบัณฑิตมันเป็นเวลาที่ดีสำหรับฉัน
bplus

คำตอบ:


18

หัวใจของ CPU เป็นALU มันเป็นความรับผิดชอบของการเรียนการสอน (เช่น MOV) ซึ่งเป็นเพียงบางส่วนของเลขฐานสองที่กำหนดไว้ล่วงหน้าและยังใช้ตัวถูกดำเนินการ 0, 1 หรือ 2 และดำเนินการการดำเนินการที่เกี่ยวข้องกับพวกเขา คำสั่งที่ง่ายที่สุดอาจเป็น NOP (ไม่มีการดำเนินการ) ซึ่งไม่ทำอะไรเลย การดำเนินการทั่วไปอื่นคือเพิ่ม (เพิ่มสองค่า)

ALU อ่านและเขียนข้อมูลจากและไปยัง "ลงทะเบียน" เหล่านี้เป็นตำแหน่งหน่วยความจำขนาดเล็กที่อยู่ภายใน CPU ส่วนหนึ่งของคำสั่ง (2 ถึง 3 บิตสำหรับแต่ละอินพุตขึ้นอยู่กับจำนวนรีจิสเตอร์ที่คุณมี) บ่งชี้ว่ารีจิสเตอร์ใดที่จะอ่าน มีหน่วยใน CPU ภายนอกไปยัง ALU ที่จัดการการโหลดข้อมูลที่ต้องการ (และคำสั่ง) จากหน่วยความจำไปยังการลงทะเบียนและการเขียนผลลัพธ์จากการลงทะเบียนกลับสู่หน่วยความจำ ตำแหน่งที่จะเขียนผลลัพธ์จะถูกเข้ารหัสเป็น 2 หรือ 3 บิตอีกด้วย

ตัวเลือกของ "รหัส op" ซึ่งเป็นเลขฐานสองที่แสดงถึงการดำเนินการไม่ได้โดยพลการ opcodes ที่ได้รับการเลือกมาอย่างดีจะช่วยลดความซับซ้อนของ ALU แต่ละบิตหรือกลุ่มของบิตมีแนวโน้มที่จะเปิดใช้งานและปิดการใช้งานประตูตรรกะบางอย่างใน ALU ตัวอย่างเช่นคำแนะนำการเพิ่มจะต้องเปิดใช้งานขั้นตอนการส่งออกเพื่อเลือกผลลัพธ์ของตรรกะการเพิ่มภายใน เช่นเดียวกันคำสั่ง MUL จะเลือกผลลัพธ์ของการคูณตรรกะ ขึ้นอยู่กับการออกแบบมีความเป็นไปได้ค่อนข้างมากที่ทั้งวงจรบวกและวงจรทวีคูณทั้งสองจะทำงานจริง ๆ กับตัวถูกดำเนินการอินพุตและเป็นเพียงการเลือกเอาต์พุต (สิ่งที่เขียนลงในบิตเอาต์พุตของ ALU)


1
ฉันเดาสิ่งที่ฉันถามพวกเขาจะเลือกได้อย่างไร แล้วพวกเขาจะกำหนดมันอย่างไร?

1
@Sauron: อ่านย่อหน้าที่ 3 อีกครั้งและลองทำความเข้าใจเลขคณิตเลขฐานสองและวงจรดิจิตอล ฉันสามารถแสดงชุดคำสั่งที่มี 256 คำสั่งโดยสาย 8 บิตในวงจรดิจิตอล นั่นหมายความว่าฉันต้องการ 8 พอร์ต io บนอุปกรณ์ฮาร์ดแวร์ของฉันเพื่อถ่ายโอนทุกสถานะที่เป็นไปได้ (2 สถานะต่อบรรทัด ^ 8 บรรทัด = 256 สถานะที่เป็นไปได้) หน่วยประมวลผลสามารถตัดสินใจได้ว่าจะทำอย่างไรกับสัญญาณอินพุตดิจิตอลนั้น วงจรดิจิตอลหมายถึงคุณมีสถานะฮาร์ดแวร์สองสถานะ: สูงและต่ำแรงดันไฟฟ้าหรือไม่มีแรงดันไฟฟ้า นั่นคือที่มาของไบนารี การเป็นตัวแทนไบนารีคือหนึ่งที่ใกล้เคียงกับโลหะ
เหยี่ยว

3
@Sauron - ค้นหาDigital Multiplexersเพื่อดูว่าวงจรดิจิทัลสามารถเลือกจากหนึ่งในหลาย ๆ ค่า หากคุณมีบัส 8 บิตคุณเพียงแค่ต้องมี 8 ของมัลติเพล็กเซอร์ดิจิตอลไบนารีเหล่านี้ในแบบคู่ขนาน
Scott Whitlock

1
@ Falcon Ok ....... ฉันคิดว่ามันสมเหตุสมผลดีกว่า ฉันลืมไปว่าในท้ายที่สุดแล้วทุกอย่างก็ลงไปที่สัญญาณไบนารี .... และแม้แต่คำสั่งเช่น "mov" ก็ยังคงแสดงเป็นไบนารี

1
@Sauron - ทำการวิจัยเกี่ยวกับ CPU มันจะช่วยให้คุณเข้าใจรหัส op คืออะไรและทำงานอย่างไร เหตุใดการเลือกรหัส op จึงไม่สำคัญแม้แต่การถามคำถาม "ทำไม" ถึงไม่สมเหตุสมผล การทำความเข้าใจกับวิธีเลือกใช้อาจช่วยให้คุณเข้าใจเพิ่มเติมเกี่ยวกับ CPU และโครงสร้างของ CPU
Ramhound

9

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

คอมพิวเตอร์ทุกเครื่องมีรหัสเครื่อง คำสั่งประกอบด้วย opcode และตัวถูกดำเนินการหนึ่งตัวขึ้นไป ตัวอย่างเช่นคำสั่ง ADD สำหรับ Intel 4004 (ไมโครโปรเซสเซอร์แรก) ได้รับการเข้ารหัสเป็น 1000RRRR โดยที่ 1000 คือ opcode สำหรับ ADD และ RRRR แทนหมายเลขทะเบียน 0-15 (0000-1111 ในไบนารี)

คำแนะนำอื่น ๆ ทั้งหมดที่อ้างอิงหนึ่งใน 16 บิต 4 บิต (เช่น INC, ISZ, LD, SUB, XCHG) ยังใช้ 4 บิตต่ำเพื่อเข้ารหัสหมายเลขลงทะเบียนและการเข้ารหัสต่าง ๆ ของ 4-bits อันดับสูงสุดเพื่อระบุ opcode ตัวอย่างเช่น ADD, SUB, LD และ XCHG ใช้ opcodes 1,000, 1001, 1010 และ 1011 (ทั้งหมดเป็นแบบไบนารี่) รวมกับฟิลด์ register ดังนั้นคุณสามารถดูว่ารูปแบบที่ใช้ในการลดความซับซ้อนของตรรกะ

โปรแกรมคอมพิวเตอร์แรก ๆ เขียนด้วยมือเขียนด้วยมือ 1 และ 0 เพื่อสร้างโปรแกรมในภาษาเครื่อง นี่คือโปรแกรมใน ROM (หน่วยความจำแบบอ่านอย่างเดียว) โดยทั่วไปโปรแกรมจะถูกเขียนลงในหน่วยความจำแฟลชที่ลบได้ทางไฟฟ้าในกรณีของไมโครคอนโทรลเลอร์หรือ RAM หมดหากไมโครโปรเซสเซอร์ (หน่วยหลังยังต้องการหน่วยความจำแบบอ่านอย่างเดียวเพื่อการบูท)

ภาษาเครื่องได้รับความน่าเบื่ออย่างรวดเร็วจริง ๆ ดังนั้นโปรแกรมแอสเซมเบลอร์จึงได้รับการพัฒนาโดยใช้ภาษาแอสเซมเบลอร์ mnemonic และแปลโดยทั่วไปจะเป็นหนึ่งในรหัสแอสเซมบลีต่อการเรียนการสอน ดังนั้นแทนที่จะเป็น 10000001 เราจะเขียน ADD R1

แต่ต้องมีการเขียนแอสเซมเบลอร์ครั้งแรกในรหัสเครื่อง จากนั้นสามารถเขียนใหม่ในรหัสแอสเซมเบลอร์ของตนเองและรุ่นภาษาเครื่องใช้เพื่อรวบรวมมันในครั้งแรก หลังจากนั้นโปรแกรมสามารถรวบรวมตัวเอง (ซึ่งเรียกว่า bootstrapping)

เนื่องจากไมโครโปรเซสเซอร์ตัวแรกได้รับการพัฒนามานานหลังจากเมนเฟรมหลักและ minicomputers อยู่ใกล้และ 4004 นั้นไม่เหมาะที่จะใช้งานแอสเซมเบลอร์อยู่ดี Intel อาจจะเขียน cross-assembler ที่ทำงานบนคอมพิวเตอร์เครื่องใหญ่เครื่องหนึ่งและแปลรหัสประกอบสำหรับ 4004 เป็นภาพไบนารีที่สามารถตั้งโปรแกรมไว้ใน ROM


4

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

ฉันจะทำให้ดีที่สุดเพื่อสรุป:

ดังที่กล่าวไว้ที่นี่ในใจเรามี ALU - สิ่งที่จำเป็นต้องรู้เกี่ยวกับ ALU (และส่วนอื่น ๆ ของ CPU) คือมันสามารถกำหนดค่าใหม่สำหรับการทำงานที่แตกต่างกัน โดยเฉพาะอย่างยิ่งเรามีความสามารถในการกำหนดค่าเส้นทางข้อมูลใหม่ซึ่งเป็นวิธีดึงพารามิเตอร์การดำเนินการที่ต้องทำและที่เก็บไว้ในภายหลัง จินตนาการความสามารถในการจัดการกับสามสิ่งเหล่านี้ - นี้เป็นของเราควบคุม

แล้วเราจะทำสิ่งนี้ให้สำเร็จได้อย่างไร? ดังกล่าวแล้วอีกครั้งเราสามารถใช้ประโยชน์จากตรรกะดิจิตอลระดับต่ำและสร้างมัลติเพล็กเซอร์สำหรับเส้นทางที่แตกต่างกัน มัลติเพล็กเซอร์ถูกควบคุมโดยใช้ชุดบิตสำหรับอินพุต - บิตเหล่านี้นำมาจากไหน? เข้ารหัสจากคำแนะนำเอง Takeaway: คำแนะนำเช่น mov, add, ฯลฯ เป็นเพียงชุดของบิตที่บอก CPU ถึงวิธีกำหนดค่าดาต้าแพทสำหรับการดำเนินการเฉพาะอย่าง สิ่งที่คุณกำลังอ่าน (mov, เพิ่ม) คือรูปแบบที่มนุษย์สามารถอ่านได้ (ภาษาแอสเซมบลี) และโปรแกรมของเราจะกำหนดขั้นตอนของดาต้าแพทและการทำงาน

ฉันขอโทษถ้านี่เป็นกระบวนการที่ซับซ้อนมากเกินไปสำหรับผู้ที่มีความรู้มากกว่าในด้านนี้ FYI, การแลกเปลี่ยนกองวิศวกรรมไฟฟ้าจะเป็นสถานที่ที่ดีในการถามคำถามนี้เพราะมันเกี่ยวข้องกับตรรกะระดับต่ำมาก


3

ถ้าฉันเข้าใจคำถามของคุณฉันไม่เข้าใจว่า bin / hex หรือแอสเซมบลีเกี่ยวข้องกันอย่างไร

ฉันถือว่าเนื้อของคำถามของคุณคือฉันจะได้รับจากประตูขั้นพื้นฐานและ, หรือ, ไม่ให้คำแนะนำเช่นการย้าย, โหลด, จัดเก็บ, เพิ่ม, ฯลฯ

ผมมีคำแนะนำเล็ก ๆ น้อย ๆ การเรียนการสอนของตัวเองตั้งผมทำจากรอยขีดข่วนที่มีบางส่วนของรายละเอียดของการพูดวิธีการเพิ่มและการทำงานลบออกจากประตูขั้นพื้นฐานและสิ่งที่ต้องการที่http://github.com/dwelch67/lsasim

มองหา Code (หนังสือบางอย่าง) จาก Petzold อาจเริ่มต้นสู่ระดับประถม แต่พาคุณอย่างช้าๆจากสิ่งที่ไม่เกี่ยวกับคอมพิวเตอร์และอุปกรณ์อิเล็กทรอนิกส์ไปสู่ระบบเลขฐานสองฐานสิบหกและไปสู่ประตูขั้นพื้นฐาน ฯลฯ

คุณถามว่าคุณจะสร้างได้อย่างไรตั้งแต่วันนี้หรือว่าพวกเขาจะสร้างมันขึ้นมาใหม่ในวันนี้ได้อย่างไร? วันนี้คุณจะเริ่มต้นด้วยคำจำกัดความของชุดคำสั่ง คุณเพียงแค่นั่งลงและเขียนออกมาคุณคิดเกี่ยวกับประเภทของคำสั่งที่คุณต้องมีโหลดและร้านค้าและการเคลื่อนไหวและสิ่งที่ alu แล้วจำนวนลงทะเบียนเท่าใดขนาดที่ลงทะเบียนนี้ในส่วนที่มีผลต่อขนาดการเรียนการสอนคุณคิดว่า เกี่ยวกับขนาดการเรียนการสอน ...

ให้ฉันหยุดและถามคุณว่าคุณเขียนโปรแกรมได้อย่างไร เริ่มต้นด้วยหน้าจอว่างในโปรแกรมแก้ไขข้อความ? คุณมีความคิดเกี่ยวกับงานที่คุณพยายามแก้ไขตัวแปรที่คุณอาจต้องการฟังก์ชั่นภาษาการเขียนโปรแกรม ฯลฯ และแต่ละคนก็แตกต่างกัน แต่คุณทำสิ่งนี้เล็กน้อย (พูดฟังก์ชั่นการกำหนดและการเขียน) สิ่งเล็กน้อย (การสร้างไฟล์ส่วนหัวที่มีการกำหนดและ enums และ structs และเนื้อหา) และสิ่งอื่น ๆ อีกเล็กน้อย (เพียงโค้ดให้กรอกฟังก์ชันด้วยตัวแปรและรหัส) และคุณหมุนเวียนไปรอบ ๆ งานต่าง ๆ ในท้ายที่สุดคุณรู้สึกว่าคุณมีความสมดุลของขนาดรหัสความเร็วความสามารถในการอ่านคุณภาพฟังก์ชั่น ฯลฯ ไม่ต่างกับการออกแบบฮาร์ดแวร์ นักออกแบบฮาร์ดแวร์ใช้ภาษาโปรแกรม (vhdl, verilog) เช่นกันและผ่านกระบวนการเดียวกัน

เช่นเดียวกับที่เกิดขึ้นกับโปรแกรมซอฟต์แวร์ที่คุณต้องการสมดุลความต้องการประสิทธิภาพขนาดคุณสมบัติ ฯลฯ คุณอาจมีกฎการออกแบบบางอย่างที่คุณต้องการหรือเจ้านายของคุณทำให้คุณทำ ฯลฯ เช่นเดียวกับการออกแบบซอฟต์แวร์หลังจาก การออกแบบเบื้องต้นในการนำไปใช้คุณอาจพบว่าคุณมีข้อผิดพลาดใหญ่และต้องกลับไปที่การออกแบบเบื้องต้นและเปลี่ยนชุดคำสั่งการเปลี่ยนแปลงใหญ่หรือเล็ก อาจเป็นไปได้ว่ามีตัวรวบรวมและตัวประมวลผลแบบจำลองเพื่อค้นหาว่าคุณต้องการคำแนะนำเฉพาะสองสามข้อที่ปรับปรุงคุณภาพของรหัสที่รวบรวมประสิทธิภาพและอื่น ๆ อย่างมาก

ดังนั้นคุณได้คิดค้นชุดคำสั่งตั้งแต่เริ่มต้นคุณได้ใช้ประสบการณ์บางอย่างกับการออกแบบฮาร์ดแวร์เพื่อจัดกลุ่มคำแนะนำที่คล้ายกันที่มีรูปแบบบิตที่คล้ายกันเพื่อให้สามารถถอดรหัสได้ง่ายขึ้นไม่เพียง แต่สำหรับการเขียนโปรแกรมภาษาฮาร์ดแวร์เท่านั้น สิ่งที่ดี. ทุกวันนี้คุณจะต้องทำการจำลองบางอย่างความเข้าใจของฉันคือ ARM เป็นซอฟต์แวร์ตัวจำลองก่อนจากนั้นการออกแบบฮาร์ดแวร์จะมาในภายหลังไม่รู้ว่ามันจริง แต่ติดกับเรื่องนั้น ขึ้นอยู่กับทีมบางทีมอาจเป็นแค่คนฮาร์ดแวร์และอยากจะเขียนโปรแกรมใน hdl บางอย่างเช่นฉันอาจต้องการทำทั้งสองอย่างเล็กน้อย วันนี้มีตัวจำลองภาษาที่ดีของฮาร์ดแวร์ไว้ให้บริการดังนั้นคุณไม่จำเป็นต้องสร้างฮาร์ดแวร์ใด ๆ ที่คุณรวบรวมและจำลองและทำการดีบักด้วยโปรแกรม / แพ็คเกจจำลองฮาร์ดแวร์ ทีมซอฟต์แวร์สามารถพัฒนาแอสเซมเบลอร์และคอมไพเลอร์สำหรับชุดคำสั่งและการใช้โปรแกรมจำลอง ram และรอมฟีดกับตัวประมวลผลจำลองและวางมันไว้ในจังหวะของมัน เราได้จำลองการบูตลินุกซ์เต็มรูปแบบบนโปรเซสเซอร์ที่ฉันทำงานเมื่อไม่นานมานี้ใช้เวลาหลายชั่วโมง แต่ก็ใช้งานได้ (พบข้อผิดพลาดแคชในตรรกะด้วยวิธีนี้)

ดังนั้นสำหรับสิ่งที่ฉันคิดว่าคุณกำลังถาม คุณจะได้รับจากเกทพื้นฐานไปจนถึงโปรเซสเซอร์พร้อมชุดคำสั่งได้อย่างไร ประตูขั้นพื้นฐานอย่างดีและ, หรือ, ไม่ได้เป็นแบบอะนาล็อก, พวกเขาไม่มีแนวคิดเกี่ยวกับเวลาคุณไม่สามารถเปลี่ยนแรงดันไฟฟ้าที่อินพุตและทันทีที่คุณเปลี่ยนแรงดันไฟฟ้าที่เอาต์พุตเริ่มเปลี่ยน ประตูทำจากทรานซิสเตอร์และทรานซิสเตอร์เป็นแอมป์ใช้อินพุทคูณมันด้วยจำนวนหนึ่งและยอมให้กระแสไหลผ่านอีกด้านได้ เมื่อเราใช้พวกเขาเป็นประตูตรรกะเรากำลังทำให้เกินจริงแรงดันไฟฟ้าขาเข้าสูงหรือต่ำจนทรานซิสเตอร์สามารถขับแรงดันไฟฟ้าสูงสุดหรือไม่มีแรงดัน (กระแส) โดยพื้นฐานแล้วตัวแปลงสัญญาณจะเปลี่ยนเป็นสวิตช์ เรื่องสั้นสั้นไม่มีแนวคิดเรื่องเวลา เพื่อให้มีชุดคำสั่งเราต้องมีคำสั่งเกิดขึ้นเพื่อที่เราจะต้องเรียงลำดับผ่านโปรแกรมเราจะต้องมีแนวคิดของตอนนี้เราอยู่ในคำสั่งนี้และในช่วงเวลาถัดไปเราจะทำงานกับคำสั่งนั้น เช่นเดียวกับเกมเปลี่ยนแอมป์เป็นสวิตช์คุณเล่นเกมที่คล้ายกันโดยใช้เกตลอจิกพื้นฐานพร้อมนาฬิกา นาฬิกามาจากผลึกเวทมนตร์ในกระป๋อง (ไม่น่าไปที่นี่) ทำให้แรงดันไฟฟ้าที่เปิดและปิดในอัตราคงที่ ใช้แรงดันไฟฟ้านั้นในสมการเชิงตรรกะและคุณสามารถเริ่มเรียงลำดับสิ่งต่าง ๆ ได้ นาฬิกามาจากผลึกเวทมนตร์ในกระป๋อง (ไม่น่าไปที่นี่) ทำให้แรงดันไฟฟ้าที่เปิดและปิดในอัตราคงที่ ใช้แรงดันไฟฟ้านั้นในสมการเชิงตรรกะและคุณสามารถเริ่มเรียงลำดับสิ่งต่าง ๆ ได้ นาฬิกามาจากผลึกเวทมนตร์ในกระป๋อง (ไม่คุ้มที่จะเข้าไปที่นี่) ซึ่งทำให้แรงดันไฟฟ้าที่เปิดและปิดในอัตราคงที่ ใช้แรงดันไฟฟ้านั้นในสมการเชิงตรรกะและคุณสามารถเริ่มเรียงลำดับสิ่งต่าง ๆ ได้

นึกถึงตารางความจริงนี้สั้น ๆ :

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 ที่จะถูกส่งไปยังหนึ่งอินพุตของ alu adder และลงทะเบียนอินพุต 4 ส่งไปยัง adder เอาต์พุตของ adder เพื่อลงทะเบียน 2 เนื่องจากนาฬิกาเป็นส่วนหนึ่งของตรรกะนี้จึงมีช่วงเวลาตั้งแต่จุดเริ่มต้นของช่วงเวลาของนาฬิกาจนถึงจุดเริ่มต้นของช่วงเวลาถัดไปที่สัญญาณแอนะล็อกทั้งหมดตั้งหลักแหล่งและแก้ไขสมการเชิงตรรกะที่มีสายทำ ไม่แตกต่างจากเมื่อคุณพลิกสวิตช์ไฟคุณเปลี่ยนสถานะไฟจากพูดปิดเป็นเปิด ต้องใช้ระยะเวลาหนึ่งก่อนที่แสงนั้นจะอุ่นและโดยทั่วไปจะเข้าสู่สถานะมั่นคง ไม่แตกต่างกันมากที่นี่

มีตรรกะบางอย่างที่บอกว่าสิ่งต่าง ๆ เช่นถ้าช่วงเวลาของนาฬิกานี้เป็นระยะดำเนินการของคำสั่ง AND และจากนั้นช่วงเวลาถัดไปที่ฉันจะบันทึกผลลัพธ์ในการลงทะเบียนเอาท์พุท ในเวลาเดียวกันฉันจะเรียกคำสั่งถัดไปเป็นต้นดังนั้นสำหรับตัวประมวลผลสมัยใหม่ที่การประมวลผลแบบอะลูมิเนียมมักจะเป็นเพียงหนึ่งช่วงเวลานาฬิกาเพราะตรรกะอะนาล็อกสามารถแก้ไขสมการตรรกะที่รวดเร็ว ตัวประมวลผลที่เก่ากว่าที่คุณต้องนับจำนวนบางส่วนปล่อยให้สาย adder รอหมายเลข x ของรอบสัญญาณนาฬิกาสำหรับตรรกะ adder เพื่อแก้ไขจากนั้นสุ่มตัวอย่างผลลัพธ์จากผลลัพธ์ป้อนฟีดสัญญาณต่าง ๆ ของ alu รอ x จำนวนรอบนาฬิกาสำหรับ เพื่อแก้ไขให้ทำซ้ำตลอดไปหรือจนกว่าไฟดับ

ฉันหมายถึงอะไรโดยสมการตรรกะ เพียงแค่นั้นถ้าคุณต้องการคุณสามารถคิดในแง่ของและหรือไม่ประตู สำหรับแต่ละอินพุตบิตไปยังวงจร adu alu มีสมการน่าจะเป็นสมการที่ยาวมากซึ่งรวมถึงนาฬิกาซึ่งรวมถึง flip flops (บิตส่วนตัว / หน่วยความจำเดี่ยว) ที่มีคำสั่งปัจจุบัน (บวกสมการที่ฟีดแต่ละเหล่านั้น บิตหน่วยความจำ) และบนและบน ใช้ฟังก์ชั่นซอฟต์แวร์เดียวที่คุณเขียนในภาษาที่คุณเขียนสมมติว่านี่เป็นฟังก์ชั่นที่รับอินพุตดำเนินงานแล้วเสร็จและส่งคืนผลลัพธ์ คิดถึงการรวมกันของอินพุตที่เป็นไปได้ทั้งหมดและเส้นทางการดำเนินการที่แตกต่างกันคืออะไรผ่านฟังก์ชั่นนั้น คุณอาจเขียนด้วยภาษาระดับสูงบางภาษา แต่คุณอาจจะเขียนภาษานั้นเป็นภาษาดึกดำบรรพ์และแบบดั้งเดิมโดยใช้โครงสร้างซ้อนกันหลายชั้นถ้าเป็นแบบอื่น และลดระดับลงไปเป็นภาษาแอสเซมบลี ไม่แตกต่างจากสมการที่ฉันกำลังพูดถึงโปรแกรมเมอร์ฮาร์ดแวร์ไม่ได้เขียนโปรแกรมในสมการที่ยืดยาวเหล่านี้มากกว่าที่คุณเขียนโปรแกรมในต้นไม้ที่ยืดยาวถ้าเป็นอย่างอื่นในภาษาแอสเซมบลีเมื่อภาษาการเขียนโปรแกรมที่เลือกบันทึกได้มาก เช่นเดียวกับคอมไพเลอร์ที่คุณใช้เปลี่ยนซอร์สโค้ดขนาดเล็กของคุณให้เป็นแอสเซมบลีที่มีการยืดยาวซึ่งมี if-then-elses จำนวนมากมีคอมไพเลอร์ที่ใช้โค้ดภาษาโปรแกรมฮาร์ดแวร์และเปลี่ยนเป็นสมการตรรกะ

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

กลับมาที่นี่อีกครั้งในวันที่ทุกคนมีการจัดการที่ดีขึ้นในการชุมนุมและไม่เพียง แต่คุณจะจบลงด้วยการเขียนโปรแกรมการประกอบบางอย่างที่คุณอาจไม่ได้มีโปรแกรมแก้ไขข้อความหรือประกอบที่คุณอาจต้องเขียนโปรแกรมแรกด้วยมือบนกระดาษ ใช้คู่มืออ้างอิงด้วยมือแปลงให้เป็นรหัสเครื่องวัตถุและศูนย์ ในคอมพิวเตอร์บางเครื่องคุณอาจต้องโหลด ram ด้วยสวิตช์พลิกพลิกบิตที่อยู่พลิกบิตข้อมูลจนกว่าจะตรงกับตัวเลขบนกระดาษของคุณพลิกบิตนาฬิกาขึ้นแล้วลงและคุณได้โหลดตำแหน่งหน่วยความจำเดียวด้วย หนึ่งไบต์ของคำสั่งหนึ่งในโปรแกรมของคุณทำซ้ำอีกสองสามร้อยครั้งและหวังว่าคุณจะไม่ทำผิดพลาด

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

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


สิ่งนี้ไม่ได้ตอบคำถามของผู้เขียนอย่างน้อยก็ไม่ได้เพิ่มสิ่งใดลงในการอภิปรายซึ่งคำตอบที่ยอมรับไม่ครอบคลุม เลขฐานสองของคุณไม่ถูกต้อง 100% 1 + 1 คือ 0 ที่มีมากเกิน 1 ขึ้นอยู่กับขนาดของรีจิสตรีมันอาจเป็น 2 หรือ 0
Ramhound

@dwelch แช่ง! ฉันเป็นแฟนตัวยงของคุณถ้าไม่มีอะไรน้อย +1
AceofSpades

2

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

ดังนั้นเราจึงเริ่มใช้ชุดประกอบที่มี "คำ" เช่น MOV และเพิ่ม แอสเซมเบลอร์จะแทนที่คำแนะนำด้วยชุดที่ถูกต้องเป็น 0 'และ 1 ของการแปลงแอสเซมบลี "รายการ" เป็นรหัสเครื่อง

ในที่สุดเราก็พัฒนาภาษาระดับ "สูง" ซึ่ง "คำแนะนำ" สามารถแสดงลำดับของรหัสเครื่องทั้งหมดได้


FYI ใช้เลขฐานแปดเป็นชวเลขเลขฐานสองก่อนเลขฐานสิบหก
ocodo

Slomojo นั้นถูกต้อง Octal ฐาน 8 ใช้ 3 บิตใช้กับฐานสิบหกฐาน 16 ใช้ 4 บิต Octal มีข้อได้เปรียบในการที่ทุกคนรู้ว่าตัวเลข 0 ถึง 7 หมายถึงอะไร ผู้คนที่ไม่ได้ใช้ Hex มักจะประหลาดใจกับ "ตัวเลข" A ถึง F
Jim C

0

ฉันเพิ่งเจอ Q / A นี้และเมื่อประมาณหนึ่งปีก่อนเมื่อฉันเริ่มเดินทางลงเส้นทางนี้ ฉันพบว่านี่เป็นแหล่งข้อมูลที่ดีมากและมีหน้าอ้างอิงเกี่ยวกับคำถามที่เกี่ยวข้องของฉันเอง


ส่วนที่ 1: - หน้า -

เล็กน้อยเกี่ยวกับตัวฉัน:

ในช่วงกลางถึงปลายยุค 80 เมื่อฉันยังอยู่ในโรงเรียนประถมฉันจะแยกขยะสเตอริโอ, VCR และอุปกรณ์อิเล็คตรอนอื่น ๆ ที่มาจากยุค 50 ถึง 80 และจะดูแผงวงจรและอยากรู้ว่าพวกเขาทำอย่างไร ทำงาน ... พวกเขารับสัญญาณออกอากาศได้อย่างไร, ผลิตเสียง, วิดีโอ, ทำสิ่งนี้และอื่น ๆ ... ฉันสามารถจำแนกแต่ละส่วนได้ที่นี่และมีเช่นตัวต้านทาน, ตัวเก็บประจุ, ไดโอดและทรานซิสเตอร์ แต่ไม่ได้ รู้ว่าพวกเขาทำอะไรหรือทำหน้าที่อย่างไรตั้งแต่อายุยังน้อย

ตลอดหลายปีที่ผ่านมาฉันมีวิชาคณิตศาสตร์ฟิสิกส์และเคมีมาโดยตลอด ฉันเข้าใจคณิตศาสตร์ในระดับสูงและสามารถอ่านวงจรเรียบง่ายหรือพื้นฐานจากโรงเรียนมัธยมและมัธยมปลายซึ่งมาภายหลัง แต่ฉันไม่เคยทำให้การเรียนรู้เกี่ยวกับประตูตรรกะและวิธีการสร้าง ... ฉันทำอย่างไรก็ตาม เรียนรู้พีชคณิตแบบบูลในโรงเรียนมัธยมจากระดับลอจิกความน่าจะเป็นและสถิติของฉัน วิชาคณิตศาสตร์และวิทยาศาสตร์ของฉันทุกวิชาเป็นวิชาที่มีเกียรติ ฉันไม่ได้เรียนแคลคูลัสจนกระทั่งเทอมที่สองที่วิทยาลัยชุมชน ฉันทดสอบจากวิทยาลัยพีชคณิตและใช้ตรีโกณมิติเป็นหลักสูตรทบทวน คณิตศาสตร์ระดับสูงสุดของฉันจากห้องเรียนคือ Calculus II ของตัวแปรเดียว

ฉันเล่นวิดีโอเกมตั้งแต่ฉันอายุประมาณ 3 หรือ 4 ปี ตั้งแต่เป็นเด็กฉันมี Atari, NES, Sega Genesis และ PS1 เมื่อฉันอายุมากขึ้นและเข้าสู่วัยรุ่นตอนปลายและต้นทศวรรษที่ 20 ฉันได้ซื้อ PS2 และ SNES ที่มีชื่อเรื่องที่ต้องการ สิ่งนี้ไม่ได้หมายความว่าจะเป็นการเล่นเกมบนพีซีที่ย้อนไปไกลถึง Doom!

ฉันมักจะเป็นนักเล่นเกมตัวยงและพีซีเสมอและนี่ไม่รวมเกมพินบอลและอาร์เคด

ฉันได้รับพีซีเครื่องแรกเมื่ออายุประมาณ 12 ปีสำหรับคริสต์มาสในต้นปี 90 วันของ DOS 6.0 และ Win 3.11 หรือ OS / 2 ตั้งแต่นั้นมาฉันก็คุ้นเคยกับระบบปฏิบัติการตระกูล "Windows" และระบบทั้งหมดที่ฉันมีคือสถาปัตยกรรมของ Intel ฉันมีประสบการณ์ จำกัด กับ Apple หรือ Mac จากโรงเรียนหรือวิทยาลัย แต่ฉันไม่เคยได้รับสิทธิพิเศษในการทำงานบนระบบ Linux ฉันมี Cygwin และฉันลองใช้มือเพื่อเรียนรู้การทุบตี แต่ฉันคุ้นเคยกับ Dos หรือไวยากรณ์ Command Prompt

ในช่วงต้นยุค 90 ฉันจะได้รับสำเนาหนึ่งหรือสองชิ้นของ PC-World และจะพิมพ์ข้อมูลโค้ดลงใน QBasic ซึ่งฉันไม่รู้จักดีมากและจะพยายามทำให้โปรแกรมเหล่านั้นทำงานได้ สิ่งเดียวที่ประสบความสำเร็จคือโปรแกรมที่จะเปลี่ยนการกดปุ่มบนแถวบ้านของปุ่มเป็นเสียงเรียกเข้าที่แตกต่างกัน ฉันไม่ได้หมายถึงเสียงเรียกเข้าในโทรศัพท์มือถือฉันหมายถึงความถี่ต่อเนื่องตราบใดที่คุณกดปุ่มค้างไว้

มันเป็นความปรารถนาของฉันเสมอที่ไม่เพียง แต่ต้องการทราบว่าอุปกรณ์อิเล็กทรอนิกส์ทำงานอย่างไรในการหมุนเวียนในระดับดิจิตอลและระดับตรรกะเพื่อเรียนรู้วิธีการเขียนโปรแกรมคอมพิวเตอร์ แต่ฉันมีความปรารถนาที่จะทำวิดีโอของตัวเองอยู่เสมอ เกม. แม้แต่ในช่วงต้นยุค 90 ฉันต้องการสร้างเกม Frogger และ Tetris ...


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

ฉันมีพื้นฐานในการเขียนโปรแกรมตั้งแต่สมัยมัธยม แต่นี่เป็นข้อ จำกัด ของ Visual Basic ที่น่ากลัว ฉันเริ่มรับและเรียนรู้ C / C ++ ประมาณปี 2002 - 2003 จนกระทั่งไม่กี่ปีหลังจากที่ฉันสำเร็จการศึกษาจาก High School ในปี 1999 ถึงวันนี้ฉันยังไม่มีประสบการณ์ระดับวิทยาลัยในสาขาวิทยาศาสตร์คอมพิวเตอร์หรือวิศวกรรมคอมพิวเตอร์ แต่ผ่าน การอุทิศตนและความมุ่งมั่นฉันได้เรียนรู้เกี่ยวกับแนวคิดทุกอย่างที่มีเมื่อมันมาถึงคอมพิวเตอร์ฮาร์ดแวร์การเขียนโปรแกรมอัลกอริทึม ฯลฯ และฉันยังคงเรียนรู้มากเท่าที่ฉันสามารถ ...

ในช่วงแรก ๆ ของการเรียนรู้ C / C ++ ฉันมีการเข้าถึงอินเทอร์เน็ต แต่อินเทอร์เน็ตก็อยู่ในช่วงเริ่มต้นเว็บไซต์เช่น Amazon, Youtube, Facebook และอื่น ๆ ยังไม่ได้มีอยู่มันยังคงเป็นวันที่ 56k หมุนหมายเลขโมเด็มซึ่งต่อสายโทรศัพท์ของคุณหากคุณไม่มีสายเฉพาะสายที่สอง ใช้เวลาไม่กี่นาทีในการแสดงภาพบนหน้าจอไม่ต้องกังวลกับการเล่นวิดีโอต่อเนื่อง

ดังนั้นเมื่อมาถึงการวิจัยและเรียนรู้วิธีการเขียนโปรแกรมใน C ++ ทรัพยากรมี จำกัด และส่วนใหญ่อยู่ในรูปแบบข้อความ เมื่อพยายามที่จะแก้ไขปัญหาโครงการจากวันที่กวดวิชาอินเทอร์เน็ตก่อนโครงการจำนวนมากไม่สมบูรณ์นักเขียนเป็นมืออาชีพหรือนักศึกษาและพวกเขาได้ตั้งสมมติฐานมากมายที่ผู้อ่านคุ้นเคยกับแนวคิดที่จำเป็นเช่นการรวบรวม เชื่อมโยงและแก้จุดบกพร่องและบูรณาการห้องสมุด

สำหรับคนที่ไม่รู้อะไรเลยเกี่ยวกับหัวข้อเหล่านั้นพวกเขาตกอยู่ในความสูญเสียเพราะไม่รู้ว่าอะไรผิดพลาดหรือจะแก้ไขอย่างไรและจะทำให้มันทำงานได้อย่างถูกต้อง ฉันใช้เวลาหลายชั่วโมงในการลองผิดลองถูกที่มีทรัพยากร จำกัด มาก ขอความช่วยเหลือเช่นตอนนี้เราสามารถใช้เว็บไซต์นี้หรือมองหาคำอธิบายโดยละเอียดที่คุณสามารถหาได้ในcppreference ! หากคุณไม่รู้จักใครเป็นการส่วนตัวไม่มีคนมากมายที่คุณสามารถขอความช่วยเหลือได้!

เมื่อเวลาผ่านไปฉันได้พัฒนาความรู้ของฉันที่นี่และที่นั่นและในที่สุดอินเทอร์เน็ตก็พัฒนาเป็น DSL และตอนนี้อินเทอร์เน็ตความเร็วสูงเว็บไซต์กลายเป็นแบบโต้ตอบมากขึ้นวิดีโอเริ่มปรากฏขึ้นคุณภาพของวิดีโอดีขึ้นตามกาลเวลาเช่นไซต์ต่างๆ เมื่อ Youtube เริ่มปรากฏตัวและสิ่งต่าง ๆ ก็ง่ายขึ้นเล็กน้อยในด้านการวิจัย บทเรียนเพิ่มเติมพร้อมใช้งานมากขึ้นบางคนเก่งและมีประโยชน์ซึ่งคนอื่น ๆ สอนวิธีปฏิบัติที่ไม่ดี ...

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

ในช่วงหลายปีที่ผ่านมาฉันได้เห็นภาษา C ++ เติบโตขึ้นพัฒนาและปรับตัวตามกาลเวลา ในตอนแรกมันยังคงอยู่เกือบเหมือนเดิมเป็นเวลาหลายปี แต่ในช่วง 10 ปีที่ผ่านมามีการเปลี่ยนแปลงอย่างรวดเร็วภายในช่วงเวลาสั้น ๆ นี้นับตั้งแต่ก่อตั้งขึ้น

ฉันพูดถึงทั้งหมดนี้เพราะ C ++ เป็นหนึ่งในภาษาที่ยากที่สุดในการฝึกฝนอย่างเต็มที่เนื่องจากความสามารถรอบตัวพลังชุดฟีเจอร์ที่หลากหลายและความสามารถในการให้คุณถ่ายภาพด้วยตัวเอง! และถึงแม้จะมีข้อแม้ทั้งหมดมันเป็นหนึ่งในภาษาที่ทรงพลังและเป็นที่ต้องการมากที่สุดที่ใช้ในอุตสาหกรรมชั้นนำชั้นนำในฐานะมาตรฐานสำหรับการพัฒนาประเภทนี้เพราะเมื่อทำอย่างถูกต้องจะรวดเร็วรัดกุมเชื่อถือได้และใช้ พิมพ์เท้าที่เล็กที่สุด

ตั้งแต่นั้นมาฉันได้เรียนรู้ด้วยตนเองใน C / C ++ เป็นเวลาหลายปีด้วยความตั้งใจและมุ่งเน้นการเรียนรู้การเขียนโปรแกรมกราฟิก 3 มิติและการออกแบบเกม ฉันใช้เวลาในการค้นหาค้นคว้าและค้นคว้ามากขึ้นใน 100 ถึง 1,000 ชั่วโมงในการอ่านการเรียนรู้และการนำความรู้นั้นไปใช้ในการออกแบบผลิตภัณฑ์และแอปพลิเคชั่นที่มีประโยชน์ ฉันมีความตั้งใจและต้องการที่จะเรียนรู้เพิ่มเติมเพื่อพัฒนาทักษะและฝีมือของฉัน


นี่เป็นขั้นตอนแรกจากนั้นฉันก็เริ่มอ่านและทำงานกับ DirectX 9.c ในขั้นต้นซึ่งฉันได้ทำใน C / C ++ และแม้แต่ C # จากนั้นฉันก็ย้ายไปยัง DirectX 10 และ Legacy OpenGL 1.0 จาก DirectX 11 และ OpenGL 3.x - 4.x ที่มาของพวกเขาและตอนนี้ฉันได้ลองแม้แต่มือที่ Vulkan

ฉันได้สร้างเอ็นจิ้นเกมที่ประสบความสำเร็จซึ่งทำงานผ่านบทเรียนออนไลน์ต่างๆทั้งในรูปแบบข้อความและวิดีโอ ฉันได้กล่าวไปแล้วว่าฉันมีพื้นฐานด้านคณิตศาสตร์ที่แข็งแกร่ง แต่มีข้อ จำกัด สำหรับแคลคูลัส I & II ฉันต้องสอนตัวเอง Vector แคลคูลัสที่ฉันมีความรู้บางส่วนจากชั้นฟิสิกส์แคลคูลัสของฉันในวิทยาลัย แต่สำหรับพีชคณิตเชิงเส้นที่มี Affine การแปลงและเรขาคณิตวิเคราะห์ฉันต้องเรียนรู้ด้วยตัวเองเมื่อสมการฟังก์ชันวิธีการอัลกอริทึมและ แนวคิดจำเป็น จากนั้นฉันต้องเรียนรู้วิธีการแปลรหัสเหล่านั้นให้มีประสิทธิภาพอ่านได้น่าเชื่อถือและสามารถใช้ซ้ำได้ซึ่งเป็นรหัสทั่วไปและปราศจากข้อบกพร่องให้มากที่สุดโดยใช้การดีบักเป็นร้อยเป็นพันชั่วโมง

มันเป็นการเดินทางที่มหัศจรรย์ที่ได้เรียนรู้หัวข้อและอัลกอริทึมที่รวมถึงการจัดการหน่วยความจำการนับการอ้างอิงการอินสแตนซ์การเรียกซ้ำและอื่น ๆ อีกมากมายที่ใช้ภายในหลาย ๆ องค์ประกอบของเกมเอ็นจิ้น ฉันสามารถเขียนรายการทั้งหมดที่นี่ แต่นั่นจะเป็นข้อมูลเพียงพอที่จะเติมพื้นที่ตอบคำถาม 3 หรือ 4 ข้อในการเขียน อย่างไรก็ตามฉันจะรวมรายการหัวข้อทั่วไปไม่ใช่หัวข้อย่อย

นี่คือหัวข้อหรือรายชื่อหัวข้อในสิ่งที่ประกอบด้วยเอ็นจิ้นเกมที่ทำงานได้อย่างสมบูรณ์ซึ่งรวมถึงเทคนิคการจัดเรียงที่หลากหลายทั้งหมดการตั้งค่าการเรนเดอร์และ shader ไปป์ไลน์เทคนิคการแรเงาและแสงผ่าน shaders การโหลดรูปภาพการโหลดเสียงและการจำลองและการแยกวิเคราะห์การสร้างรูปร่างดั้งเดิมด้วยคุณสมบัติวัสดุสีพื้นผิวและพิกัดปกติที่มีการแมปพื้นผิวด้วยตนเองการแปลงวัตถุประเภทกล้องลำดับชั้นกราฟฉากฉากคลาสผู้จัดการสำหรับพื้นผิวเสียงแบบอักษรและเฉดสีและ การจัดการหน่วยความจำระบบการบันทึกด้วยการจัดการข้อยกเว้นเทคนิคการเขียนโปรแกรมแบบหลายเธรดและแบบขนานระบบเครือข่ายเครื่องยนต์ฟิสิกส์การตรวจจับการชนเครื่องกำเนิดอนุภาคภาพเคลื่อนไหวเกม AI การสร้างภูมิประเทศภูมิประเทศกล่องท้องฟ้าและโดมใบไม้และอีกมากมาย ... GUI พร้อมแบบอักษรพื้นผิวสำหรับการแสดงผลข้อความการซ้อนทับ HUD สินค้าคงคลังแผนที่และการสร้างมาโครระบบรัฐและเครื่องรัฐและในที่สุดก็เขียนโปรแกรมแยกวิเคราะห์เพื่อสร้างภาษาสคริปต์ของคุณเองเพื่อให้วัตถุเหล่านี้มี ความสามารถในการเปลี่ยนค่าข้อมูลภายในเอ็นจิ้นโดยไม่ต้องคอมไพล์ซ้ำเพียงแค่โหลดไฟล์ข้อมูลเพื่อเติมข้อมูลวัตถุและโครงสร้างภายในคอนเทนเนอร์ตามลำดับเมื่อเริ่มต้นแอปพลิเคชันและในที่สุดก็เขียน parser เพื่อสร้างภาษาสคริปต์ของคุณเองโดยอัตโนมัติเพื่อให้วัตถุเหล่านี้มีความสามารถในการเปลี่ยนค่าข้อมูลภายในเครื่องยนต์โดยไม่ต้องคอมไพล์ใหม่เพียงแค่โหลดไฟล์ข้อมูลเพื่อเติมวัตถุข้อมูลและโครงสร้างภายในคอนเทนเนอร์ที่เกี่ยวข้อง เมื่อเริ่มต้นแอปพลิเคชันและในที่สุดก็เขียน parser เพื่อสร้างภาษาสคริปต์ของคุณเองโดยอัตโนมัติเพื่อให้วัตถุเหล่านี้มีความสามารถในการเปลี่ยนค่าข้อมูลภายในเครื่องยนต์โดยไม่ต้องคอมไพล์ใหม่เพียงแค่โหลดไฟล์ข้อมูลเพื่อเติมวัตถุข้อมูลและโครงสร้างภายในคอนเทนเนอร์ที่เกี่ยวข้อง เมื่อเริ่มต้นแอปพลิเคชัน


ตลอดหลายปีที่ผ่านมาฉันรู้สึกทึ่งที่ต้องการเรียนรู้ภาษาแอสเซมบลีจากพวกเขาต้องการเรียนรู้เกี่ยวกับคอมไพเลอร์แอสเซมเบลอร์และระบบปฏิบัติการที่เรียบง่ายฉันหมายถึงการทำงานภายในของพวกเขา

เวลาผ่านไปจากนั้นฉันก็ก้าวไปข้างหนึ่งเล็กน้อยและเริ่มเข้าสู่การเรียนรู้การจำลองฮาร์ดแวร์ ฉันเน้นเฉพาะ NES แต่ต้องการเรียนรู้การจำลองฮาร์ดแวร์ของ CPU โดยทั่วไป สิ่งนี้นำฉันไปสู่การเรียนรู้เกี่ยวกับชุดคำสั่งที่ฉันได้รู้จักแนวคิดและสิ่งที่เป็นเพราะฉันคุ้นเคยกับตระกูล x86 ของ Intel ในระดับหนึ่ง แต่ตอนนี้ฉันต้องเรียนรู้ชุดคำสั่ง 6502

แต่การดำน้ำในครั้งนี้ทำให้ฉันทำวิจัยมากขึ้นและเริ่มเรียนรู้เกี่ยวกับสถาปัตยกรรมชุดคำสั่งจากมุมมองทางวิศวกรรม นี่ทำให้ฉันได้เรียนรู้เกี่ยวกับวิธีการสร้างซีพียูจากลอจิกเกตและวิธีการสร้างลอจิกเกทจากทรานซิสเตอร์พร้อมกับส่วนประกอบทางไฟฟ้าอื่น ๆ ดังนั้นฉันจึงสิ้นสุดการเรียนรู้เกี่ยวกับสิ่งนี้จากสองมุมมองจากบนลงล่างและล่างขึ้นบน ทั้งสองวิธีมีประสิทธิภาพมากและฉันคิดว่าการเรียนรู้จากทั้งสองช่วยในการสร้างสะพานหรือช่องว่างที่ซอฟต์แวร์เนื้อฮาร์ดแวร์

จากนี้ฉันต้องรีเฟรชพีชคณิตแบบบูลและลงเอยด้วยการเรียนรู้เกี่ยวกับ K-Maps ตารางการใช้เครื่องรัฐทั้ง Mealy และ Moore และสิ่งอื่น ๆ ที่เกี่ยวข้องกับ Binary Logic และเลขคณิตกับประตูตรรกะทางกายภาพและวงจรรวม และสิ่งนี้นำฉันไปสู่อดีตที่ไม่พอใจที่ฉันเริ่มทำงานกับ Logisim และเริ่มเรียนรู้ HDL, VHDL, Verilog ฯลฯ ...

ฉันได้เรียนรู้ทั้งหมดนี้ในเวลาว่างเมื่อฉันสามารถทำได้ตลอด 15 - 18 ปีที่ผ่านมา


นี่คือบางส่วนของเว็บไซต์และลิงค์ที่แนะนำฉันตลอดหลายปีที่ผ่านมา หลายสิ่งเหล่านี้เป็นเว็บไซต์ล่าสุดที่ฉันได้เรียนรู้จากทั้งที่ไม่มีอยู่ฉันสูญเสียลิงก์และจำไม่ได้หรือเครื่องมือค้นหาผลักพวกเขาไปด้านหลังรายการค้นหา ...

  • ภาษา - C ++

  • บทเรียนกราฟิก 3 มิติและเว็บไซต์ทรัพยากร

  • ซีรี่ส์และช่องของ Youtube ครอบคลุมหัวข้อต่างๆข้างต้นรวมถึงฮาร์ดแวร์คอมพิวเตอร์และวิศวกรรมไฟฟ้า มีจำนวนมากเกินไปที่จะลงรายการดังนั้นฉันจะแสดงรายการของพวกเขาที่นี่ที่ฉันพบว่ามีประโยชน์มากที่สุดและมั่งคั่ง ฉันจะไม่ให้ลิงก์ แต่คุณสามารถค้นหา youtube สำหรับช่องเหล่านี้

    • 3Blue1Brown - คณิตศาสตร์ขั้นสูง
    • Bisqwit - การเขียนโปรแกรม C / C ++ ขั้นสูง (โครงการแอปพลิเคชัน) - ตัวจำลองฮาร์ดแวร์ของ NES
    • Jason Turner - เทคนิคการเขียนโปรแกรม C ++ ขั้นสูงสมัยใหม่
    • javidx9 - การเขียนโปรแกรม C / C ++ ขั้นสูง (โครงการแอปพลิเคชัน) - ตัวจำลองฮาร์ดแวร์ NES / แอสเซมบลีบางตัว
    • MIT OpenCourse - หลักสูตรวิทยาลัยด้านคณิตศาสตร์และวิทยาศาสตร์คอมพิวเตอร์
    • Bilkent Online Courses - หลักสูตรวิทยาลัยด้านวิทยาการคอมพิวเตอร์และวิศวกรรมคอมพิวเตอร์ (การออกแบบ CPU MIPS)
    • The Cherno - หัวข้อการเขียนโปรแกรม C / C ++ ขั้นสูงและการพัฒนา - การพัฒนาโปรแกรมเกม
    • Ben Eater - วิศวกรรมฮาร์ดแวร์ - การใช้งานจริงผ่าน Breadboards
    • Neso Academy - วิศวกรรมฮาร์ดแวร์ - ทฤษฎีและแนวคิด
    • โปรแกรมSocratica - Python
    • เพียงแค่ใส่ - วิศวกรรมฮาร์ดแวร์ - ทฤษฎีและแนวคิด
    • Bitwise - C / C ++ ขั้นสูงการออกแบบแอสเซมเบลอร์ผ่านการจำลองฮาร์ดแวร์
    • หัวข้อ Bo Qian - C ++ ในโครงสร้างข้อมูลและอัลกอริธึม
    • LineByLine - การเขียนโปรแกรม Vulkan
    • Joshua Shucker - การเขียนโปรแกรม Vulkan
    • www.MarekKnows.com - C ++, 3D Math และ Game Engine Development

และสิ่งเหล่านี้ไม่ได้คำนึงถึงหนังสือหลายเล่มที่ฉันมีในหัวข้อเหล่านี้

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


ฉันเพิ่งปรับปรุงคำตอบหรือโพสต์นี้ ฉันกำลังจะเพิ่มส่วนที่ 2 ที่จริงจะตอบคำถาม แต่ฉันไม่มีคะแนนชื่อเสียงเพียงพอที่จะทำ จะต้องใช้เวลาพอสมควรในการสร้างคะแนนชื่อเสียงที่ต้องการก่อนที่ฉันจะสามารถเพิ่มคำตอบที่สองได้ โพสต์นี้ไม่ใช่คำตอบที่แท้จริง แต่ฉันจะใช้มันเป็นข้อมูลอ้างอิงและค้นหาตารางเพื่อหาเหตุผลของคำตอบที่แท้จริงของฉัน จำเป็นต้องมีทรัพยากรที่ระบุไว้ด้านบนเพื่อช่วยลดช่องว่างระหว่างซอฟต์แวร์และฮาร์ดแวร์
ฟรานซิส Cugler

-2

ที่แกนกลางซีพียูมักเป็นเพียงเครื่องจักรของรัฐ ดังนั้นคุณจะต้องเข้าใจว่าตรรกะประตูและ flip-flop หรือลงทะเบียนรวมกันเพื่อสร้างเครื่องจักรของรัฐได้อย่างไร

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

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

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

หนังสือเรียนของมหาวิทยาลัยมีอย่างน้อย 3 ระดับในหัวข้อที่ไม่สำคัญนี้


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