G8051, Intel’in hizmete sunduğu bir mikrodenetleyici (microprocessor) çeşididir. Eski bir ürün olmasına rağmen temel yapısı ve mimarisi sebebiyle günümüzde mikrodenetleyicilerin anlaşılması için örnek gösterilmektedir. Bugünkü blog yazımda önce Assembly’den minikçe bahsedip, 8051’e giriş yapacağız.1280px-kl_intel_p8051

Intel 8051 görünümü

CPU yani türkçe olarak Merkezi İşlem Birimi, bilgisayarın en önemli bileşenidir.Bu bileşen aritmetik ve mantıksal işlem yapma özelliğine sahiptir. CPU’nun binary değerlerle uğraşırken çok daha hızlı çalıştığını söyleyebiliriz. Tam tersi olarak insanlar için bilgisayarda kodlama yaparken 0 ve 1’lerle uğraşmak oldukça zor ve karmaşıktır. Bilgisayarın anlamakta güçlük çekmediği, 0 ve 1’lerden oluşan bu dile Makine Dili (Machine Language) denir. Assembly dilleri, insanlar makine dillerinde geçen anlamlı komutları hatırlayamadıkları için geliştirilmiştir. İngilizcede “mnemonic” terimi, bilgisayar bilimlerinde ve mühendislik kaynaklarında bu makine kodlarının kolayca hatırlanması için kullanılan kısaltmalar anlamına gelir.

Assembly dili, düşük seviyeli dillere (low level language) örnektir; çünkü direk olarak CPU’nun yapısıyla iletişime geçebiliyor bir diğer deyişle makine diline yakın bir dildir. Buna karşılık günümüzde sıkça kullandığımız diller C#, Java, C++ gibi dillerin CPU ile iletişime geçmesine gerek yoktur. Bu sebeple yüksek seviyeli dillere (high level language) örnektirler.

Assembly dilinde komutlar genellikle 4 alan içerirler;

[label :] mnemonics [operands] [; comments]

Label (etiket) ve Comment (yorum) alanları geliştiricinin isteğine göre veya programın ihtiyacı dahilinde kullanılırlar. Örneğin bir loop yazacaksak, Assembly’de label’a bir isim vermeli ve gerekli komutla o label’ı çağırmamız gerekir. İyi bir yazılımın temel taşı olan yorumları unutmamalıyız ki, bir başkası kodumuzu okurken kolaylıkla anlayabilsin 🙂

Loop ve Label kullanımı için minik bir örnek:

LOOP:
ADD A, #0F2
ADD A, #4A3
MOV R0, #2B1
JMP LOOP

Burada “JMP” komutu ile döngü bitiminde tekrar LOOP etiketinin başladığı yere atlıyoruz ve işlemlerimize tekrardan devam ediyoruz. Dikkat edersek etiketi tanımladıktan sonra “:” işaretini kullanıyoruz. Aynı zamanda Assembly’de bir satıra yorum eklemek istiyorsak “;” işaretini kullanmamız gerekir.

Mnemonics olarak adlandırılan alan Assembly komutlarına örnektir. Burada Binary makine kodlarını insanların anlayabileceği şekilde gösteriyoruz. Yukarıda vermiş olduğumuz örnekte bordo ile gösterilen “ADD”, “MOV”, “JMP” komutları Assembly komutlarına birer örnektir.

Operands kısmını ise işlenen terimler olarak adlandırabiliriz. Yine vermiş olduğumuz örnekte #0F2, #4A3 ve #2B1 hexadecimal değerlerini görüyoruz, bunlar kod satırında yer alan operandlardır.

CPU içerisinde, yazmaçlar (registers) bilgiyi kısa süre saklamak için kullanılırlar.8051 içerisinde çeşitli ve değişik boyutlarda yazmaç bulundurur. 8051’de 8 bitlik yazmaçlara örnek verirsek bunlar A (Accumulator), B, R0, R1,…,R7.

073109_1501_insidethe802

8051’de yer alan 8 bitlik yazmaçlardan bazıları

16 bitlik yazmaçlara örnekler ise DPTR (Data Pointer) ve PC (Program Counter).

073109_1501_insidethe803

8051’de yer alan 16 bitlik DPTR ve PC registerlarının görünümü

MOV Komutu

MOV komutu, verinin bir yerden diğer bir yere kopyalanmasını sağlar. Assembly’de şu formatta kullanılır:MOV destination, source


>>MOV A, RO ; Burada register RO'da bulunan değeri Akümülatör'e atıyor.
>>MOV A, #55H ; Akümülatör'e #55H hex değeri kopyalandı
>>MOV R1, A ; Akümülatör'den R1 registerına değer kopyalandı.


>>MOV R1, R2 ; Bu komut gerçekleşemez, çünkü registerdan registera aktarım yapılamaz. Haliyle değerler akümülatöre aktarılır ondan sonra diğer registera kopyalanır.

Yukarıda verilen örneklerde görüldüğü gibi, 8051’de değerler direk olarak herhangi bir registera kopyalanabilir. (MOV A, #55H’deki gibi) Kopyalanan bu değerlere “Immediate Value” diyoruz ve “#” işaretiyle gösterilirler.

Hexadecimal değerleri kullanırken dikkat etmemiz gereken minik bir nokta var, örnekle anlatırsak:

>>MOV R5, #0F9H ; Burada aslında kopyalanmak istenen değer 'F9H' ancak hex değeri olarak kullanmak istediğimiz için başına 0 ekliyoruz ki komut çalıştırılırken hata vermesin.

ADD komutu

Add komutu ekleme-toplama yapmak istediğimizde kullanılır. Assembly dilinde formatı şu şekildedir:


>>ADD A, #34H ; Akümülatöre 34 hex değerini ekliyoruz. Bu işlemde eklenen "#34H" değeri Immediate Operand adını alıyor. Çünkü direk olarak akümülatöre eklendi.
>>ADD A, R0 ; Burada R0 registerının değeri Akümülatör'de bulunan değer üzerine ekleniyor

Yerleşecek değerin registerdan büyük olması sistemde hata veriyor. Bu sebeple saklama alanlarının boyutunu bilmek oldukça önemli. Genel olarak Assembly’de işlem yapacak mühendislerin, registerların boyutlarını araştırması ve ona göre kodlama yapması gerekir.

Advertisements