# สถาปัตยกรรมไมโคร
สถาปัตยกรรมไมโคร  เป็นลักษณะของ เครื่องคอมพิวเตอร์ส่วนใหญ่ที่มีการใช้งานมาตั้งแต่ยุคเริ่มต้น จนถึงยุคปัจจุบัน ได้รับการออกแบบโครงสร้างและการทำงานโดยจอนวอนนิวแมน(John Von Neumann) ซึ่งเป็นผู้นำในการออกแบบเครื่องคอมพิวเตอร์ โดยเครื่องคอมพิวเตอร์ ที่เขาได้ออกแบบ มีส่วนประกอบที่สำคัญ 3 อย่างด้วยกันคือ หน่วยประมวลผลกลาง (Central Processing Unit), หน่วยความจำ (Main Memory) และ หน่วยเชื่อมต่ออุปกรณ์ภายนอก (Input/Output) สำหรับไมโครโปรเซสเซอร์ ในตระกูล x86 ออกแบบโดยใช้หลักการเดียวกันกับที่ วอนนิวแมนได้กำหนดไว้ กล่าวคือ การประมวลผลทั้งหมด ที่หน่วยประมวลผลกลาง สำหรับข้อมูล ไม่ว่าจะเป็นข้อมูลที่ใช้สำหรับประมวลผล หรือข้อมูลที่เป็นคำสั่งก็ตาม จะถูกเก็บไว้ในหน่วยความจำจนกว่าจะมีการเรียกใช้งานจากหน่วยประมวลผลกลาง สำหรับส่วนต่อเชื่อมกับอุปกรณ์ภายนอกนั้น การทำงานของหน่วยประมวลผลกลางก็จะคล้ายกับการทำงานกับหน่วยความจำ ทั้งนี้เพราะทั้งหน่วยความจำและอุปกรณ์ภายนอก
เมื่อมีการทำงานกับหน่วยประมวลผลกลางก็มีลักษณะของการเรียกใช้ข้อมูลและนำข้อมูลไปเก็บ ต่างกันเพียงสถานที่  และ วิธีการเข้าถึงเท่านั้น บัสของระบบ หน่วยงานต่าง ๆ ภายในเครื่องคอมพิวเตอร์นั้น ต่อเชื่อเข้าด้วยกันดัวยระบบบัส สำหรับโปรเซสเซอร์ในตระกูล 80x86 มีด้วยกัน 3 กลุ่มอันได้แก่ ดาตาบัส แอดเดรสบัส และคอมโทรลบัส ดังรายละเอียดต่อไปนี้

ดาต้าบัส
เป็นสายนำสัญญาณข้อมูลของระบบ โดยมีทั้งขนาด 8 บิต, 16 บิต, 32 บิต และ 64 บิต ทั้งนี้ขึ้นอยู่กับรุ่นของไมโครโปรเซสเซอร์เอง ในกรณีนี้จำนวนสายสัญญาณของระบบบัส ไม่ได้เป็นข้อกำหนดขนาดความสามารถของตัวโปรเซสเซอร์ เช่น ในกรณีของ 80x88 มีขนาดของบัสเป็น 8 บิต ก็ไม่ได้หมายความว่า สามารถประมวลผลขนาด 8 บิต เป็นแต่เพียงว่าใน 1 จังหวะสัญญาณนาฬิกาจะ รับ-ส่ง ข้อมูลขนาด 8 บิต ดังนั้นเพื่อให้การรับส่งข้อมูลครบทั้ง 16 บิตก็ต้องใช้สัญญาณนาฬิกาจำนวน 2 ครั้งนั่นเอง ขนาดของดาต้าบัสแสดงในตาราง

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

+ ข้อมูลโปรเซสเซอร์ โปรเซสเซอร์  จำนวนของบัส  หน่วยความจำสูงสุด (ไบต์)  หน่วย 8088  20  1,048,576  1 MB 80188  20  1,048,576  1 MB 8086  20  1,048,576  1 MB 80186  20  1,048,576  1 MB 80286  24  16,777,216  16 MB 80386SX  24  16,777,216  16 MB 80386DX  32  4,294,976,296  4 GB 80486  32  4,294,976,296  4 GB 80586  32  4,294,976,296  4 GB

 บัสควบคุมการทำงาน 
เป็นระบบสายสัญญาณที่ควบคุมการทำงานทั้งหมดของระบบ โดยมีจำนวนสายที่ไม่เท่ากันในแต่ละ
โปรเซสเซอร์ ซึ่งขึ้นอยู่กับการออกแบบของโปรเซสเซอร์เหล่านั้น และหน้าที่ของสายสัญญาณแต่ละเส่นก็จะแตกต่างกันออกไป 
เช่น ในการอ่าน และ บันทึกข้อมูลไปยังหน่วยงานต่าง ๆ ก็จะมีข้อมูล รับ-ส่ง กันไปมา แล้วจะทราบได้อย่างไรว่าขณะนี้กำลังอ่านข้อมูลจากหน่วยความจำ หรือว่ากำลังนำเอาข้อมูลไปเขียนเก็บไว้ในหน่วยความจำ ดังนั้นจึงต้องมีสายสัญญาณที่กำหนดว่า กำลัง อ่าน (read) หรือ เขียน (write) ข้อมูล เป็นต้น
สำหรับเครื่องไมโครคอมพิวเตอร์โดยทั่ว ๆ ไปที่ใช้งานในปัจจุบัน ไม่ว่าจะเป็นเครื่อง IBM PC และ Compatible จะใช้ไมโครโปรเซสเซอร์ตระกูล 80x86 ของบริษัท Intel ซึ่ง เริ่มจาก 8086 , 80286 , 80386 , 80486 และเป็น Pentium ในปัจจุบัน ดังนั้นจึงเป็นการเหมาะสมอย่างมากที่จะใช้เพื่อการศึกษาการเขียนโปรแกรมภาษา Assembly โดยอ้างอิงกับไมโครโปรเซสเซอร์ของ Intel เนื่องจากมีใช้อย่างแพร่หลาย ถึงแม้ว่าจะมีไมโครโปรเซสเซอร์ของผู้ผลิตรายอื่น ๆ บ้าง เช่น ของบริษัท AMD แต่เราก็ยังสามารถใช้คำสั่งชุดเดียวกับที่ใช้กับ ไมโครโปรเซสเซอร์ของบริษัท INTEL ได้  สำหรับการศึกษาในรหัสวิชานี้จะศึกษาเฉพาะการทำงานในแบบ real mode เท่านั้น คือพิจารณาในส่วนของโปรเซสเซอร์ 8086 หรือ 8088 โดยจะศึกษาโครงสร้างรายละเอียดของ เรจิสเตอร์  ซึ่งอยู่ภายในไมโครโปรเซสเซอร์ ซึ่งมีหน้าที่ในการจัดเก็บข้อมูล โดยการจัดแบ่งกลุ่มของ เรจิสเตอร์ นั้นไปตามหน้าที่ของการทำงานของ เรจิสเตอร์ แต่ละตัวดังรายละเอียดต่อไปนี้
3.2.	Data เรจิสเตอร์	
เป็น เรจิสเตอร์ ที่ใช้เก็บข้อมูลทั่วไป ถึงแม้ว่าในการทำงานของระบบคอมพิวเตอร์ จะสามารถใช้หน่วยความจำเป็นที่เก็บข้อมูลได้ แต่ว่าการประมวลผลนั้นจะเกิดขึ้นภายในตัวไมโครโปรเวสเซอร์ ดังนั้นจึงต้องใช้ เรจิสเตอร์ ที่อยู่ภายในตัวไมโครโปรเซสเซอร์เป็นที่เก็บข้อมูลและทำให้การประมวลผลมีความเร็วสูงขึ้น สำหรับ เรจิสเตอร์ ที่ใช้ประมวลผลทั่วไป เป็นขนาด 16 บิต มีจำนวน 4 ตัว คือ AX , BX , CX และ DX  ทั้งนี้  เรจิสเตอร์ ทั้ง  4  ตัวนี้ สามารถที่จะใช้งานครั้งละ 8 บิตได้โดยแบ่งใช้งานทีละครึ่ง โดยมีชื่อเรียกใช้งานเป็น AH และ AL และสำหรับ เรจิสเตอร์ ที่เหลืออีก 3 ตัว จะมีวิธีการเรียกชื่อในทำนองเดียวกัน โดย เรจิสเตอร์ AH เป็นการใช้ เรจิสเตอร์ บิตที่ 8-15 และ AL เป็นการใช้ เรจิสเตอร์ บิตที่ 0-7  ดังแสดงในรูปที่ 3.1 สำหรับ เรจิสเตอร์ ทั้ง 4 ตัวนี้ เป็นแบบใช้งานทั่วไป แต่บางกรณีอาจนำไปใช้เป็นกรณีเฉพาะด้วยเช่น

