Dalam penulisan kode tingkat rendah (low-level coding), CPU tidak memiliki kemampuan untuk memahami alur cerita program secara utuh. Ia hanya mengeksekusi instruksi demi instruksi secara linier. Namun, bagaimana sebuah program bisa “memilih” jalan yang berbeda atau berhenti melakukan sesuatu? Di sinilah peran krusial instruksi JZ (Jump if Zero).
Apa itu JZ?
JZ adalah singkatan dari Jump if Zero. Ini adalah jenis instruksi conditional jump (lompatan bersyarat) pada arsitektur x86. Sederhananya, instruksi ini memerintahkan CPU: “Jika hasil operasi sebelumnya adalah nol, maka melompatlah ke bagian kode yang ditentukan. Jika tidak, abaikan dan lanjut ke baris berikutnya.”
“Otak” di Balik JZ: Zero Flag (ZF)
CPU tidak memeriksa hasil operasi secara langsung saat mengeksekusi JZ. Alih-alih, ia melihat sebuah “sakelar” kecil di dalam FLAGS Register yang disebut Zero Flag (ZF).
- ZF = 1: Artinya hasil operasi terakhir adalah Nol.
- ZF = 0: Artinya hasil operasi terakhir Bukan Nol.
Instruksi JZ hanya bertugas mengintip status bit ZF ini. Jika ZF bernilai 1, lompatan dilakukan. Jika ZF bernilai 0, lompatan dibatalkan.
Pemicu Instruksi JZ
JZ biasanya muncul setelah instruksi yang memengaruhi status bendera (flags), seperti:
- CMP (Compare): Membandingkan dua nilai. Jika keduanya sama, hasilnya secara internal dianggap nol, dan ZF akan menyala (1).
- SUB (Subtract): Mengurangi satu nilai dengan nilai lain. Jika hasilnya nol, ZF akan menyala.
- OR / AND / TEST: Operasi logika yang sering digunakan untuk memeriksa apakah sebuah register kosong (berisi nol).
Alias: JZ vs. JE
Dalam bahasa rakitan, Anda akan sering menemukan instruksi JE (Jump if Equal). Tahukah Anda bahwa JZ dan JE sebenarnya memiliki kode biner (opcode) yang sama persis?
- JZ (Jump if Zero): Digunakan saat kita berfokus pada hasil matematika atau logika yang bernilai nol.
- JE (Jump if Equal): Digunakan saat kita membandingkan dua angka dan ingin tahu apakah keduanya sama.
Secara teknis keduanya identik, namun penggunaan nama yang berbeda membantu programmer lain memahami maksud dari logika yang sedang dibangun.
Implementasi: Menemukan Ujung Barisan
Salah satu penggunaan JZ yang paling fundamental dalam bootloader adalah mendeteksi akhir dari sebuah string (teks). Dalam pemrograman C atau Assembly, string biasanya diakhiri dengan angka nol (Null Terminator).
cetak_teks:
lodsb ; Ambil karakter ke register AL
or al, al ; Lakukan operasi logika OR pada AL dengan dirinya sendiri
jz selesai ; JIKA hasil OR adalah nol (artinya AL=0), LOMPAT ke 'selesai'
; ... kode untuk mencetak karakter di sini ...
jmp cetak_teks ; Ulangi loop jika belum nol
selesai:
hlt ; Berhenti
Pada contoh di atas, or al, al tidak mengubah isi register AL, namun ia memaksa CPU untuk memperbarui status Zero Flag. Jika AL berisi nol, maka ZF menjadi 1, dan jz selesai akan memutus putaran loop.
Kenapa JZ Begitu Penting?
Tanpa instruksi seperti JZ, sebuah program akan berjalan seperti kereta api tanpa rem dan tanpa persimpangan. JZ memberikan kemampuan “mengambil keputusan” kepada komputer. Ia memungkinkan adanya:
- Looping: Mengulang proses hingga hitungan mencapai nol.
- Percabangan (If-Else): Menjalankan kode tertentu hanya jika kondisi terpenuhi.
- Validasi Data: Memastikan input tidak kosong sebelum diproses.
Kesimpulan
JZ adalah fondasi dari logika pengambilan keputusan di tingkat perangkat keras. Dengan memahami bagaimana instruksi ini berinteraksi dengan Zero Flag, seorang programmer dapat membangun alur program yang cerdas dan efisien. Meskipun terlihat sederhana, instruksi satu baris ini adalah kunci yang memungkinkan perangkat lunak kompleks dapat berjalan secara dinamis.
