6. Karşılaştırma komutları¶
Bunlar iki argüman üzerinde aritmetik veya mantıksal bir komut gerçekleştirir, sonucu atar ancak koşul bayraklarını ayarlar. Tipik olarak bunlar, koşullu bir dallanma çalıştırmadan önce veri değerlerini değiştirmeden test etmek için kullanılır.
6.1. Belge kuralları¶
Gösterim: Rd, Rm, Rn R0-R7 ARM yazmaçlarını belirtir. imm8, 8 bit genişliğinde bir ani (immediate) değeri belirtir.
6.2. Uygulama Programı Durum Yazmacı (APSR)¶
Bu, koşullu dallanma komutları tarafından test edilen dört bit içerir. Tipik olarak koşullu bir dallanma birden fazla biti test eder, örneğin bge(LABEL). Koşul kodlarının anlamı, bir aritmetik komutun işlenenlerinin işaretli mi yoksa işaretsiz tamsayılar olarak mı görüldüğüne bağlı olabilir. Dolayısıyla bhi(LABEL) işaretsiz sayıların işlendiğini varsayarken, bgt(LABEL) işaretli işlenenleri varsayar.
6.3. APSR Bitleri¶
Z (sıfır)
Bu, bir işlemin sonucu sıfır olduğunda veya bir karşılaştırmanın işlenenleri eşit olduğunda ayarlanır.
N (negatif)
Sonuç negatifse ayarlanır.
C (elde)
Bir toplama, sonuç MSB’den taştığında elde bayrağını ayarlar, örneğin 0x80000000 ve 0x80000000 toplandığında. İkiye tümleyen aritmetiğinin doğası gereği bu davranış çıkarmada terstir; bir ödünç (borrow), elde bitinin temizlenmesiyle gösterilir. Dolayısıyla 0x10 - 0x01, elde bitini ayarlayacak olan 0x10 + 0xffffffff olarak çalıştırılır.
V (taşma)
Taşma bayrağı, ikiye tümleyen sayısı olarak görülen sonuç, işlenenlere göre “yanlış” işarete sahipse ayarlanır. Örneğin 0x7fffffff değerine 1 eklemek taşma bitini ayarlar çünkü sonuç (0x80000000), ikiye tümleyen tamsayı olarak görüldüğünde negatiftir. Bu örnekte elde bitinin ayarlanmadığına dikkat edin.
6.4. Karşılaştırma komutları¶
Bunlar APSR (Uygulama Programı Durum Yazmacı) N (negatif), Z (sıfır), C (elde) ve V (taşma) bayraklarını ayarlar.
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Koşullu çalıştırma¶
it ve ite komutları, bir etikete gerek olmadan sonraki bir ila dört komutu koşullu olarak çalıştırma yöntemi sağlar.
it(<condition>) If then
<condition> doğruysa sonraki komutu çalıştırır:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
<condition> doğruysa sonraki komutu çalıştırır, aksi takdirde onu izleyen komutu çalıştırır. Dolayısıyla:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Bu, sonraki dört komuta kadar olanın çalıştırılmasını kontrol etmek için genişletilebilir: it[x[y[z]]] burada x,y,z=t/e; örneğin itt, itee, itete, ittte, itttt, iteee, vb.