15                                    8     7                                           0
AX
AH	AL
BX
BH	BL
CX
CH	CL
DX
DH	DL
รูปที่ 3.1 แสดงรายละเอียดของเรจิสเตอร์แต่ละตัว
3.2.1.	เรจิสเตอร์ AX (Accumulator เรจิสเตอร์)  ใช้เป็น เรจิสเตอร์ ที่ใช้ในการประมวลผลคำสั่งทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร และ การกระทำทางลอจิค นอกจากนี้ยังใช้ในการโอนย้ายข้อมูลด้วยเนื่องจากใช้คำสั่งที่สั้น และยังใช้งานกับกลุ่มคำสั่ง อินพุทและเอาต์พุต
3.2.2.	เรจิสเตอร์ BX  (Base เรจิสเตอร์) ใช้เพื่อเป็น เรจิสเตอร์ เก็บข้อมูลชนิดที่อยู่ (Address เรจิสเตอร์) เช่นกลุ่มคำสั่งในการค้นหาข้อมูลในตาราง
3.2.3.	เรจิสเตอร์ CX (Counter เรจิสเตอร์) .ใช้เพื่อเป็นตัวนับจำนวนรอบของการทำงานของโปรแกรมที่มีลักษณะเป็นวงรอบ 
3.2.4.	เรจิสเตอร์ DX (Data เรจิสเตอร์) ใช้กับกลุ่มคำสั่งคูณและหาร และกับคำสั่งอินพุทและเอาต์พุต
สำหรับหน้าที่ต่าง ๆ ที่กล่าวมาแล้วสำหรับเรจิสเตอร์แต่ละตัวนั้น ยังทำหน้าที่หลัก ๆ ที่เหมือนกันอย่างหนึ่งคืก ใช้เพื่อการเก็บข้อมูลชั่วคราวด้วย
3.2.5.	เซ็กเมนต์ เรจิสเตอร์
ในการดำเนินการที่ติดต่อกับหน่วยความจำนั้น สำหรับไมโครโปรเซสเซอร์ในตระกูล 8088 นั้นมีจำนวน address bus ขนาด 20 บิต นั่นหมายความว่า สามารถเข้าถึงหน่วยความจำได้ขนาด 1 MB แต่เนื่องจาก เรจิสเตอร์ ภายในทั่งหมดนั้นมีขนาดเพียง 16 บิต ทำให้ไม่สามารถ address ข้อมูลในหน่วยความจำได้โดยตรง จึงต้องมีการจัดเนื้อที่ของหน่วยความจำออกเป็นส่วน ๆ เรียกว่า เซ็กเมนต์   โดยจะใช้ เรจิสเตอร์ จำนวน 2 ตัวในการอ้างถึงหน่วยความจำในแต่ละตำแหน่ง โดย เรจิสเตอร์ ตัวหนึ่งทำหน้าที่เป็นตัวกำหนด เซ็กเมนต์ และ เรจิสเตอร์ อีกตัวหนึ่งทำหน้าที่กำหนดค่าของ offset  ทำให้การอ้างถึงข้อมูลจึงมีลักษณะเป็น logical address เช่น  1000:2000 ค่าตัวเลข 1000 หมายถึงส่วนของ เซ็กเมนต์ และค่าตัวเลข 2000 หมายถึงส่วนของ offset  แต่หากพิจารณาดู จะพบว่า จำนวนบิตของข้อมูลเกิน 20 บิต ดังนั้นในการอ้าง address ที่ถูกต้องจึงได้จากการคำนวณค่าระหว่าง เซ็กเมนต์ และ offset ดังนี้ 

                                               10000
                                                             +
                                                    2000
                                                  12000            มีขนาด 20 บิต ตรงกับ Physical address
	ไมโครโปรเซสเซอร์ 8088 มี เซ็กเมนต์ เรจิสเตอร์ จำนวน 4 ตัว คือ Code เซ็กเมนต์ (CS) , Data เซ็กเมนต์ (DS) , Stack เซ็กเมนต์ (SS) และ Extra เซ็กเมนต์ (ES)  ซึ่ง เรจิสเตอร์ ทั้ง 4 ตัวจะมีหน้าที่การทำงานที่แตกต่างกันออกไป และรับผิดชอบในการดูแลข้อมูลแต่ละกลุ่ม  เรจิสเตอร์ทั้ง 4 ตัวนี้มีขนาดเป็น 16 บิต และขนาดของหน่วยความจำที่ไมโครโปรเซสเซอร์สามารถใช้งานได้ใน real mode มีขนาด 1 MB ทำให้มีจำนวน เซ็กเมนต์ ทั้งสิ้น 64 K เซ็กเมนต์ และในแต่ละ เซ็กเมนต์ จะสามารถ address ข้อมูลได้ 64 KB ในการ address หน่วยความจำของแต่ละ เซ็กเมนต์ อาจ กำหนด ให้ เซ็กเมนต์ เรจิสเตอร์ ทั้งหมด ชี้หน่วยความจำทีเดียวกันทั้งหมด หรือ แยกเป็นแต่ละส่วนก็สามรถทำได้ทั้ง 2 กรณี ขึ้นอยู่กับวัตถุประสงค์ของการใช้งานและ ลักษณะในการเขียนโปรแกรม แต่การใช้ เซ็กเมนต์ เรจิสเตอร์ แต่ละตัวก็ต้องพิจารณาให้เหมาะสมกับหน้าที่ และ เรจิสเตอร์ ที่มาใช้งานร่วมกัน (ส่วนของ offset) เซ็กเมนต์ เรจิสเตอร์ ทั้ง 4 ตัวนี้มีขนาด 16 บิตและไม่สามารถแบ่งใช้งานได้เหมือนกับ เรจิสเตอร์ในกลุ่มของ data เรจิสเตอร์  โดยแต่ละตัวทำหน้าที่แตกต่างกันออกไปดังนี้คือ 
