7. Instruksi cabang¶
Instruksi-instruksi ini menyebabkan eksekusi melompat ke lokasi target yang biasanya ditentukan oleh label (lihat direktif assembler label()). Cabang kondisional dan instruksi it dan ite menguji flag N (negatif), Z (nol), C (carry) dan V (overflow) dari Application Program Status Register (APSR) untuk menentukan apakah cabang harus dieksekusi.
Sebagian besar instruksi assembler yang terekspos (termasuk operasi pemindahan) menetapkan flag tetapi ada instruksi perbandingan eksplisit untuk memungkinkan nilai-nilai diuji.
Detail lebih lanjut tentang makna flag kondisi disediakan di bagian instruksi perbandingan.
7.1. Konvensi dokumen¶
Notasi: Rm menunjuk register ARM R0-R15. LABEL menunjuk label yang didefinisikan dengan direktif assembler label(). <condition> menunjukkan salah satu penentu kondisi berikut:
eq Sama dengan (hasil adalah nol)
ne Tidak sama
cs Carry diset
cc Carry dihapus
mi Minus (negatif)
pl Plus (positif)
vs Overflow diset
vc Overflow dihapus
hi > (perbandingan tidak bertanda)
ls <= (perbandingan tidak bertanda)
ge >= (perbandingan bertanda)
lt < (perbandingan bertanda)
gt > (perbandingan bertanda)
le <= (perbandingan bertanda)
7.2. Cabang ke label¶
b(LABEL) Cabang tanpa kondisi
beq(LABEL) cabang jika sama
bne(LABEL) cabang jika tidak sama
bge(LABEL) cabang jika lebih besar dari atau sama dengan
bgt(LABEL) cabang jika lebih besar dari
blt(LABEL) cabang jika kurang dari (<) (bertanda)
ble(LABEL) cabang jika kurang dari atau sama dengan (<=) (bertanda)
bcs(LABEL) cabang jika flag carry diset
bcc(LABEL) cabang jika flag carry dihapus
bmi(LABEL) cabang jika negatif
bpl(LABEL) cabang jika positif
bvs(LABEL) cabang jika flag overflow diset
bvc(LABEL) cabang jika flag overflow dihapus
bhi(LABEL) cabang jika lebih tinggi (tidak bertanda)
bls(LABEL) cabang jika lebih rendah atau sama (tidak bertanda)
7.3. Cabang jauh¶
Kode yang dihasilkan oleh instruksi cabang yang terdaftar di atas menggunakan lebar bit tetap untuk menentukan tujuan cabang, yang relatif terhadap PC. Akibatnya, dalam program panjang di mana instruksi cabang jauh dari tujuannya, assembler akan menghasilkan kesalahan "branch not in range". Ini dapat diatasi dengan varian "lebar" seperti
beq_w(LABEL) cabang jauh jika sama
Cabang lebar menggunakan 4 byte untuk mengkodekan instruksi (dibandingkan dengan 2 byte untuk instruksi cabang standar).
7.4. Subrutin (fungsi)¶
Ketika memasuki subrutin, prosesor menyimpan alamat pengembalian di register r14, juga dikenal sebagai link register (lr). Pengembalian ke instruksi setelah pemanggilan subrutin dilakukan dengan memperbarui program counter (r15 atau pc) dari link register. Proses ini ditangani oleh instruksi-instruksi berikut.
bl(LABEL)
Memindahkan eksekusi ke instruksi setelah LABEL sambil menyimpan alamat pengembalian di link register (r14).
bx(Rm) Cabang ke alamat yang ditentukan oleh Rm.
Biasanya bx(lr) digunakan untuk kembali dari subrutin. Untuk subrutin bersarang, link register dari lingkup luar harus disimpan (biasanya di stack) sebelum melakukan pemanggilan subrutin dalam.