7. Dal (branch) komutları¶
Bunlar, yürütmenin genellikle bir etiketle belirtilen bir hedef konuma atlamasına neden olur (label() assembler direktifine bakın). Koşullu dallar ve it ve ite komutları, dalın yürütülüp yürütülmeyeceğini belirlemek için Application Program Status Register (APSR) N (negatif), Z (sıfır), C (elde) ve V (taşma) bayraklarını sınar.
Açığa çıkarılan assembler komutlarının çoğu (taşıma işlemleri dahil) bayrakları ayarlar, ancak değerlerin sınanmasını sağlamak için açık karşılaştırma komutları vardır.
Koşul bayraklarının anlamına ilişkin daha fazla ayrıntı karşılaştırma komutları bölümünde sağlanmıştır.
7.1. Belge kuralları¶
Gösterim: Rm R0-R15 ARM yazmaçlarını belirtir. LABEL label() assembler direktifiyle tanımlanan bir etiketi belirtir. <condition> aşağıdaki koşul belirteçlerinden birini gösterir:
eq Eşit (sonuç sıfırdı)
ne Eşit değil
cs Elde (carry) ayarlı
cc Elde (carry) temiz
mi Eksi (negatif)
pl Artı (pozitif)
vs Taşma ayarlı
vc Taşma temiz
hi > (işaretsiz karşılaştırma)
ls <= (işaretsiz karşılaştırma)
ge >= (işaretli karşılaştırma)
lt < (işaretli karşılaştırma)
gt > (işaretli karşılaştırma)
le <= (işaretli karşılaştırma)
7.2. Etikete dallanma¶
b(LABEL) Koşulsuz dal
beq(LABEL) eşitse dallan
bne(LABEL) eşit değilse dallan
bge(LABEL) büyük veya eşitse dallan
bgt(LABEL) büyükse dallan
blt(LABEL) küçükse dallan (<) (işaretli)
ble(LABEL) küçük veya eşitse dallan (<=) (işaretli)
bcs(LABEL) elde bayrağı ayarlıysa dallan
bcc(LABEL) elde bayrağı temizse dallan
bmi(LABEL) negatifse dallan
bpl(LABEL) pozitifse dallan
bvs(LABEL) taşma bayrağı ayarlıysa dallan
bvc(LABEL) taşma bayrağı temizse dallan
bhi(LABEL) daha yüksekse dallan (işaretsiz)
bls(LABEL) daha düşük veya eşitse dallan (işaretsiz)
7.3. Uzun dallar¶
Yukarıda listelenen dal komutları tarafından üretilen kod, PC’ye göreli olan dal hedefini belirtmek için sabit bir bit genişliği kullanır. Sonuç olarak, dal komutunun hedefinden uzak olduğu uzun programlarda assembler bir “branch not in range” (dal aralık dışında) hatası üretir. Bu, aşağıdaki gibi “wide” (geniş) varyantlarla aşılabilir:
beq_w(LABEL) eşitse uzun dal
Geniş dallar, komutu kodlamak için 4 bayt kullanır (standart dal komutları için 2 bayta karşılık).
7.4. Alt yordamlar (işlevler)¶
Bir alt yordama girerken işlemci, dönüş adresini bağlantı yazmacı (lr) olarak da bilinen r14 yazmacında saklar. Alt yordam çağrısından sonraki komuta dönüş, program sayacının (r15 veya pc) bağlantı yazmacından güncellenmesiyle gerçekleştirilir. Bu işlem aşağıdaki komutlar tarafından yürütülür.
bl(LABEL)
Yürütmeyi LABEL etiketinden sonraki komuta aktarır ve dönüş adresini bağlantı yazmacında (r14) saklar.
bx(Rm) Rm tarafından belirtilen adrese dallan.
Bir alt yordamdan dönmek için genellikle bx(lr) komutu verilir. İç içe alt yordamlar için, iç alt yordam çağrılarını gerçekleştirmeden önce dıştaki kapsamların bağlantı yazmacı (genellikle yığında) saklanmalıdır.