Periwinkle: prosesor instruksi tunggal

Saya ingin berbicara tentang prosesor yang saya kembangkan pada tahun 2016. Ini diimplementasikan dalam C sebagai mesin virtual. Teman saya Björn menulis assembler untuknya di F #.

Periwinkle adalah prosesor OISC (satu set komputer instruksi), tidak seperti RISC dan CISC. Tidak memiliki pipelining. Faktanya, produktivitas bukanlah tujuan utama dari proyek, itu diciptakan lebih untuk kesenangan dan untuk tujuan pendidikan.

Teman saya Alena datang dengan nama Periwinkle, yaitu, periwinkle (bunga yang luar biasa ulet ini dianggap sebagai simbol vitalitas - sekitar Per.)

Ada banyak jenis instruksi untuk OISC. Namun dalam Periwinkle, ini adalah pernyataan pindah. Cukup pindahkan literal ke register atau nilai dari satu register ke register lainnya. Operasi logis dan aritmatika, percabangan, dll. dilakukan menggunakan register.

Panjang instruksi Periwinkle adalah stabil 40 bit. Bus data 32 bit.



Periwinkle memiliki total 64 register.



Berikut ini adalah deskripsi dari beberapa:

Penghitung Perangkat Lunak (PC)

  • Penghitung hingga 32 bit
  • Ukuran memori program adalah 255 kata 40-bit (tergantung implementasi)
  • Memindahkan -1 ke register PC menyebabkan penghitung berhenti secara eksplisit

General Purpose Stack (STK)
  • Stack for anything (kedalaman 16 level)
  • Tidak ada sinyal kelebihan dan tumpukan tidak lengkap
  • Membaca tumpukan kosong menghasilkan 0
  • Memindahkan nilai di sini adalah operasi push
  • Pindah dari sini - operasi pop

Random Number Generator (RNG)

  • Saat dipanggil, menghasilkan angka acak 32-bit
  • Memindahkan nilai di sini sepertinya tidak ada gunanya

Lewati Jika Nol (SIZ)
  • Melewati pernyataan berikut jika Anda memindahkan nol ke sana

Lewati Jika Bukan Nol (SINZ)
  • Melewati pernyataan berikut jika Anda memindahkan nilai bukan nol ke sana

Referensi (REF)

  • Digunakan untuk menunjukkan alamat berdasarkan nilai yang dipindahkan
  • Nilai besar dipotong menjadi angka 6-bit.

Dereference (DEF)
  • Dereferencing setelah REF

Registed Registers (RSV)
  • Pindah ke sini tidak masalah. Register masih berisi nol.
  • Dapat digunakan untuk tugas apa pun saat mentransfer mesin virtual ke mikrokontroler atau yang lainnya
  • Untuk register masa depan / tambahan
  • Dapat digunakan untuk menghapus item dari tumpukan tujuan umum dan register operasional dengan memindahkan item di sini (tidak disarankan)
  • Saat membaca, mengembalikan 0

Register Tujuan Umum (GPR0-GPR31)

  • Dapat berisi angka 32-bit

Daftar nol

  • Dapat digunakan untuk menghapus item dari tumpukan tujuan umum dan register operasional dengan memindahkan item ini ke sini
  • Mengembalikan 0 saat membaca

Daftar Status:

  • 0000 0000 0000 0000 0000 0000 000P ZVNC
  • Berisi lima bendera (C, N, V, Z, P)
  • Bawa
  • Negatif
  • Overflow
  • Nol
  • Register PLUS memengaruhi flag C, N, V, Z, P
  • Register AND, OR, XOR mempengaruhi flag N, Z, P
  • Operasi yang terakhir berjalan akan memengaruhi register status
  • Memindahkan artinya di sini sepertinya tidak ada gunanya.

Tetapi bagaimana cara kerja register PLUS, AND, OR, XOR? Keempat register ini memiliki stack yang aneh, yang sebenarnya merupakan stack komputasi. Ketika ada dua angka dalam tumpukan perhitungan, operasi dimulai.



Berikut adalah contoh untuk register PLUS. Skema ini bekerja sama untuk tiga register lainnya.

Tetapi bagaimana cara melakukan operasi aritmatika hanya dengan empat operator? Seperti yang saya katakan, tujuan dari proyek ini adalah hiburan dan pendidikan. Oleh karena itu, Anda dapat secara independen mensintesis tindakan yang hilang.

Pengurangan dilakukan dengan menambahkan dengan kode tambahan yang mewakili angka negatif. Kode tambahan dibentuk oleh inversi bit, yaitu dengan mendorong ke angka 0xFFFFFFFF (2³²-1) melalui XOR. Dan menambahkan satu melalui register PLUS. Namun, assembler mendukung angka negatif, jadi tidak perlu melakukan semua ini.

Perkalian hanyalah beberapa tambahan.

Pembagian adalah berapa kali angka tunggal ditempatkan dalam angka. Ini dapat dihitung melalui konter pengurangan berurutan.

Pergeseran bit dilakukan dengan mengalikan dengan 2 atau membaginya dengan 2.

Pikirkan sendiri cara mensintesis operasi lain.

Jika tertarik, berikut adalah repositori github dari beberapa program assembler yang saya tulis untuk Periwinkle. Instruksi pemindahan bekerja dari kiri ke kanan:

#50 gpr0 //  50(base-10)  gpr0 gpr0 gpr1 //  gpr0  gpr1 

Selain itu, saya akan mencoba mengunggah file yang dapat dieksekusi dari mesin virtual Periwinkle VM. Untuk apa platform mesin virtual itu? (Windows (x86? X86-64?), Linux (x86? X86-64? ARM?, ARM64 ?, Etc.?), Etc.?) Karena assembler ditulis dalam F #, mungkin dapat bekerja di mana saja , Anda hanya perlu .NET framework , Anda dapat melihat Mono .

Jika Anda tahu arsitektur PIC16 , Anda mungkin melihat beberapa kesamaan dengan Periwinkle (STATUS, SIZ, SINZ, REF, DEF). Memang, itu mengilhami saya untuk bekerja sebagai arsitektur pertama yang saya mulai program dalam bahasa assembly.

Source: https://habr.com/ru/post/id480024/


All Articles