วันศุกร์ที่ 13 มีนาคม พ.ศ. 2552

บทที่ 9 - โครงสร้างและหน้าที่ของซีพียู

โครงสร้างและหน้าที่ของซีพียู

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

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

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

รีจีสเตอร์ส่วนที่ผู้ใช้มองเห็น
รีจีสเตอร์ส่วนที่ผู้ใช้สามารถมองเห็นได้นั้น หมายถึง รีจีสเตอร์ที่สามารถใช้คำสั่งภาษาเครื่องควบคุมและใช้งานได้ผ่านการประมวลผล
โดยซีพียู รีจีสเตอร์กลุ่มนี้แบ่งออกเป็นประเภทดังนี้
- รีจีสเตอร์ใช้งานทั่วไป สามารถนำไปใช้งานได้หลายหน้าที่ตามที่ผู้พัฒนาโปรแกรมต้องการ แต่อาจมีรีจีสเตอร์บางตัวถูกกำหนด
ไว้ใช้งานกับเลขจำนวนจริงหรือเป็นตัวชี้ตำแหน่งในสแต๊ก ในบางกรณีรีจีสเตอร์ใช้งานทั่วไปสามารถนำไปใช้งานในการกำหนดที่อยู่
เช่น การอ้างอิงที่อยู่แบบรีจีสเตอร์ทางอ้อมหรือแบบดีสเพลชเมนต์ ตัวอย่าง รีจีสเตอร์ใช้งานทั่วไป ได้แก่ รีจีสเตอร์เก็บข้อมูลของซีพียู
8086 (AX, BX, CX, และ DX) เป็นต้น
- รีจีสเตอร์สำหรับเก็บตำแหน่งที่อยู่ อาจเป็นรีจีสเตอร์สำหรับใช้งานทั่วไป หรือเป็นรีจีสเตอร์ที่กำหนดให้ใช้การอ้างอิงเกี่ยวกับตำแหน่ง
ที่อยู่โดยตรง ตัวอย่าง รีจีสเตอร์เหล่านี้ ได้แก่
- ตัวชี้ตำแหน่งเซ็กเมนต์ (segment pointers) : ในเครื่องที่ใช้วิธีกำหนดตำแหน่งที่อยู่แบบเซ็กเมนต์ จะมีรีจีสเตอร์เซ็กเมนต์
(segment register) ในบางกรณีอาจมีการใช้รีจีสเตอร์มากกว่าหนึ่งตัว เช่น ตัวหนึ่งใช้สำหรับระบบปฏิบัติการและอีกหนึ่งใช้สำหรับ
โปรเซสที่กำลังถูกประมวลผล
- ตัวชี้ตำแหน่งดรรชนี (index registers) : รีจีสเตอร์ในกลุ่มนี้ใช้สำหรับการกำหนดตำแหน่งที่อยู่แบบ indexed
addressing และอาจเป็นชนิด autoindexing ก็ได้
- ตัวชี้ตำแหน่งในสแต็ก (stack pointer) : ถ้าคอมพิวเตอร์นั้นใช้ระบบ user-visible stack addressing
สแต็กที่นำมาใช้งานจะะเก็บอยู่ในหน่วยความจำและจะมีจีสเตอร์ตัวหนึ่งที่ใช้ในการชี้ตำแหน่งข้อมูลตัวบนสุดในสแต็กนั้น
วิธีการนี้ช่วยให้สามารถอ้างอิงตำแหน่งข้อมูลโดยนัยได้ นั่นคือการใช้คำสั่ง PUSH, POP และคำสั่งอื่น ๆ ที่เกี่ยวกับสแต็กก็ไม่มีความ
จำเป็นจะต้องบอกตำแหน่งตัวถูกกระทำที่เก็บอยู่ในสแต็กนั้น
- รีจีสเตอร์สำหรับเก็บเงื่อนไขการทำงาน การเก็บเงื่อนไขการทำงานจะมีกลุ่มรีจีสเตอร์ที่ถูกกำหนดค่าขึ้นมาให้สอดคล้องกับผลการ
ประมวลผลของซีพียู เช่น การคำนวณทางคณิตศาสตร์ อาจทำให้ผลลัพธ์มีค่าเป็นจำนวนบวก จำนวนลบ เป็นศูนย์หรือ โอเวอร์โพลว์ก็ได้
กลุ่มบิตเหล่านี้ มักจะเรียกว่า "แฟล็ก” (Flags) ซึ่งจะแสดงไปพร้อม ๆ กับผลลัพธ์ที่คำนวณได้ และถูกเก็บไว้ในตำแหน่งที่
เก็บผลลัพธ์แล้ว บิตพิเศษกลุ่มนี้จะกำหนดค่าขึ้นมาให้สอดคล้องกับผลลัพธ์ที่ประมวลได้ เพื่อนำไปใช้ทดสอบค่าตามเงื่อนไขต่าง ๆ ที่ต้องการ

รีจีสเตอร์ควบคุมและแสดงสถานะ
เป็นกลุ่มรีจีสเตอร์ที่ส่วนใหญ่จะไม่ยินยอมให้ผู้ใช้มองเห็น บางส่วนอาจยินยอมให้ใช้คำสั่งเครื่องในการประมวลผลได้
แต่ต้องกระทำในฐานะของระบบปฏิบัติการเท่านั้น ซีพียูแต่ละรุ่นจะมีการจัดองค์ประกอบของรีจีสเตอร์แตกต่างกัน
ส่วนใหญ่จะแบ่งรีจีสเตอร์สำหรับควบคุมและแสดงสถานะออกเป็นสี่ประเภทดังนี้
- PC (Program counter) เป็นรีจีสเตอร์ที่เก็บที่อยู่ของคำสั่งที่จะถูกประมวลผลในลำดับต่อไป
- IR (Instruction register) เป็นรีจีสเตอร์ที่เก็บคำสั่งเครื่องที่ถูกอ่านจากหน่วยความจำหลักเข้ามาเก็บ
- MAR (Memory address register) ใช้เก็บตำแหน่งที่อยู่อ้างอิงในหน่วยความจำหลัก
- MBR (Memory buffer register) ใช้เก็บข้อมูลขนาด 1 เวิร์ด ล่าสุดที่ถูกอ่านเข้ามาในซีพียูหรือ
ใช้เก็บข้อมูลเพื่อเตรียมบันทึกลงในหน่วยความจำหลัก
โดยทั่วไป ซีพียูจะปรับปรุงค่าในรีจีสเตอร์ PC ทันทีภายหลังจากที่ได้อ่านคำสั่งเข้ามา เพื่อให้รีจีสเตอร์ PC นี้ชี้ตำแหน่ง
คำสั่งที่จะถูกอ่านเข้ามาในลำดับต่อไปเสมอ คำสั่งประเภท branch หรือ skip ทำให้เกิดการเปลี่ยนแปลงค่าในรีจีสเตอร์
นี้ได้ คำสั่งที่ถูกอ่านเข้ามาจะถูกนำไปเก็บไว้ที่รีจีสเตอร์ IR ซึ่งจะถูกวิเคราะห์รหัสดำเนินงาน และตัวกำหนดค่าตัวถูกกระทำ

การออกแบบซีพียูจะต้องกล่าวถึงรีจีสเตอร์ตัวหนึ่ง หรือกลุ่มหนึ่งที่เรียกว่า Program status word (PSW)
ซึ่งใช้เก็บข้อมูลสถานะการทำงานของซีพียูดังต่อไปนี้
- Sign : ใช้เก็บบิตเครื่องหมายของผลลัพธ์ที่เกิดขึ้นจากการประมวลผลคำสั่งทางคณิตศาสตร์ครั้งล่าสุด
- Zero : บิตนี้จะมีค่าเป็น “1” ถ้าผลลัพธ์ที่เกิดขึ้นจากการประมวลผลคำสั่งทางคณิตศาสตร์ครั้งล่าสุดมีค่าเป็น “0”
- Carry : บิตนี้จะมีค่าเป็น “1” ถ้าผลลัพธ์ที่เกิดขึ้นจากการประมวลผลคำสั่งทางคณิตศาสตร์ครั้งล่าสุดเกิดการยืมเลขจาก
หลักที่สูงกว่า หรือมีการทดเลขบิตที่มีค่าเกินบิตสูงสุด
- Equal : บิตนี้จะมีค่าเป็น “1” ถ้าผลการเปรียบเทียบทางตรรกะมีค่าเท่ากัน
- Overflow : ใช้สำหรับบอกให้ทราบว่า ผลลัพธ์ที่เกิดขึ้นจากการประมวลผลคำสั่งทางคณิตศาสตร์ครั้งล่าสุดเกิด overflow
- Interrupt enable/disable : ใช้ในการสั่งให้กระบวนการอินเทอร์รัพท์ทำงานหรือหยุดทำงาน
- Supervisor : ใช้ในการบอกสถานะ การทำงานของซีพียูว่า ในขณะนั้นมีสถานะเป็น user หรือ supervisor
คำสั่งเครื่องบางส่วนที่เป็นคำสั่งสงวน จะสามารถประมวลผลได้ และเนื้อที่หน่วยความจำบางส่วนจะสามารถอ้างอิงถึงได้ก็ต่อเมื่อซีพียูอยู่ในสถานะ supervisor เท่านั้น

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

1 ความคิดเห็น: