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.