Oleh : Reza Ervani bin Asmanu
Mempelajari Assembly (Bahasa Rakitan) adalah seperti belajar berbicara langsung dengan “otak” prosesor tanpa perantara penterjemah. Jika bahasa C adalah “Kontraktor” yang menyuruh tukang (Buatkan tembok!), Assembly adalah instruksi detail kepada otot tukang tersebut (Angkat bata, putar 90 derajat, letakkan).
Kode boot.S kita tadi sebenarnya sangat pendek. Mari kita analisis.
Konsep Dasar: Apa itu Register?
Sebelum masuk ke kode, Anda perlu tahu bahwa CPU tidak bisa melakukan operasi langsung di memori (RAM) yang besar itu. CPU hanya bisa bekerja di “kantong saku” internalnya yang disebut Register.
Register adalah penyimpanan super cepat tapi sangat kecil. Di ARM, register diberi nama r0, r1, r2, dst. Ada juga register spesial, salah satunya sp (Stack Pointer).
Bedah Kode Baris demi Baris
1. Bagian Administrasi (Directives)
Kode yang diawali titik (.) bukanlah perintah untuk CPU, tapi pesan untuk Assembler (program yang mengubah teks jadi biner).
Cuplikan kode
.section ".text.boot"
- Artinya: “Hai Assembler, tolong taruh kode di bawah ini di rak bernama
.text.boot.” - Tujuannya: Nanti, si Linker (di file
linker.ld) akan mencari rak bernama.text.bootini dan meletakkannya di urutan paling depan (alamat0x8000). Ini memastikan kode ini adalah hal pertama yang dijalankan saat OS dimuat.
Cuplikan kode
.global _start
- Artinya: “Jadikan simbol
_startterlihat oleh dunia luar.” - Tujuannya: Agar Linker tahu di mana pintu masuk utama program kita.
2. Titik Mulai (Label)
Cuplikan kode
_start:
- Ini disebut Label.
- Ini bukan perintah. Ini seperti penanda buku atau alamat rumah. Ini menandai lokasi memori tempat instruksi berikutnya berada.
3. Menyiapkan Memori Sementara (Stack)
Cuplikan kode
mov sp, #0x8000
Ini adalah instruksi pertama yang benar-benar dikerjakan CPU.
mov(Move): Perintah untuk memindahkan/mengisi nilai.sp(Stack Pointer): Register khusus penunjuk “Tumpukan”.#0x8000: Angka heksadesimal 8000.
Penjelasan Mendalam:
Bahasa C (fungsi main kita) membutuhkan “memori corat-coret” untuk menyimpan variabel lokal. Memori ini disebut Stack.
Uniknya, Stack bekerja dengan cara tumbuh ke bawah (dari alamat tinggi ke alamat rendah).
Bayangkan memori Raspberry Pi:
- Alamat
0x8000: Di sini Kernel kita (kernel.img) mulai diletakkan (tumbuh ke atas/alamat makin besar). - Jika kita meletakkan Stack di
0x8000juga, dan Stack tumbuh ke bawah (menuju0x0000), maka Stack tidak akan menabrak kode Kernel kita.
Jadi, baris ini artinya: “Hai CPU, siapkan stack pointer di alamat 0x8000. Kalau butuh memori coretan, ambil dari alamat 0x7FFF, 0x7FFE, dst.”
4. Serah Terima Jabatan
Cuplikan kode
bl main
bl(Branch with Link):- Branch: Lompat. Perintah untuk pindah eksekusi ke alamat lain.
- Link: Ingat jalan pulang. (Menyimpan alamat saat ini di register
lragar nanti bisa kembali—meskipun di OS sederhana ini kita tidak akan kembali).
main: Ini adalah nama fungsivoid main()yang ada di filemain.cAnda.
Di sinilah momen Assembly menyerahkan kendali ke Bahasa C. Lampu LED berkedip terjadi karena instruksi ini berhasil melompat ke kode C Anda.
5. Jaring Pengaman (Infinite Loop)
Bagaimana jika fungsi main() selesai? (Misalnya return atau kode C habis). CPU tidak boleh berhenti. Jika CPU “menganggur” tanpa instruksi, ia akan terus membaca memori selanjutnya yang mungkin berisi sampah (data acak), dan itu bisa menyebabkan kerusakan tak terduga.
Maka, kita buat penjara:
Cuplikan kode
halt:
- Label lagi, bernama
halt(berhenti).
Cuplikan kode
wfe
wfe(Wait For Event): “Tidurlah sampai ada yang membangunkanmu”. Ini instruksi hemat daya. CPU masuk mode low power.
Cuplikan kode
b halt
b(Branch): Lompat kembali ke labelhalt.
Logikanya:
- Tidur (
wfe). - Jika terbangun, lompat ke atas (
b halt). - Ketemu perintah tidur lagi (
wfe). - Dan seterusnya selamanya.
Ini memastikan CPU tetap aman dalam kondisi diam jika kode utama selesai dieksekusi.
Rangkuman Visual
Jika diterjemahkan ke bahasa manusia sehari-hari:
.section: “Ini dokumen penting, taruh di tumpukan paling atas.”_start:: “Mulai baca dari sini.”mov sp: “Siapkan meja kerja (stack) di alamat 8000 agar tidak menyenggol dokumen utama.”bl main: “Sekarang, panggil Manajer Utama (simain.c) untuk bekerja.”halt:: “Kalau Manajer Utama sudah pulang, kamu diam saja di sini. Jangan keluyuran.”
Silahkan lihat juga penjelasan rinci untuk tiap bagian yang sudah saya buatkan di blog ini.
Semoga bermanfaat
