Mikroişlemci Mimarisi -5- Mikroişlemci Komutları

Mikroişlemcinin komutları işleyen bir eleman olduğunu ve komutlar olmadan bir iş yapmadığını söylemiştik. Bu komutlar mikroişlemcinin mimarisine göre değişkenlik göstermektedir. Mikroişlemci komutlarını bir cihazın üzerindeki anahtarlar gibi düşünebilirsiniz. Anahtarları, düğmeleri kullanarak bir iş yaptırdığımız cihaz yerine 0 ve 1leri kullanarak iş yaptırmaktayız. Bu aygıtın 0 ve 1leri belli bir sıraya göre değerlendirip bu sıraya göre farklı bir iş yapması gereklidir. Kaç adet farklı iş yapacağı ise mimariye bağlı olup mikroişlemci tasarlanırken karar verilmektedir. Bazı mikroişlemciler 30-35 komut çalıştırabilirken bazıları yüzlerce komuta sahip olabilir. Bu mikroişlemcinin kullanım alanına ve gelişmişliğine göre de değişiklik göstermektedir. Hangi mimari olursa olsun mikroişlemcilerin temel komutları neredeyse hiç değişmemektedir. Mikroişlemci komutlarını şu şekilde sınıflandırabiliriz.

  • Veri Transfer Komutları
  • Aritmetik Komutlar
  • Mantıksal Komutlar
  • Program Kontrol ve Dallanma Komutları
  • Makine Kontrol Komutları
  • Bit Bazlı Komutlar

Bu komutları anlatabilmek için zengin bir komut kümesine sahip olan bir mimariyi tercih etmek istedim. Bunun için 135 komuttan oluşan AVR mimarisi üzerinden bu komutlara örnek vereceğim.

Veri Transfer Komutları

Bu komutlar bir veriyi belli bir kaynaktan alıp belli bir hedef noktasına sevk etmek için kullanılır. Veri bir yazmaçtan bir yazmaca aktarılacağı gibi bellekten yazmaca veya yazmaçtan belleğe aktarılabilir. Bazı mikroişlemcilerde akümülatörden belleğe ve bellekten akümülatöre veri aktarma komutları da mevcuttur. Ayrıca yığın verisine yönelik transfer komutlarını da görebiliriz. Veri transfer komutlarının sadece OKU ve YAZ komutlarından ibaret olmaması mimarinin sınırlandırmasıyla beraber performansa yönelik olarak artırılmış olmasından da kaynaklanabilir. Bazı komutlarda belli bir sabit değeri yazmaçlara aktarırız. Şimdi veri transferine dair örnek AVR komutlarına bakalım,

MOV – Pek çok işlemcide mevcut olan ve Assembly dilinde “Move” kelimesinin kısaltması olarak tabir edilen MOV komutu iki yazmaç arasında veri transferini sağlamaktadır. En temel veri transferi komutu dememiz mümkündür.

LDI – Belirli bir yazmaca belirlediğimiz sabit bir değeri transfer etmeye yarar. Örneğin R1 yazmacına 0x55 değerini yazdırmak istiyorsak bunu kullanırız.

LDS – LoaD direct from data Space olarak ifade edilen bu komut veri hafızasındaki (RAM bellek) bir hücredeki veriyi genel maksatlı yazmaçlardan birine yüklemek için kullanılır.

LD – “Load” yani yükleme olarak tabir edilen komuttur. Aldığı operandlar yani işlem yapacağı değerlere göre farklı çalışabilir. Temel okuma komutudur.

ST – “Store” yani saklama olarak tabir edilen komuttur. Bu da temel yazma komut olarak kullanılır.

Aritmetik Komutlar

Adından da anlayacağımız üzere matematik işlemlerini gerçekleştiren komutlardır. Bu komutlar temel olarak dört işlem komutları olsa da bazıları işaretli bazıları ise eldeli işlem yapmaktadır. Ayrıca sıfırlama, artırma, azaltma gibi matematiksel komutları da bunun içerisine dahil edebiliriz.

ADD – Bu komut iki yazmaçtaki değeri toplar ve sonuç değerini ilk yazmaca yazdırır.

SUB – Bu komut iki yazmacı giriş değeri olarak alır ve çıkarma işlemine tabi tutar. Elde edilen sonuç tekrardan yazmaca yazılır.

CLR – Bu komut bir yazmacı sıfırlamaya yarar. Komut işletildikten sonra bütün bitler sıfır olduğu için değeri de sıfır olacaktır. Hesap makinesindeki CE fonksiyonuna benzer görevi vardır.

