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.