Oleh: Reza Ervani bin Asmanu
Dalam perjalanan kita mempelajari pemrograman bare metal (sistem operasi dasar), kita sering mendengar istilah Register. Saat kita menulis kode Assembly boot.S untuk Raspberry Pi, instruksi pertama yang kita tulis adalah memindahkan nilai ke sp. Namun, apa sebenarnya register itu, dan mengapa peranannya begitu vital dalam sebuah prosesor?
Artikel ini akan mengupas definisi register secara umum, fungsinya dalam hierarki memori, hingga implementasi spesifiknya pada arsitektur ARMv6 yang digunakan oleh Raspberry Pi 1.
1. Definisi dan Konsep Dasar
Secara sederhana, Register adalah tempat penyimpanan data elektronik yang berada di dalam prosesor (CPU) itu sendiri. Register bukanlah memori utama (RAM), dan bukan pula penyimpanan sekunder (SSD/Hard Disk). Ia adalah unit memori terkecil, namun memiliki kecepatan akses tertinggi dalam sistem komputer

Dalam hierarki memori komputer, terdapat prinsip trade-off antara kecepatan dan kapasitas:
- Storage (HDD/SSD): Kapasitas sangat besar, kecepatan lambat.
- RAM (Main Memory): Kapasitas sedang, kecepatan tinggi.
- Cache (L1/L2/L3): Kapasitas kecil, kecepatan sangat tinggi.
- Register: Kapasitas sangat kecil (hanya beberapa byte), kecepatan ekstrem (setara dengan clock speed CPU).
Mengapa Kita Membutuhkan Register?
Unit Aritmatika dan Logika (ALU) pada CPU—bagian yang bertugas melakukan perhitungan—tidak dapat memproses data langsung dari RAM. Data tersebut harus “diambil” (fetch) dan diletakkan tepat di “tangan” CPU sebelum dapat diolah. “Tangan” inilah yang kita sebut sebagai Register.
Studi Kasus: Alur Data pada Raspberry Pi 1
Untuk memahami peran register, mari kita lihat bagaimana data mengalir secara fisik di dalam perangkat Raspberry Pi 1 yang ada di meja kerja kita.
Bayangkan Unit Aritmatika dan Logika (ALU) di dalam inti prosesor ARM1176JZF-S hendak menjumlahkan dua angka. ALU tidak bisa melihat keluar; ia hanya bisa memproses apa yang ada di genggamannya. Berikut adalah hierarkinya:
- MicroSD Card (Gudang Penyimpanan/Storage)Ini adalah tempat penyimpanan data jangka panjang (persisten), tempat kernel.img kita berada. CPU tidak dapat memproses data langsung di sini karena kecepatannya sangat lambat dibandingkan kecepatan prosesor. Data harus disalin dulu ke memori utama.
- SDRAM (Memori Utama/RAM)Pada Raspberry Pi 1, ini adalah chip memori 256MB/512MB yang tertanam tepat di atas prosesor (teknologi Package-on-Package). Meskipun jauh lebih cepat daripada SD Card, CPU tetap tidak bisa melakukan operasi matematika langsung pada data yang duduk di alamat SDRAM.
- Register (r0 – r12)Inilah “meja kerja” sesungguhnya. Register berada tepat di jantung inti ARM11.
Skenario Nyata:
Jika kita ingin menjumlahkan variabel A dan B yang ada di SDRAM:
- Load: CPU harus mengambil nilai
Adari SDRAM dan menyalinnya ke registerr0. - Load: CPU mengambil nilai
Bdari SDRAM dan menyalinnya ke registerr1. - Process: ALU menjumlahkan nilai di
r0danr1, lalu menyimpan hasilnya di registerr2. - Store: Terakhir, CPU menyalin nilai hasil dari
r2kembali ke alamat tertentu di SDRAM.
Tanpa register sebagai perantara super-cepat ini, prosesor ARM tidak akan bisa melakukan komputasi apapun. Instruksi Assembly seperti LDR (Load Register) dan STR (Store Register) adalah perintah untuk memindahkan data antara SDRAM (Kulkas) dan Register (Talenan) tersebut.
2. Klasifikasi Register Secara Umum
Dalam desain komputer klasik, register dibagi menjadi beberapa kategori berdasarkan fungsinya:
- General Purpose Registers (GPR): Register serbaguna yang dapat digunakan oleh programmer untuk menyimpan data sementara, variabel, atau hasil perhitungan matematika.
- Special Purpose Registers (SPR): Register yang memiliki tugas spesifik dan krusial untuk kontrol sistem. Contoh utamanya adalah:
- Program Counter (PC): Menyimpan alamat memori dari instruksi selanjutnya yang harus dieksekusi.
- Stack Pointer (SP): Menyimpan alamat memori yang menunjuk ke puncak tumpukan (stack).
- Status Register (Flags): Menyimpan kondisi prosesor saat ini (misalnya: apakah hasil pengurangan terakhir bernilai nol? Apakah terjadi error?).
3. Register dalam Konteks Raspberry Pi 1 (ARMv6)
Raspberry Pi 1 menggunakan SoC Broadcom BCM2835 dengan inti prosesor ARM1176JZF-S. Prosesor ini menggunakan arsitektur ARMv6 yang berbasis 32-bit.
Berbeda dengan prosesor Intel (x86) yang memiliki penamaan register yang beragam (EAX, EBX, ECX), arsitektur ARM memiliki pendekatan yang lebih seragam dan sederhana.
Pada mode operasi standar (User/System Mode), ARM menyediakan 16 register utama yang dapat diakses oleh kita sebagai pembuat OS:
A. Register Umum (R0 – R12)
Register r0 hingga r12 adalah register serbaguna (General Purpose). Kita bebas menggunakannya untuk menyimpan angka, alamat memori, atau penghitung loop.
- Dalam konvensi pemanggilan fungsi (C Calling Convention),
r0–r3biasanya digunakan untuk mengirim argumen ke fungsi dan menerima nilai kembalian (return value).
B. Register Spesifik (R13, R14, R15)
Tiga register terakhir memiliki peran “sakral” dalam arsitektur ARM:
- Register R13 – Stack Pointer (SP)Ini adalah register yang kita manipulasi dalam kode boot.S dengan perintah mov sp, #0x8000. Register ini bertugas mencatat di mana lokasi memori “corat-coret” terakhir disimpan. Tanpa SP yang diinisialisasi dengan benar, fungsi bahasa C (seperti main()) tidak akan bisa menyimpan variabel lokalnya, dan program akan mengalami crash.
- Register R14 – Link Register (LR)Register ini menyimpan “jalan pulang”. Ketika kita memanggil fungsi lain (misalnya menggunakan instruksi bl atau Branch with Link), alamat instruksi saat ini disimpan di LR. Ketika fungsi tersebut selesai, prosesor membaca LR untuk mengetahui ke mana ia harus kembali.
- Register R15 – Program Counter (PC)Ini adalah penunjuk instruksi. Jika PC bernilai 0x8004, berarti CPU sedang mengeksekusi kode di alamat tersebut. Jika kita mengubah nilai PC secara manual, kita memaksa CPU untuk melompat ke bagian kode yang lain (Jumping/Branching).
C. CPSR (Current Program Status Register)
Selain 16 register di atas, ada satu register status penting bernama CPSR. Register ini tidak menyimpan data, melainkan menyimpan informasi kondisi. Contohnya:
- Jika kita melakukan pengurangan
5 - 5, maka “Zero Flag” (Z) di dalam CPSR akan menyala (bernilai 1), memberi tahu CPU bahwa hasil operasi terakhir adalah nol.
Penutup
Memahami register adalah langkah pertama untuk menguasai pemrograman sistem tingkat rendah. Ketika kita menulis kode dalam bahasa tingkat tinggi seperti C atau Python, compiler dan interpreter-lah yang bekerja keras mengatur penggunaan register ini.
Namun, dalam pengembangan Sistem Operasi bare metal seperti yang sedang kita lakukan pada Raspberry Pi, kendali penuh ada di tangan kita. Instruksi sederhana seperti mov sp, #0x8000 bukan sekadar baris kode, melainkan perintah langsung kita kepada perangkat keras untuk menyiapkan fondasi komputasi.
