Saya mengambil kursus tentang kompiler dalam studi sarjana saya di mana kami menulis kompiler yang mengkompilasi program sumber dalam bahasa seperti mainan Java ke bahasa perakitan mainan (yang kami punya juru bahasa). Dalam proyek ini kami membuat beberapa asumsi tentang mesin target yang terkait erat dengan executable asli "nyata", termasuk:
- tumpukan run-time, dilacak oleh register stack pointer ("SP") khusus
- heap untuk alokasi objek dinamis, dilacak oleh register heap pointer ("HP") khusus
- register penghitung program khusus ("PC")
- mesin target memiliki 16 register
- operasi pada data (sebagai lawan dari, misalnya, lompatan) adalah operasi register-to-register
Ketika kami sampai di unit tentang menggunakan alokasi register sebagai optimasi, itu membuat saya bertanya-tanya: Berapa jumlah minimum register secara teoritis untuk mesin seperti itu? Anda dapat melihat dengan asumsi kami bahwa kami menggunakan lima register (SP, HP, PC, ditambah dua untuk digunakan sebagai penyimpanan untuk operasi biner) dalam kompiler kami. Sementara optimisasi seperti alokasi register tentu dapat memanfaatkan lebih banyak register, apakah ada cara untuk bertahan dengan lebih sedikit sementara masih mempertahankan struktur seperti tumpukan dan tumpukan? Saya kira dengan pengalamatan register (operasi register-to-register) kita membutuhkan setidaknya dua register, tetapi apakah kita membutuhkan lebih dari dua?
sumber
Jawaban:
Jika Anda mengizinkan akses memori langsung berdasarkan alamat memori, maka Anda tidak memerlukan "register" karena Anda dapat menggunakan lokasi memori. Sebagai contoh, memori di lokasi 0 dapat menjadi penghitung program, di lokasi 1 kita memiliki stack pointer, dll. Tapi itu curang.
Jadi untuk mencegah diri kita dari kecurangan, mari kita asumsikan tidak ada akses memori langsung, karena kita bisa menggunakan lokasi memori tetap sebagai register. Kemudian kita bisa lolos dengan dua register, penghitung program dan penunjuk tumpukan, seperti yang dijelaskan dalam artikel Wikipedia di mesin tumpukan . Tumpukan hanya dapat diakses melalui penunjuk tumpukan, dan program hanya dapat diakses melalui penghitung program.
Kemungkinan lain adalah menggunakan mesin pencacah. Mesin dua counter adalah Turing lengkap, yaitu, dapat menghitung apa pun yang bisa dilakukan mesin Turing. Ini sekali lagi dijelaskan dengan baik dalam artikel Wikipedia tentang mesin pencacah .
sumber
Arsitektur PIC yang diperkenalkan oleh Instrumen Umum pada 1970-an dan masih digunakan sampai sekarang memiliki register berikut:
Instruksi umum akan membaca register, melakukan perhitungan menggunakan nilai read dan W, dan kemudian menyimpan hasil perhitungan baik ke W atau ke register yang telah dibaca. Salah satu perhitungan yang tersedia menghasilkan "nilai yang dibaca, mengabaikan W"; yang lain adalah "ambil W, abaikan nilai yang dibaca". Pola bit yang sesuai dengan "baca XX, lalu ambil W, abaikan nilai baca, dan simpan hasilnya dalam W" digunakan untuk NOP serta berbagai instruksi khusus.
Untuk memungkinkan perhitungan alamat, unit eksekusi prosesor akan mengawasi instruksi yang menyandikan alamat 00, dan mengganti isi File Select Register untuk alamat tersebut.
Meskipun harus memberi makan semua nilai melalui register W bisa menjadi hambatan, arsitektur PIC memiliki set kerja yang lebih besar daripada arsitektur lain menggunakan kata instruksi panjang yang sama. Pada PIC16C54 (masih dibuat hari ini, dan sangat mirip dengan PIC tahun 1970-an) instruksi adalah 12 bit. Pada banyak bagian 16Cxx atau 16Fxx lainnya, instruksi panjangnya 14 bit dan dapat langsung mengakses ruang alamat 128-byte. Jika set kerja suatu program cocok dengan set kerja set instruksi, pernyataan seperti "total + = nilai", di mana "total" dan "nilai" bertipe
unsigned char
, akan dikompilasi ke:Pada sesuatu seperti ARM, bahkan jika seseorang memiliki register yang sudah dimuat sebelumnya dengan alamat basis variabel seseorang, kode akan lebih seperti:
Dalam banyak kasus, kompiler akan dapat menghindari melakukan banyak dan menyimpan dengan setiap operasi, tetapi pada sesuatu seperti PIC, manfaat dari set kerja yang lebih besar kadang-kadang dapat melebihi batasan harus melalui W sepanjang waktu.
sumber