Pep/7 Simulator

By Unknown | วันศุกร์, กุมภาพันธ์ 28, 2557
Pep/7's CPU

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 กิโลไบต์

ในการศึกษาเบื้องต้น จะโฟกัสที่ตัวหลักคือ
  1. A register, X register ใช้สำหรับเก็บข้อมูลชั่วคราวเพื่อใช้ในการประมวลผล
  2. status bit (n กับ z) ใช้บงบอกว่าค่าใน A register เป็นเลขบวก เลขลบหรือเลขศูนย์ ใช้ในการเปรียบเทียบค่า
  3. Instruction register (IR)
  4. 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 register

Addressing-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 ของคำสั่งในการพิมพ์

ดาวน์โหลดโปรแกรม Pep/7 ได้ที่นี้

Reference : Computer Science Illuminated, 3rd edition, N. Dale and J. Lewis, 2008

แสดงความคิดเห็น