ARM işlemcisinde iki farklı komut seti vardır. Bunlar 32 bitlik ARM komut seti ve 16 bitlik THUMB komut setidir. Hafızanın yetersiz kaldığı gibi bazı durumlarda bu iki komut seti arasında geçiş yapmamız gerekebilir.THUMB komut setini seçmemiz bize hafızadan kazanç sağlayacaktır.Bu komut setinde komutlar 16 bitlik formatta saklanırken çalışma esnasında 32 bitlik ARM komutlarına dönüştürülürler.Bu mekanizma bize düşük hafızalı işlemcilerde bellek kazancı sağlar.THUMB komut seti ile %30 hafıza kazancımız olur fakat çalışma esnasında THUMB komutlarının ARM komutlarına genişletilmesi esnasında %40 lık bir performans kaybı söz konusu olur.Yani ARM komut seti %40 daha hızlı çalışmaktadır.
Örneğin yandaki şekilde yazdığım bir kodun hafıza kullanımını görüyorsunuz. Kod hafızanın %5.71 lik bir alanını kullanmaktadır ve boyutu 28.80Kbyte tır.Bu kod 32bitlik ARM modunda derlenmiştir. Şimdi derlemeyi THUMB modunya yapalım ve yukarda anlattığımız değişikliği gözlemleyelim.
Aşağıdaki şekilde kodun thumb modunda derlenmiş halini görüyorsunuz. Gördüğünüz gibi hafıza kullanımı %5.71 den %4.04'e inmiş, kod boyutu ise 28.80KByte tan 20.35Kb a düşmüştür.
Şimdi örneğe devam edelim ve microlib kütüphanesini kullanalım ve kodumuzu optimize edelim.MicroLIB kütüphanesi ARM mimari temelli projelerde standart C kütüphanelerine göre kodumuzun yüksek derecede optimize edilerek derlenmesini sağlamaktadır.Gömülü sistemler için hafıza kazancı sağlayarak avantaj oluşturmaktadır. Aşağıdaki şekilde görüldüğü gibi kod boyutumuz 18.54Kbye a düşmüş ve hafıza kullanımımız ise %3.68 e düşmüştür. Son haldeki kod boyutu ilk haldekine göre %35.625 daha küçüktür.Yazdığım kod son haliylede eksiksiz ve sorunsuz bir şekilde çalışmaya devam etmektedir. Mutlaka bir hız düşüşü vardır ama projeyi etkileyecek boyutta değildir ve bir insanın farkı anlaması imkansızdır.
Ayrıca bu iki komut setini aynı programda kullanmamız mümkündür.Bu çalışma şekline interworking denilmektedir. Bunun için derleyiciye kodun hangi komut setini kullanacağını belirtmemiz gerekmektedir. Bunu yapmanın bir kaç yolu vardır. Pragma ön işlemci direktifi ile hangi komut setini kullanacağımızı derleyiciye bildirebiliriz.Bildirdiğimiz satırın altındaki kodlar istediğimiz komut setini kullanarak çalışırlar.Ayrıca istediğimiz bir fonksiyonu istediğimiz komut setinde çalışacak şekilde bildirebiliriz.Aşağıda anlatılanlar gösterilmiştir.
#pragma THUMB
//Burdaki kodlar thumb komut setini kullanırlar.
#pragma ARM
//Burdaki kodlar arm komut setini kullanırlar.
void thumb_fonksiyonu(void) __thumb
{
//Kodlar thumb komut setini kullanacak.
}
int main(void) __arm
{
//Kodlar arm komut setini kullanacak.
thumb_fonksiyonu() //Thumb fonksiyonu çağrısı
...
}
ARM komut setinin diğer bir özelliğide her komutun şartlı olarak işletilebilmesidir. Geleneksel mikroişlemci modellerinde şartlı işletim sadece şartlı dallanma, bit set etme, bit test etme gibi bazı komutlarda uygulanmaktadır. ARM komut setinde operandın üst 4 biti CPSR saklayıcısındaki koşul durum kodları ile karşılaştırılmaktadır.Eğer eşleşme sağlanmassa komut pipeline’a NOP(no operation, işlem yapma) olarak geçilir ve işletilmez.
CPSR saklayıcısındaki koşul bitlerini etkileyecek veri işleme komutları çalıştırmamız mümkündür.İşlediğimiz komutun sonucuna bağlı olarak sıradaki işlemler çalışır veya çalışmaz.Bu şartlar veri ile işlem yapan MOV, ADD gibi temel assembler komutlarının başına önek olarak eklenebilir.Örnek olarak
EQMOV R1, #0x00800000
komutu 0x00800000 değerini R1 saklayıcısına, sadece son çalıştırılan veri işleme komutunun sonucu eşit ve CPSR saklayıcısındaki Z bitini set ettiyse atar.Bunun gibi önekler aşağıdaki şekildeki tabloda verilmiştir.
Bu mekanizmanın amacı şartlı işlemler yaparak dahi programın pürüzsüz bi şekilde pipeline akmasıdır.Eğer her seferinde dallanma veya atlama yapsaydık pipeline her seferinde boşaltılıp tekrar doldurulmaya başlayacaktı.Bu durumda çalışma hızımızı önemli bir şekilde etkileyecekti.