Dalam pengembangan sistem operasi level rendah (low-level), pemahaman terhadap register prosesor adalah mutlak. Register adalah unit memori terkecil dan tercepat yang berada langsung di dalam inti CPU. Berbeda dengan RAM yang berfungsi sebagai penyimpanan massal, register berfungsi sebagai operan langsung bagi instruksi aritmatika dan logika.
Pada arsitektur ARMv6 (yang digunakan oleh Raspberry Pi 1 dan Zero), terdapat 16 register utama yang dapat diakses oleh programmer dalam mode eksekusi standar (User/System Mode). Register-register ini diberi label R0 hingga R15.
Meskipun secara fisik register R0 hingga R15 memiliki karakteristik elektronik yang serupa, standar arsitektur ARM (khususnya ARM Architecture Procedure Call Standard atau AAPCS) menetapkan peran spesifik untuk masing-masing register guna menjaga konsistensi antara kode Assembly dan bahasa tingkat tinggi seperti C.
Berikut adalah klasifikasi teknis register ARM 32-bit.
1. Register Tujuan Umum (General Purpose Registers)
Kelompok ini digunakan untuk manipulasi data umum, perhitungan matematika, dan alamat memori sementara.
R0 – R3: Register Argumen dan Hasil (Argument / Scratch Registers)
- Fungsi: Dalam interaksi antar fungsi (function calling convention), R0 hingga R3 digunakan untuk mengirimkan parameter (argumen) ke fungsi lain. Selain itu, R0 juga digunakan untuk menyimpan nilai kembalian (return value) dari sebuah fungsi.
- Sifat: Caller-Saved (Volatile). Artinya, nilai di dalam register ini dianggap tidak aman saat pemanggilan fungsi. Jika kita memanggil fungsi lain, fungsi tersebut berhak menimpa isi R0-R3 tanpa perlu memulihkannya.
R4 – R11: Register Variabel Variabel (Variable Registers)
- Fungsi: Digunakan untuk menyimpan variabel lokal yang harus dipertahankan nilainya selama eksekusi fungsi berlangsung.
- Sifat: Callee-Saved (Non-Volatile). Fungsi yang menggunakan register ini wajib menyimpan nilai aslinya (biasanya ke dalam Stack) sebelum menggunakannya, dan mengembalikannya ke nilai semula sebelum fungsi berakhir. Ini menjamin data tidak korup saat fungsi lain dijalankan.
R12: Register IP (Intra-Procedure-call scratch register)
- Fungsi: Sering digunakan oleh linker sebagai register perantara sementara. Namun, dalam kode bare metal yang kita tulis secara manual, R12 sering dimanfaatkan sebagai penyimpanan sementara untuk nilai konstan yang besar agar tidak mengganggu register argumen (R0-R3) maupun register variabel (R4-R11).
- Studi Kasus pada Kernel Kita:Pada instruksi mov r12, #65536, register R12 dipilih untuk menyimpan bitmask LED. Ini adalah keputusan optimasi compiler agar nilai tersebut siap digunakan kapan saja di dalam loop tanpa harus memuat ulang dari memori, dan tanpa mengganggu register R0-R3 yang mungkin dipakai untuk kalkulasi lain.
2. Register Tujuan Khusus (Special Purpose Registers)
Tiga register terakhir (R13, R14, R15) memiliki peran vital dalam kontrol aliran program (control flow) dan manajemen memori. Kesalahan manipulasi pada register ini akan menyebabkan system crash.
R13: SP (Stack Pointer)
- Definisi: Penunjuk alamat memori tumpukan (Stack).
- Peran Teknis: Menunjukkan lokasi memori aktif terakhir pada Stack. Stack pada ARM tumbuh ke bawah (descending), artinya dari alamat memori tinggi ke alamat rendah.
- Implementasi:Instruksi mov sp, #0x8000 pada boot.S menginisialisasi Stack Pointer tepat di awal memori kernel. Saat instruksi sub sp, sp, #8 dijalankan di fungsi main, CPU menurunkan penunjuk ini untuk mengalokasikan ruang bagi variabel lokal.
R14: LR (Link Register)
- Definisi: Penunjuk alamat kembali (Return Address).
- Peran Teknis: Saat instruksi percabangan
BL(Branch with Link) dieksekusi (misalnya memanggil fungsimain), CPU secara otomatis menyalin alamat instruksi berikutnya ke dalam LR. - Fungsi: Ketika sebuah sub-rutin selesai, CPU akan memeriksa LR untuk mengetahui ke mana ia harus kembali. Jika nilai LR tertimpa atau korup, program tidak akan pernah bisa kembali ke pemanggilnya (return).
R15: PC (Program Counter)
- Definisi: Penunjuk instruksi saat ini.
- Peran Teknis: Menyimpan alamat memori dari instruksi yang sedang diambil (fetch) oleh CPU untuk dieksekusi.
- Mekanisme: Secara normal, nilai PC akan bertambah secara otomatis (biasanya +4 byte dalam mode ARM 32-bit) setiap kali satu instruksi selesai dijalankan. Mengubah nilai PC secara manual (misalnya dengan instruksi
MOV PC, ...) setara dengan melakukan lompatan eksekusi (JUMP/GOTO).
3. Register Status: CPSR (Current Program Status Register)
Selain R0-R15, terdapat register internal yang tidak memiliki indeks angka, yaitu CPSR. Register ini menyimpan Flag Kondisi yang dihasilkan dari operasi aritmatika atau logika sebelumnya.
Flag utama dalam CPSR meliputi:
- N (Negative): Bernilai 1 jika hasil operasi bernilai negatif.
- Z (Zero): Bernilai 1 jika hasil operasi adalah nol.
- C (Carry): Bernilai 1 jika operasi menghasilkan sisa (carry out).
- V (Overflow): Bernilai 1 jika terjadi overflow pada aritmatika bertanda (signed).
Relevansi pada Kode Kernel:
Pada blok kode delay loop:
Cuplikan kode
cmp r3, r2 /* Bandingkan nilai counter dengan batas maksimal */
bne loop /* Branch if Not Equal */
Instruksi cmp sebenarnya melakukan pengurangan maya (r3 - r2) dan memperbarui Zero Flag (Z) pada CPSR. Instruksi bne kemudian membaca flag Z tersebut. Jika Z bernilai 0 (artinya hasil tidak sama), maka lompatan dilakukan.
Kesimpulan
Memahami peran spesifik R0-R15 bukan sekadar menghafal konvensi, melainkan memahami bagaimana data mengalir di dalam silikon. Dalam konteks kode yang telah kita bahas:
- R1 berfungsi sebagai Base Address Holder (Menyimpan alamat GPIO).
- R12 berfungsi sebagai Immediate Value Holder (Menyimpan bitmask LED).
- R13 (SP) mengelola memori dinamis fungsi.
- R15 (PC) mengendalikan urutan eksekusi instruksi dari baris ke baris.