INC – Bu bir yazmaçtaki veriyi bir artırmaktadır. C ve C++’da olduğu gibi diğer yüksek seviye programlama dillerindeki ++ operatörünün kaynağı bu komuttur. Yine pek çok yüksek seviye dildeki ögelerin kaynağını bu seviyede görmemiz mümkündür.

Mantık Komutları

Bu komutlar temel mantıksal işlemleri yerine getiren komutlardır. Mantık işlemleri dijital elektroniğin olmazsa olmazı olduğu gibi mikroişlemcilerin ve bilgisayar mimarisinin de en sık kullanılan işlemleridir.

AND – İki yazmacın bitlerini AND işlemine tabi tutarak sonucu tekrar yazar.

OR – İki yazmacın bitlerini OR işlemine tabi tutarak sonucu tekrar yazar.

EOR – İki yazmacın bitlerini XOR işlemine tabi tutarak sonucu tekrar yazar.

Burada NOT işlemine dair bir komut yer almasa da bunu EOR komutu ile yapmamız mümkündür. Buna dair komutu aşağıdan inceleyelim.

Burada XOR işleminin özelliği sayesinde iki veriyi XOR işlemine tabi tutarak bir verinin bütün bitlerini tersleme imkanımız olur. Bunun gibi pek çok komutun ince özelliklerini kullanarak programcılık yeteneği ile farklı işlerde kullandırabilmemiz mümkündür. Bu komutların az olduğu durumda daha sık yapılan bir işlemdir.

Program Kontrol ve Dallanma Komutları

Bu komutlar tamamen program sayacı ve program akışının kontrolü ile alakalı komutlardır. Bu komutlar yüksek seviye dillerin bazılarında etiket bazılarında ise fonksiyon olarak karşımıza çıksa da prensibinin çok değişmediğini görmekteyiz. Burada bazı komutlar kısa döngüler için kullanılmaktadır. Bazı komutlar ise program hafızasının bir ucundan diğer ucuna bizi götürebilmektedir. Bu döngüye girip dallanma faaliyeti belli şartlara göre sağlanmaktadır.

JMP  – Jump ifadesinin kısaltılmış hali olup program hafızasında belli bir noktaya program akışını atlatmak için kullanılır.

RET – Girilen döngüden dönme komutudur. Return ifadesinin kısaltılmış halidir.

BREQ – Eğer şartlar eşitse döngüye devam etmeyi sağlayan bir şart komutudur. Bu yüksek seviye dillerde döngü şartı içindeki mantık operatörleri ile temsil edilmektedir.

Makine Kontrol Komutları 

Bu komutlar program ve veriler ile alakalı olmayıp mikroişlemcinin denetimine dair komutlardır. Herhangi bir operand yani yan veri almayıp tek bir komut şeklinde işletilmektedir.  Kontrol komutları mimariye göre büyük değişiklik gösterebilir.

NOP – “No Operation” deyiminin kısaltılmışı olup hiçbir işlem yapmama komutudur. Mikroişlemci hiçbir işlem yapmadan bir saat çevirimi kadar bekler.

SLEEP – Adından da anlaşılacağı üzere mikroişlemciyi uyku moduna sokan komuttur.

WDR – Bekçi zamanlayıcısını sıfırlamaya yarayan komuttur.

Bit Bazlı Komutlar

Bu komutlar bit işlemleri için pratik komutları barındırmaktadır. Bunlardan bazıları bir biti bir yapma, bir biti sıfırlama, sola kaydırma, sağa kaydırma, nibble (4 bitlik veri) değiştirme ve durum yazmacındaki bitleri denetleme şeklindedir. Bu işlemlerin C veya C++ dillerinde bitwise operatörler ile yapıldığını görürüz.

SEI – Durum yazmacındaki I bitini 1 yaparak kesmeleri etkinleştirir.

SBI – Seçeceğimiz yazmacın seçtiğimiz bir bitini bir yapar.

LSR – Seçili yazmacı belirlenen adım kadar bit bazlı sağa kaydırır.

LSL – Seçili yazmacı belirlenen adım kadar bit bazlı sola kaydırır.

Burada komutların önemli bir özelliği rastgele harflerden oluşmayıp belli bir kelime ya da kelime grubunun harflerinin bir araya getirilmesiyle meydana geldiğini görmekteyiz. Bu Assembly dilinin bir özelliğidir. Assembly makine dilinin alfanümerik sembollerle ifade edilmesinden meydana gelir. Normalde bu dediğimiz komutlar mikroişlemcide harflerle ifade edilmeyip opcode adı verilen 1 ve 0 lardan oluşan belli bir dizilime göre yer almaktadır.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

 

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.