Halo Pada artikel ini saya akan memberi tahu Anda langkah-langkah apa yang perlu Anda lalui untuk membuat prosesor dan lingkungan sederhana untuk itu.
Pertama, Anda perlu memutuskan apa yang akan menjadi prosesor. Parameter berikut ini penting:
- Ukuran kata mesin dan register (bit / "bit" dari prosesor)
- Instruksi mesin (instruksi) dan ukurannya
Arsitektur prosesor dapat dibagi menjadi 2 jenis sesuai dengan ukuran instruksi (pada kenyataannya, ada lebih banyak dari mereka, tetapi opsi lain kurang populer):
Perbedaan utama mereka adalah bahwa prosesor RISC memiliki ukuran instruksi yang sama. Instruksi mereka sederhana dan berjalan relatif cepat, sementara prosesor CISC dapat memiliki ukuran instruksi yang berbeda, beberapa di antaranya dapat memakan waktu cukup lama.
Saya memutuskan untuk membuat prosesor RISC seperti MIPS .
Saya melakukan ini karena beberapa alasan:
- Cukup sederhana untuk membuat prototipe prosesor semacam itu.
- Semua kompleksitas jenis prosesor ini ditransfer ke program seperti assembler dan / atau kompiler.
Berikut adalah fitur utama dari prosesor saya:
- Kata mesin dan ukuran register - 32 bit
- 64 register (termasuk penghitung perintah )
- 2 jenis instruksi
Jenis daftar (selanjutnya jenis Daftar) terlihat seperti ini:

Keunikan dari instruksi tersebut adalah mereka beroperasi dengan tiga register.
Jenis langsung :