3.2.5.1.	เรจิสเตอร์  CS เป็น เซ็กเมนต์ เรจิสเตอร์ ที่ใช้เป็นตัวกำหนดที่อยู่ของหน่วยความจำในส่วนของคำสั่ง (Instruction) โดยจะมีการทำงานร่วมกับเรจิสเตอร์ IP
3.2.5.2.	เรจิสเตอร์ SS เป็น เซ็กเมนต์ เรจิสเตอร์ ที่กำหนดที่อยู่ของ stack  ซึ่งเป็นบริเวรหน่วยความจำที่กำหนดไว้เพื่อใช้เก็บข้อมูล โดยมีลักษณะการทำงานแบบ stack ใช้งานร่วมกับเรจิสเตอร์ SP 
3.2.5.3.	เรจิสเตอร์ DS และ ES ใช้กำหนดที่อยู่ของ ข้อมูลเมื่อทำการประมวลผลกับชุดคำสั่งกลุ่มข้อมูล โดยจะใช้งานร่วมกับ เรจิสเตอร์   BP  และ DX
3.2.6.	Pointer และ Index เรจิสเตอร์ 
เป็น เรจิสเตอร์ ที่ใช้ในการชี้ตำแหน่งข้อมูลในหน่วยความจำ โดยจะเป็นส่วนของ offset ประกอบด้วย เรจิสเตอร์ จำนวน 4 ตัวคือ
3.2.6.1.	Stack pointer   (SP) เป็น เรจิสเตอร์ ที่เก็บข้อมูลตำแหน่งหน่วยความจำในส่วนของ offset เพื่อใช้ชี้ตำแหน่งของ stack 	โดยใช้งานร่วมกับ Stack เซ็กเมนต์ (SS) 
3.2.6.2.	Base Pointer (BP) ใช้สำหรับ อ้างตำแหน่งข้อมูลในหน่วยความจำของ stack แตกต่างกับ SP ตรงที่สามารถเข้าถึงข้อมูลใน เซ็กเมนต์ อื่น ๆ ได้
3.2.6.3.	Source Index (SI)  ใช้ในการอ้างตำแหน่งข้อมูล ในหน่วยความจำ โดยใช้งานร่วมกับ DS ส่วนใหญ่จะนำไปใช้งานกับกลุ่มคำสั่งประเภทกลุ่มข้อมูล 
3.2.6.4.	Destination Index (DI) มีการใช้งานเช่นเดียวกับ SI แต่ใช้งานร่วมกับ เรจิสเตอร์ ES 
3.2.7.	Instruction Pointer (IP) 
IP  เป็น เรจิสเตอร์ ที่ใช้ในการชี้ตำแหน่งของข้อมูลในส่วนของคำสั่ง โดยใช้งานร่วมกับ CS ในการทำงานของไมโครโปรเซสเซอร์ ค่าของ IP จะเพิ่มขึ้นโดยอัตโนมัติ และไม่สามารถเปลี่ยนแปลงค่าโดยการโปรแกรมได้ โดยมันจะชี้ตำแหน่งของคำสั่งถัดไปในหน่วยความจำเสมอ
3.2.8.	Flags เรจิสเตอร์ 
เป็น เรจิสเตอร์ ที่ใช้แสดงผลลัพธ์ของการประมวลของไมโครโปรเซสเซอร์ โดยค่าข้อมูลของ เรจิสเตอร์ ในแต่ละบิตนั้นถูกกำหนดความหมายไว้แตกต่างกันออกไป ซึ่งเรียกว่า flag โดยแบ่ง flag ออกเป็น 2 ประเภทด้วยกันคือ status flag และ control flag 	โดยที่ status flag ใช้เพื่อแสดงผลของการประมวลผลข้อมูล เช่น บวกข้อมูลแล้วมีตัวทดเกิดขึ้นหรือไม่ (carry flag) หรือ การลบข้อมูลมีผลลัพธ์เป็น 0 (zero flag) แต่ในส่วนของ control flag จะเป็นการควบคุมการทำงานของไมโครโปรเซสเซอร์ เช่น จะยอมให้มีการตอบรับการร้องขอ interrupt หรือไม่ เป็นต้น ซึ่งในรายละเอียดการใช้งาน flag ทั้ง 2 ประเภทนี้จะได้กล่าวถึงต่อไปในภายหลัง