Transisi Eksekusi: Instruksi bl dan Serah Terima Kendali ke Bahasa C

Oleh: Reza Ervani bin Asmanu

Dalam alur inisialisasi sistem operasi, terdapat satu titik krusial yang menandai perpindahan “tongkat estafet” dari kode bootloader (Assembly) menuju kernel utama (Bahasa C). Pada kode boot.S yang kita bangun, momen tersebut direpresentasikan oleh satu baris instruksi singkat:

bl main

Secara teknis, ini terlihat seperti lompatan biasa. Namun, di balik layar, instruksi bl (Branch with Link) melakukan serangkaian mekanisme register yang memungkinkan konsep “fungsi” dan “subrutin” dapat bekerja. Artikel ini akan membedah anatomi instruksi tersebut.

1. Definisi: Branch vs Branch with Link

Dalam arsitektur ARM, terdapat dua cara utama untuk memindahkan aliran eksekusi program (melakukan lompatan) ke alamat memori lain:

A. Branch (b)

Ini adalah lompatan satu arah.

  • Analogi: Seseorang pergi meninggalkan rumah dan tidak berniat kembali, atau tidak mencatat alamat rumahnya.
  • Perilaku: CPU hanya mengubah nilai Program Counter (PC) ke alamat tujuan. CPU “lupa” dari mana ia berasal.
  • Penggunaan: Digunakan untuk loops (perulangan) atau lompatan kondisional (seperti if-else).

B. Branch with Link (bl)

Ini adalah lompatan dua arah (pemanggilan fungsi).

  • Analogi: Seseorang pergi merantau, tetapi ia menyimpan tiket pulang di saku bajunya agar bisa kembali ke rumah setelah urusannya selesai.
  • Perilaku: Sebelum melompat, CPU menyimpan alamat instruksi berikutnya ke dalam Link Register (LR).
  • Penggunaan: Digunakan untuk memanggil Subrutin atau Fungsi.

2. Mekanisme “Link” dan Peran Register LR

Saat instruksi bl main dieksekusi, prosesor melakukan dua tugas secara simultan (atomik):

  1. Tugas Branch (Lompat):Prosesor mengisi Program Counter (PC) dengan alamat memori di mana fungsi main berada. Ini menyebabkan instruksi selanjutnya yang akan dieksekusi adalah baris pertama dari kode C main().
  2. Tugas Link (Catat):Sebelum melompat, prosesor mencatat alamat instruksi setelah bl ini ke dalam Register R14 (Link Register / LR).
    • Jika bl main ada di alamat 0x8004, maka alamat 0x8008 (instruksi selanjutnya) disimpan di LR.
    • Tujuannya adalah agar nanti, jika fungsi main() selesai dan melakukan perintah return, prosesor tahu jalan pulang dengan membaca LR.

Meskipun dalam OS sederhana kita ini fungsi main() dirancang dengan infinite loop (while(1)) dan tidak akan pernah kembali, penggunaan bl adalah standar baku (ABI – Application Binary Interface) untuk memanggil fungsi C. Ini memberikan struktur yang valid bagi compiler.

3. Resolusi Simbol: Siapa itu “main”?

Saat kita menulis bl main, Assembler sebenarnya belum tahu di angka berapa alamat main berada.

  1. Peran Assembler: Ia menandai main sebagai “Simbol Eksternal” (sesuatu yang ada di luar file boot.S).
  2. Peran Linker: Nanti, saat proses linking, Linker akan melihat file main.c yang sudah dikompilasi, menemukan fungsi bernama main, menghitung alamat memorinya (misalnya di 0x8040), dan mengganti label main di kode assembly tadi dengan alamat 0x8040.

4. Perubahan Lingkungan (Environment Switch)

Momen eksekusi bl main adalah garis demarkasi yang tegas.

Sebelum bl main (Dunia Assembly):

  • Kita harus mengatur setiap register secara manual (mov, ldr).
  • Tidak ada konsep variabel lokal yang otomatis.
  • Kita bekerja langsung dengan instruksi mesin mentah.

Setelah bl main (Dunia C):

  • CPU mulai mengeksekusi kode yang dihasilkan oleh GCC dari main.c.
  • Kita bisa menggunakan logika tingkat tinggi: if, while, for.
  • Kita bisa menggunakan tipe data: int, char, struct.
  • Manajemen register ditangani otomatis oleh Compiler.

Kesimpulan

Instruksi bl main bukan sekadar perintah lompat. Ia adalah mekanisme delegasi.

Dengan instruksi ini, boot.S berkata: “Tugasku menyiapkan memori dan stack sudah selesai. Sekarang, saya serahkan kendali penuh kepadamu, wahai Kernel C, untuk menjalankan logika sistem operasi. Saya (bootloader) akan menunggu di sini (di Link Register) kalau-kalau engkau selesai.”

Inilah awal mula sistem operasi kita benar-benar “hidup” dan menjalankan logika yang kita rancang.