ARM Assembly Komut Seti Mimarisi: Giriş

Önceki bölümlerde ARM firmasını ve ARM işlemcileri tanıdık, ARM Cortex-M işlemci ailesini daha yakından inceleyerek temel yapılarını öğrendik. ARM mimarisini daha iyi anlayabilmek adına işin en temelinden başlamanın, yani ARM assembly komut seti mimarisini tanımanın bizler için çok yararlı olacağını düşünüyorum. Fakat hepsinden önce, gelin assembly kavramının ne olduğuna bakalım.

Assembly Nedir?

Genellikle asm olarak kısaltılan assembly, dildeki komutlar ile mimarinin makine kodu arasında çok güçlü bir uyuşmanın olduğu düşük seviyeli programlama dilidir. Diğer bir ismi sembolik makine kodu olan assembly, aslında tek bir dil değildir. Her bir assembly dili belirli bir bilgisayar mimarisi için tasarlanmıştır. Bu nedenle her bilgisayar mimarisinin assembly dili kendisine özeldir.

Assembly dilleri eskiden çok fazla kullanılmaktaydı. Cihaz sürücüleri, alt seviyeli gömülü sistemler ve gerçek zamanlı uygulamalar gibi doğrudan donanım manipülasyonunun gerektiği uygulamalarda veya anormal performans hususları söz konusu olduğu zamanlarda kullanılmasınının dışında, günümüzde yerini C/C++, Python gibi yüksek seviyeli dillere bırakmıştır.

Assembler

Assembly kodları, assembler adı verilen yardımcı programlar ile çalıştırılabilir makine kodlarına dönüştürülür. Bu dönüştürme işlemi assembling olarak adlandırılmaktadır.

Bir assembler programı, işlemler için anımsatıcı (mnemonic) ve sözdizimi kombinasyonlarını ve adresleme modlarını sayısal eşdeğerlerine çevirerek object kodunu oluşturur. Bu gösterim tipik olarak bir operation kodunu (opcode) ve diğer kontrol bitlerini ve verilerini içerir. Assembler ayrıca sabit ifadeleri hesaplar, bellek yerleri ve diğer elemanlar için olan sembolik isimleri çözümler. Sembolik isimlendirme, assembler programlarının önemli bir özelliğidir. Bizleri program değişikliklerinden sonra sıkıcı hesaplamaları yapmaktan ve manuel adres güncellemelerinden kurtarır.

Genel Dil Tasarımı

Assembly dillerindeki komutlar C/C++, Python gibi yüksek seviyeli dillerin aksine genellikle oldukça basittir. Bir assembly komutu genel olarak bir opcode ve işlem faktörlerinden (operand) oluşur. Komutların pek çoğu tek bir değeri veya değer çiftini belirtir. Bir assembly komutu genellikle doğrudan gerçekleştirilebilir bir makine dili komutuna karşılık gelmektedir.

Neden Assembly Öğrenmek Hala Önemli?

Assembly kullanımı, donanımı doğrudan yönetmeyi, performansla ilgili kritik sorunları gidermeyi ve işlemciler için özel talimatlara erişim sağlamayı mümkün kılmaktadır. Bu durum, bizlere işlemci mimarisini daha iyi kavramamızda çok yardımcı olmaktadır. Doğrudan assembly kullanılmasa da, sağlam bir temel oluşturmada çok önemli bir faktördür.

ARM Assembly Komut Setleri

ARM işlemciler, temelde 4 farklı komut seti desteklemektedir. Bu komut setlerini şu şekilde sıralayabiliriz:

  • Thumb komut seti, kod yoğunluğunu iyileştirmeyi amaçlamaktadır. Thumb komut uzunluğunun 16 bit olmasından dolayı çalıştırılabilir dosyalarının boyutu küçüktür. Operand’ların olasılıklarını azaltarak ve bir komuta erişilebilen yazmaçların sayısını sınırlayarak yer tasarrufu sağlanmaktadır. Komut belleği boyutunun küçültülmesi, bir çok gömülü sistem için maliyet ve güç tasarrufu açısından fayda sağlamaktadır
  • ARM32 komut uzunluğu 32 bittir ve Thumb komut setine göre daha fazla kodlama esnekliği sağlar. Daha fazla operand seçeneği, daha esnek bellek adresleme şemaları, daha büyük anlık sayılar ve daha fazla adreslenebilir yazmaç, 32 bitlik bir sözcükte kodlanabilir. Ayrıca, bir komut daha fazla işlem gerçekleştirebileceğinden veya daha fazla işlenen içerebileceğinden, ARM32 komutları Thumb komut setine göre daha hızlı çalışır fakat kod yoğunluğu dezavantajı vardır.
  • Thumb-2, ARM32 ve Thumb komut setleri arasında olağanüstü bir uyum sağlamaktadır. Kod yoğunluğu ve işlemci performansı arasındaki dengeyi optimize eder. 16 bitlik Thumb komutlarından ve 32 bitlik ARM32 komutlarının bir alt kümesinden oluşmaktadır. Thumb-2 komut setinin amacı, daha düşük kod yoğunluğu ile daha yüksek hız elde etmektir.
  • ARM64, genellikle 64-bit ARM işlemcilerin kullanıldığı masaüstlerinde ve sunucularda kullanılmaktadır. Komut uzunluğu anlaşılabileceği üzere 64 bittir.

Kaynaklar

  1. Wikipedia. Assembly language
  2. Zhu, Y. (2018) Embedded Systems with ARM Cortex-M Microcontrollers in Assembly Language and C
Share

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir