การจำลอง CPU
โครงการนี้จำลองระบบคอมพิวเตอร์อย่างง่ายซึ่งประกอบด้วย CPU และหน่วยความจำ CPU และหน่วยความจำถูกจำลองโดยกระบวนการแยกต่างหากที่สื่อสาร หน่วยความจำมีหนึ่งโปรแกรมที่ CPU จะดำเนินการจากนั้นการจำลองจะสิ้นสุดลง
สำหรับ CPU:
- มันจะมีการลงทะเบียนเหล่านี้: PC, SP, IR, AC, X, Y.
- มันจะรองรับคำแนะนำที่แสดงด้านล่าง
- มันจะเรียกใช้โปรแกรมผู้ใช้ตามที่อยู่ 0
- คำแนะนำจะถูกดึงเข้าไปใน IR จากหน่วยความจำ ตัวถูกดำเนินการสามารถนำไปใช้เป็นตัวแปรท้องถิ่น
- คำสั่งแต่ละคำสั่งควรดำเนินการก่อนที่จะนำคำสั่งถัดไป
- สแต็กผู้ใช้อยู่ในตอนท้ายของหน่วยความจำผู้ใช้และเติบโตไปยังที่อยู่ 0
- สแต็กระบบอยู่ที่ส่วนท้ายของหน่วยความจำระบบและเติบโตไปยังที่อยู่ 0
- ไม่มีการบังคับใช้ฮาร์ดแวร์ขนาดสแต็ก
- โปรแกรมสิ้นสุดลงเมื่อคำสั่งสิ้นสุดถูกดำเนินการ กระบวนการ 2 ควรสิ้นสุดในเวลานั้น
- โปรแกรมผู้ใช้ไม่สามารถเข้าถึงหน่วยความจำระบบ (ออกจากข้อความแสดงข้อผิดพลาด)
สำหรับหน่วยความจำ:
- มันจะประกอบด้วยรายการจำนวนเต็ม 2,000 รายการ, 0-999 สำหรับโปรแกรมผู้ใช้, 1000-1999 สำหรับรหัสระบบ
- มันจะสนับสนุนการดำเนินการสองครั้ง: อ่าน (ที่อยู่) - ส่งคืนค่าตามที่อยู่; เขียน (ที่อยู่, ข้อมูล) - เขียนข้อมูลไปยังที่อยู่
- หน่วยความจำจะเริ่มต้นเองโดยการอ่านไฟล์โปรแกรม
สำหรับตัวจับเวลา:
- ตัวจับเวลาจะขัดจังหวะโปรเซสเซอร์หลังจากคำสั่ง X ทุกคำแนะนำโดยที่ X เป็นพารามิเตอร์บรรทัดคำสั่ง
สำหรับการประมวลผลขัดจังหวะ:
- มีการขัดจังหวะสองรูปแบบ: ตัวจับเวลาและการโทรระบบโดยใช้คำสั่ง INT
- ในทั้งสองกรณี CPU ควรเข้าสู่โหมดเคอร์เนล
- ตัวชี้สแต็กควรเปลี่ยนเป็นสแต็กระบบ
- การลงทะเบียน SP และ PC ควรได้รับการบันทึกไว้ในสแต็คระบบ (ตัวจัดการอาจบันทึกการลงทะเบียนเพิ่มเติม)
- การขัดจังหวะตัวจับเวลาควรทำให้เกิดการดำเนินการตามที่อยู่ 1,000
- คำสั่ง INT ควรทำให้เกิดการดำเนินการตามที่อยู่ 1500
- การขัดจังหวะควรปิดการใช้งานระหว่างการประมวลผลขัดจังหวะเพื่อหลีกเลี่ยงการดำเนินการซ้อนกัน
- คำสั่ง IRET กลับมาจากการขัดจังหวะ
ชุดคำแนะนำ:
-> 1 = โหลดค่า # โหลดค่าลงใน AC
-> 2 = โหลด addr # โหลดค่าที่ที่อยู่ลงใน AC
-> 3 = loadind addr # โหลดค่าจากที่อยู่ที่พบในที่อยู่ที่กำหนดลงใน AC (ตัวอย่างเช่นถ้า loadind 500 และ 500 มี 100 แล้วโหลดจาก 100)
-> 4 = loadidxx addr # โหลดค่าที่ (ที่อยู่+x) ลงใน AC (ตัวอย่างเช่นถ้า loadidxx 500 และ x มี 10 แล้วโหลดจาก 510)
-> 5 = loadidxy addr # โหลดค่าที่ (ที่อยู่+y) ลงใน AC
-> 6 = loadspx # โหลดจาก (sp+x) ลงใน AC (ถ้า SP คือ 990 และ x คือ 1 โหลดจาก 991)
-> 7 = จัดเก็บ addr # เก็บค่าใน AC ไว้ในที่อยู่
-> 8 = รับ # ได้รับการสุ่ม int จาก 1 ถึง 100 ใน AC
-> 9 = ใส่พอร์ต # ถ้าพอร์ต = 1 เขียน AC เป็น int ไปยังหน้าจอ; ถ้าพอร์ต = 2 เขียน AC เป็นถ่านไปที่หน้าจอ
-> 10 = addx # เพิ่มค่าใน x ไปยัง AC
-> 11 = addy # เพิ่มค่าใน y ไปยัง ac
-> 12 = subx # ลบค่าใน x จาก ac
-> 13 = suby # ลบค่าใน y จาก ac
-> 14 = Copytox # คัดลอกค่าใน AC ถึง X
-> 15 = CopyFromx # คัดลอกค่าใน X ไปยัง AC
-> 16 = Copytoy # คัดลอกค่าใน AC ถึง Y
-> 17 = CopyFromy # คัดลอกค่าใน y ไปยัง AC
-> 18 = Copytosp # คัดลอกค่าใน AC ไปยัง SP
-> 19 = copyfromsp # คัดลอกค่าใน sp ไปยัง ac
-> 20 = กระโดด addr # ข้ามไปที่ที่อยู่
-> 21 = updifequal addr # ข้ามไปยังที่อยู่เฉพาะในกรณีที่ค่าใน AC เป็นศูนย์
-> 22 = jumpifnotequal addr # ข้ามไปยังที่อยู่เฉพาะในกรณีที่ค่าใน AC ไม่ใช่ศูนย์
-> 23 = การโทร Addr # ที่อยู่ส่งคืนไปยังสแต็กข้ามไปที่ที่อยู่
-> 24 = ret # ที่อยู่ส่งคืนป๊อปจากสแต็กข้ามไปที่ที่อยู่
-> 25 = incx # เพิ่มค่าใน x
-> 26 = decx # ลดค่าใน x
-> 27 = กด # push ac ลงบนสแต็ก
-> 28 = ป๊อป # ป๊อปจากสแต็คเป็น AC
-> 29 = int # ดำเนินการโทรระบบ
-> 30 = IRET # กลับจากการโทรระบบ
-> 50 = สิ้นสุด # การดำเนินการสิ้นสุด
-
โฟลเดอร์ตัวอย่างมีไฟล์ตัวอย่าง 5 ไฟล์
ตัวอย่าง 1.txt
- ทดสอบคำแนะนำการโหลดที่จัดทำดัชนี
- พิมพ์สองตารางหนึ่งใน AZ อีกอันหนึ่งของ 1-10
ตัวอย่าง 2.txt
- ทดสอบคำแนะนำการโทร/RET
- พิมพ์ใบหน้าที่พิมพ์เส้นโดยใช้สายย่อยย่อย
sample3.txt
- ทดสอบคำแนะนำ INT/IRET
- ลูปหลักกำลังพิมพ์ตัวอักษร A ตามด้วยตัวเลขที่เพิ่มขึ้นเป็นระยะโดยตัวจับเวลา
- จำนวนจะเพิ่มขึ้นเร็วขึ้นหากระยะเวลาตัวจับเวลาสั้นลง
ตัวอย่าง
- ทดสอบการทำงานที่เหมาะสมของสแต็กผู้ใช้และสแต็กระบบและยังทดสอบว่าการเข้าถึงหน่วยความจำระบบในโหมดผู้ใช้จะให้ข้อผิดพลาดและออก
ตัวอย่าง 5.txt
- นี่คือสิ่งที่คุณควรสร้าง ให้แน่ใจว่าได้รวมความคิดเห็นเพื่อให้นักเรียนระดับประถมรู้รู้ว่าโปรแกรมกำลังทำอะไรอยู่
-
ขั้นตอนสำหรับการรวบรวมและดำเนินโครงการ:
- S1: คัดลอกไฟล์ต้นฉบับลงในระบบ Linux
- S2: เปลี่ยนไฟล์แหล่งที่มาโดยตรง
- S3: เรียกใช้คำสั่งต่อไปนี้: GCC Memory.C CPU.C Simulator.c
- S4: เรียกใช้โปรแกรม: ./a.out
- S5: ตามข้อมูลเอาต์พุตป้อนพารามิเตอร์ตัวจับเวลา X ชื่อไฟล์ที่คุณต้องการเรียกใช้ตามลำดับ แต่ละรายการลงท้ายด้วย "Enter" เช่น: 10 ( n) ตัวอย่าง 2.txt
- S6: ทำซ้ำ S4 สำหรับไฟล์ทดสอบตัวอย่างที่เหลือเพื่อรับเอาต์พุตต่างๆ