Petunjuk jenis ini beroperasi dengan dua register dan nomor.
OP adalah jumlah instruksi yang akan dieksekusi (atau untuk menunjukkan bahwa instruksi tipe Register ini).
R0 , R1 , R2 adalah nomor register yang berfungsi sebagai operan untuk instruksi.
Func adalah bidang tambahan yang digunakan untuk menunjukkan jenis instruksi tipe Registrasi .
Imm adalah bidang tempat nilainya ditulis, yang ingin kita berikan instruksi secara eksplisit sebagai operan.
Daftar lengkap instruksi dapat ditemukan di repositori github .
Berikut adalah beberapa di antaranya:
nor r0, r1, r2
NOR adalah instruksi tipe Register yang melakukan logika ATAU TIDAK pada register r1 dan r2, setelah itu menuliskan hasilnya ke register r0.
Untuk menggunakan instruksi ini, Anda perlu mengubah bidang OP ke 0000 dan bidang Func menjadi 0000000111 dalam sistem angka biner.
lw r0, n(r1)
LW adalah instruksi tipe Segera yang memuat nilai memori pada r1 + n ke dalam register r0.
Untuk menggunakan instruksi ini, pada gilirannya, Anda perlu mengubah bidang OP ke 0111 , dan menulis angka n di bidang IMM .
Menulis kode prosesor
Setelah membuat ISA, Anda dapat mulai menulis prosesor.
Untuk ini, kita perlu pengetahuan tentang beberapa jenis bahasa deskripsi peralatan. Inilah beberapa di antaranya:
- Verilog
- VHDL (jangan bingung dengan yang sebelumnya!)
Saya memilih Verilog, karena pemrograman tentang itu adalah bagian dari program universitas saya.
Untuk menulis prosesor, Anda perlu memahami logika operasinya:
- Mendapatkan instruksi di Command Counter (PC)
- Instruksi Decoding
- Eksekusi instruksi
- Menambahkan ke Counter ukuran perintah dari instruksi yang dieksekusi
Demikian seterusnya ad infinitum.
Ternyata Anda perlu membuat beberapa modul:
Kami akan menganalisis setiap modul secara individual.
Daftarkan file
File register menyediakan akses ke register. Dengannya, Anda perlu mendapatkan nilai dari beberapa register, atau mengubahnya.
Dalam kasus saya, saya memiliki 64 register. Di salah satu register hasil operasi pada dua lainnya ditulis, jadi saya perlu memberikan kesempatan untuk mengubah hanya satu, dan mendapatkan nilai dari dua lainnya.
Dekoder
Decoder adalah unit yang bertanggung jawab untuk instruksi decoding. Ini menunjukkan operasi apa yang perlu dilakukan oleh ALU dan unit lainnya.
Sebagai contoh, pernyataan addi harus menambahkan nilai register $ nol (Selalu menyimpan 0 ) dan 20 dan memasukkan hasilnya ke register $ t0.
addi $t0, $zero, 20
Pada titik ini, dekoder menentukan bahwa instruksi ini:
- Jenis langsung
- Harus menulis hasilnya ke register
Dan mentransfer informasi ini ke blok berikut.
ALU
Setelah kontrol beralih ke ALU. Biasanya melakukan semua operasi matematika, logis, serta operasi membandingkan angka.
Artinya, jika kita mempertimbangkan instruksi addi yang sama, maka pada tahap ini penambahan 0 dan 20 terjadi.
Lainnya
Selain blok-blok di atas, prosesor harus dapat:
- Dapatkan dan ubah nilai dalam memori
- Lakukan lompatan bersyarat
Di sana - sini Anda dapat melihat tampilannya dalam kode.
Assembler
Setelah menulis prosesor, kita memerlukan program yang mengubah perintah teks menjadi kode mesin agar tidak melakukannya secara manual. Karena itu, Anda perlu menulis assembler.
Saya memutuskan untuk mengimplementasikannya dalam bahasa pemrograman C.
Karena prosesor saya memiliki arsitektur RISC , untuk menyederhanakan hidup saya, saya memutuskan untuk merancang assembler sehingga saya dapat dengan mudah menambahkan instruksi semu saya sendiri (kombinasi dari beberapa instruksi dasar atau instruksi semu lainnya).
Anda bisa menerapkan ini menggunakan struktur data yang menyimpan jenis instruksi, formatnya, penunjuk ke fungsi yang mengembalikan kode instruksi mesin, dan namanya.
Program reguler dimulai dengan deklarasi segmen.
Dua segmen .text sudah cukup bagi kami - di mana kode sumber program kami akan disimpan - dan .data - di mana data dan konstanta kami akan disimpan.
Instruksi mungkin terlihat seperti ini:
.text jie $zero, $zero, $zero # addi $t1, $zero, 2 # $t1 = $zero + 2 lw $t1, 5($t2) # $t1 = *($t2 + 5) syscall 0, $zero, $zero # syscall(0, 0, 0) la $t1, label# $t1 = label
Pertama, nama instruksi diindikasikan, kemudian operan.
Dalam. Data , deklarasi data ditunjukkan.
.data .byte 23 # 1 .half 1337 # 2 .word 69000, 25000 # 4 .asciiz "Hello World!" # ( ) .ascii "12312009" # ( ) .space 45 # 45
Iklan harus dimulai dengan titik dan nama tipe data, diikuti oleh konstanta atau argumen.
Lebih mudah untuk mem-parsing (memindai) file assembler sebagai berikut:
- Pertama, pindai segmennya
- Jika itu adalah segmen .data , maka kami mengurai berbagai tipe data atau segmen .text
- Jika itu adalah segmen .text , maka kami mengurai perintah atau segmen .data
Agar berhasil, assembler harus memeriksa file sumber sebanyak 2 kali. Pertama kali ia mempertimbangkan offset apa yang ada pada tautan (melayani), biasanya terlihat seperti ini:
la $s4, loop # loop s4 loop: # ! mul $s2, $s2, $s1 # s2 = s2 * s1 addi $s1, $s1, -1 # s1 = s1 - 1 jil $s3, $s1, $s4 # s3 < s1
Dan di pass kedua, Anda sudah dapat menghasilkan file.
Ringkasan
Di masa depan, Anda dapat menjalankan file output dari assembler pada prosesor kami dan mengevaluasi hasilnya.
Selain itu, assembler siap pakai dapat digunakan dalam kompiler C. Tapi ini nanti.
Referensi: