Pep/7 เป็นโปรแกรมที่จำลองหลักการทำงานของ CPU ซึ่งอนุญาติให้ผู้ใช้งานเขียน Machine language หรือภาษา Assembly ลงไปได้ เพื่อทำการศึกษาการทำงานของ CPU โดยตัว Pep/7 จะมีตัว Register มาให้ 3 ตัว (A,B,X) มี status bit 4 ตัว (N,V,Z,C) มี PC, Stack Counter,IR และ Memory ประมาณ 4 กิโลไบต์
- A register, X register ใช้สำหรับเก็บข้อมูลชั่วคราวเพื่อใช้ในการประมวลผล
- status bit (n กับ z) ใช้บงบอกว่าค่าใน A register เป็นเลขบวก เลขลบหรือเลขศูนย์ ใช้ในการเปรียบเทียบค่า
- Instruction register (IR)
- Program Counter (PC)
จากบทความ How CPU works? ได้กล่าวไปแล้วว่า CPU จะทำงานตาม Instruction ที่เรากำหนดให้ โดยตัว Control unit จะทำการแปลงให้เป็นสัญญาณไปควบควมตัว CPU โดยจะแปลงจากข้อมูลที่อยู่ใน IR หรือ Instruction Register ที่จะถูกนำค่ามาใส่ในขั้นตอนการ fetch the instruction ใน Pep/7 ตัว IR จะมีความยาวทั้งหมด 3 ไบต์และแบ่งออกเป็นสองส่วนคือ ส่วน Instruction และส่วนของ Operand
Instruction Format
IR ใน Pep/7 แบ่งออกเป็นสองส่วน ส่วนแรกมีความยาว 1 ไบต์ โดยที่ 5 บิตแรกเป็น Instruction Code (Code ที่ใช้สั่ง CPU ให้ทำงาน) บิตที่ 6 เป็นตัวที่ใช้บอกว่า Instruction นี้จะให้ดำเนินการกับ Register ตัวไหน (A Register หรือ X Register) ส่วนสองบิตสุดท้าย จะเป็น addressing-mode ใช้บอกว่าการเข้าถึง operand ที่่จะต้องใช้นั้นเป็นแบบไหน สุดท้ายในส่วนของ Operand จะมีความยาว 2 ไบต์ ใช้กำหนด Operand ให้กับ Instruction หาก addressing-mode เป็นแบบ immediate (operand อยู่ในส่วนนี้เลย) แต่ถ้าหาก addressing mode เป็นแบบ direct ในส่วนนี้จะใช้เก็บที่อยู่ของ Operand ที่เก็บอยู่บนหน่วยความจำ
Instruction Code
ในห้าบิตแรกของส่วน instruction บน IR คือการระบุ instruction code ว่าจะให้ CPU ทำอะไร โดยที่เราจะโฟกัสที่ 5 คำสั่งพื้นฐานดังตารางด้านบน
Register Specifier
บิตที่ 6 ของ IR เป็นการระบุว่า instruction ดังกล่าวจะดำเนินการบน register ตัวไหน ถ้ากำหนดเป็น 0 หมายถึงให้กระทำกับค่าที่อยู่บน A register แต่ถ้าเป็น 1 หมายถึงให้กระทำกับค่าที่อยู่บน X registerAddressing-mode
สองบิตสุดท้ายของส่วน instruction บน IR เป็นการบ่งบอกลักษณะการเข้าถึงตัว Operand ถ้ากำหนดเป็น 00 หมายถึงว่าให้นำเอาค่าจากส่วนของ Operand specifier บน IR ไปใช้ได้เลย (immediate-mode) แต่ถ้าเป็น 01 จะเป็นการให้ไปดึงข้อมูลมาจาก address ที่ระบุอยู่ในส่วน operand specifier (direct-mode)
การบวกเลขโดย CPU
จากบทความ How CPU works? ได้ยกตัวอย่างการบวกเลขโดยใช้ CPU ไปแล้ว มาถึงบทความนี้เราลองมาเขียน instruction code ที่ใช้บวกเลขกันบ้าง
โจทย์ 2+3=?, ในอันดับแรกก่อนที่เราจะเอา 2 ไปบวกกับ 3 ได้เราจะต้องมีเลข 2 อยู่ใน register เสียก่อน (ในที่นี้เราจะใช้ A register หรือเรียกอีกชื่อหนึ่งว่า accumulator) คำสั่งที่ใช้โหลดค่าไปยัง register คือ 00001 โหลดไปที่ accumulator ดังนั้นบิตที่ 6 (register specifier) จะกำหนดให้เป็น 0 ส่วน addressing-mode กำหนดให้เป็น 00 (เราจะใส่ค่าของเลข 2 ไปตรง ๆ เลยในส่วนของ operand specifier) ดังนั้น instruction ของเราก็จะเป็น 11110000
ในส่วนของ operand เนื่องจากเรากำหนด addressing-mode ให้เป็น 00 (immediate-mode) ซึ่งในส่วนของ operand specifier เราก็จะต้องใส่ค่าของเลข 2 ลงไป เราก็จะได้ 10 ใส่ลงไปในส่วนของ operand (padding 10 ให้ครบ 2 ไบต์ด้วยน่ะครับ)
ดังนั้นค่าใน IR ก็จะเป็น 00001000 00000000 00000010 ซึ่งถ้าเราจะเอาไปใส่ใน Pep/7 เราจะต้องแปลงให้เป็นเลขฐาน 16 เสียก่อน เราก็จะได้ 08 00 02
ขั้นต่อมาคือการเพิ่มค่าเข้าไปให้ 2 อีก 3 instruction code ที่ใช้คือ 00011 ส่วน register specifier กับ addressing-mode ยังคงเดิม ในส่วนของ operand specifier ใช้เป็นเลข 3 แปลงเป็นฐานสองได้ 11 ทำให้เราได้เป็น 00011000 00000000 00000011 แปลงเป็นเลขฐาน 16 ได้ 18 00 03 ซึ่งเมื่อเรา execute โปรแกรมเสร็จก็จะเห็นว่าค่าใน accumulator เปลี่ยนเป็น 5 ซึ่งก็คือคำตอบของ 2+3 นั่นเอง
What is "Operand"?
หลาย ๆ คนอาจจะเคยได้ยินคำว่า Operator แต่ไม่รู้จักคำว่า Operand ซึ่งทั้งสองคำนี้ก็มีความเกี่ยวข้องกัน ผมจะยกตัวอย่างให้เห็นภาพ เช่น 1+1=2 เรารู้ว่า Operator คือเครื่องหมายบวก ส่วน Operand ของสมการนี้จะเป็นตัวเลขทั้งสองตัว พูดง่าย ๆ คือ Operand คือตัวที่ถูกตัวดำเนินการกระทำ หรือสมมุติเราต้องการที่จะพิมพ์ตัวอักษร A ออกมา A ก็จะเป็น Operand ของคำสั่งในการพิมพ์
แสดงความคิดเห็น