Simulasi CPU
Proyek ini mensimulasikan sistem komputer sederhana yang terdiri dari CPU dan memori. CPU dan memori disimulasikan oleh proses terpisah yang berkomunikasi. Memori berisi satu program yang akan dijalankan CPU dan kemudian simulasi akan berakhir.
Untuk CPU:
- Ini akan memiliki register ini: PC, SP, IR, AC, X, Y.
- Ini akan mendukung instruksi yang ditunjukkan di bawah ini.
- Ini akan menjalankan program pengguna di alamat 0.
- Instruksi diambil ke IR dari ingatan. Operan dapat diambil menjadi variabel lokal.
- Setiap instruksi harus dieksekusi sebelum instruksi berikutnya diambil.
- Tumpukan pengguna berada di akhir memori pengguna dan tumbuh menuju alamat 0.
- Tumpukan sistem berada di ujung memori sistem dan tumbuh ke arah alamat 0.
- Tidak ada penegakan perangkat keras dengan ukuran tumpukan.
- Program berakhir ketika instruksi akhir dieksekusi. 2 proses harus berakhir pada waktu itu.
- Program pengguna tidak dapat mengakses memori sistem (keluar dengan pesan kesalahan).
Untuk memori:
- Ini akan terdiri dari 2000 entri integer, 0-999 untuk program pengguna, 1000-1999 untuk kode sistem.
- Ini akan mendukung dua operasi: baca (alamat) - Mengembalikan nilai di alamat; Tulis (alamat, data) - Menulis data ke alamat
- Memori akan menginisialisasi dirinya dengan membaca file program.
Untuk timer:
- Pengatur waktu akan mengganggu prosesor setelah setiap instruksi X, di mana X adalah parameter baris perintah.
Untuk pemrosesan interupsi:
- Ada dua bentuk interupsi: timer dan panggilan sistem menggunakan Ins Instruksi.
- Dalam kedua kasus CPU harus memasuki mode kernel.
- Pointer tumpukan harus dialihkan ke tumpukan sistem.
- Register SP dan PC harus disimpan pada tumpukan sistem. (Penangan dapat menyimpan register tambahan).
- Interupsi timer harus menyebabkan eksekusi di alamat 1000.
- Instruksi int harus menyebabkan eksekusi di alamat 1500.
- Interupsi harus dinonaktifkan selama pemrosesan interupsi untuk menghindari eksekusi bersarang.
- Instruksi IRET kembali dari interupsi.
Set Instruksi:
-> 1 = Nilai beban # Muat nilai ke AC
-> 2 = Muat addr # Muat nilai di alamat ke AC
-> 3 = LoadInd Addr # Muat nilai dari alamat yang ditemukan di alamat yang diberikan ke AC. (Misalnya, jika Loadind 500, dan 500 berisi 100, lalu muat dari 100).
-> 4 = loadIdxx addr # Muat nilai AT (alamat+x) ke AC. (Misalnya, jika LoadIDXX 500, dan X berisi 10, lalu muat dari 510).
-> 5 = loadIdxy addr # Muat nilai di (alamat+y) ke AC
-> 6 = loadspx # muat dari (sp+x) ke AC (jika sp adalah 990, dan x adalah 1, muat dari 991).
-> 7 = Simpan addr # simpan nilai di AC ke dalam alamat
-> 8 = dapatkan # mendapat int acak dari 1 hingga 100 ke AC
-> 9 = letakkan port # if port = 1, tulis AC sebagai int ke layar; Jika port = 2, tulis AC sebagai char ke layar
-> 10 = addx # Tambahkan nilai di x ke AC
-> 11 = addy # tambahkan nilai dalam y ke AC
-> 12 = Subx # Kurangi nilai dalam x dari AC
-> 13 = Suby # kurangi nilai dalam y dari AC
-> 14 = copyTox # Salin nilai di AC ke x
-> 15 = CopyFromX # Salin nilai di x ke AC
-> 16 = copytoy # Salin nilai di AC ke y
-> 17 = copyfromy # Salin nilai dalam y ke AC
-> 18 = copyTosp # Salin nilai di AC ke SP
-> 19 = CopyFromSP # Salin nilai di SP ke AC
-> 20 = lompat addr # lompat ke alamat
-> 21 = junififequal addr # lompat ke alamat hanya jika nilai di AC adalah nol
-> 22 = JumpIfnotequal Addr # Jump ke alamat hanya jika nilai di AC bukan nol
-> 23 = Panggilan Addr # Alamat pengembalian ke tumpukan, lompat ke alamat
-> 24 = RET # Alamat pengembalian pop dari tumpukan, lompat ke alamat
-> 25 = Incx # menambah nilai dalam x
-> 26 = decx # mengurangi nilai dalam x
-> 27 = dorong # dorong ac ke tumpukan
-> 28 = pop # pop dari stack ke AC
-> 29 = int # melakukan panggilan sistem
-> 30 = IRET # kembali dari panggilan sistem
-> 50 = END # END EKSEKUSI
====================================================================================================
Folder sampel berisi 5 file sampel.
sampel1.txt
- Menguji instruksi beban yang diindeks.
- Mencetak dua meja, satu dari AZ, yang lain dari 1-10.
sampel2.txt
- Menguji instruksi panggilan/ret.
- Mencetak wajah di mana garis dicetak menggunakan panggilan subrutin.
sampel3.txt
- Menguji instruksi int/iret.
- Loop utama adalah mencetak huruf A diikuti oleh angka yang secara berkala bertambah oleh timer.
- Jumlahnya akan bertambah lebih cepat jika periode timer lebih pendek.
sampel4.txt
- Menguji operasi yang tepat dari tumpukan pengguna dan tumpukan sistem, dan juga menguji bahwa mengakses memori sistem dalam mode pengguna memberikan kesalahan dan keluar.
sampel5.txt
- Ini adalah salah satu yang harus Anda buat. Pastikan untuk memasukkan komentar sehingga siswa kelas tahu apa yang dilakukan program.
====================================================================================================
Langkah untuk menyusun dan melaksanakan proyek:
- S1: Salin file sumber ke sistem Linux.
- S2: Ubah file sumber langsung ke
- S3: Jalankan perintah berikut: GCC Memory.c CPU.C Simulator.C
- S4: Jalankan program: ./a.out
- S5: Menurut info output, masukkan parameter timer x, nama file yang ingin Anda jalankan masing -masing. Setiap item berakhir dengan "Enter". misalnya: 10 ( n) sample2.txt
- S6: Ulangi S4 untuk file uji sampel yang tersisa untuk mendapatkan berbagai output