Assembly “Low Level” yani “Düşük Seviye” bir dildir. Burada düşük seviye olmasından kastım, assembly dilinin makine diline en yakın ve en temel programlama dili olmasıdır. Yani C, C++, Fortran gibi  programla dilleri aslında Assembly dili ile yazılmıştır. Bu yüzden Assembly programlama dillerinin babası olarak görülebilir.

Assembly

Bana ” C, C++ ve benzeri diller dururken Assembly kullanmak mantıklı mıdır? ” diye bir soru sorulacak olsa, “Yerine göre değişir.” derdim. Çoğu zaman da geniş kütüphanelere sahip diller dururken Assembly kullanmak mantıksız geliyor.  Fakat işin temel prensiplerini öğrenmek adına ya da şöyle söyleyeyim; “Bir programcı olmak adına”, Assembly dilini bilmek şart.  Çünkü Assembly Dilini kullanabilen birisinin bilgisayarın CPU, RAM, I/O portları gibi temel bileşenlerinin işleyişini ve verilerin birbiri ile ilişkisinin nasıl olduğunu bilmesi gerekir.  Yani Assembly, aslında sadece programlama bilgisinin dışında dijital elektronik bilgisi de gerektiriyor.  Bu durumda Assembly bilen birisi, karşılaştığı problemler karşısında en donanımlı bilgiye sahip olmuş olacaktır.

Dediğim gibi Assembly diline başlamadan önce CPU’nun yapısını ve çevresel üniteleri bilmek gerekiyor.  Bu yüzden ilk başta şu yazıyı okumanızı öneririm;

Mikroişlemci Mimarisi

Şimdi Assembly dili ile CPU nun içerisindeki ve dışarısındaki üniteleri somut olarak kullanacağımız için aşağıdaki şemaya göz atmak iyi olacaktır. CPU verileri işlemek için kendi içerisinde bulunan bir çok dijital kaydediciye ve hafızaya ihtiyaç duyar. Tüm talimatlar ilk olarak bir kaydediciye oradan da RAM’a yazılıp tekrar okunur.   Veriler RAM’a kaydedilmeden önce “Working Register” ismindeki 8 bitlik çalışma kaydedicisine kaydedilir. Oradan da Ram’in istenilen adresine kaydedilir.

mikroişlemci

 

Working Register içerisine bir sayı yazmak için assembly de MOVLW(Move Literal Working) komutu kullanılır.

MOVLW 28H  komutu “Working Register” içerisine  onaltılık tabanda 28 sayısını kaydeder.   Ve beraberinde MOVWF(Move Working to File) komutu ile RAM in istenilen adresine working register içerisindeki bilgi kaydedilir.

Mesela MOVWF 0x00 = komutu ile RAM’in ilk adresine “working Register” içerisindeki 28 sayısı kaydedilir.

 

Ayriyeten diğer bir önemli kaydedici “Status Register” ismindeki bir kaydedicidir ki burada da işlemcinin  ALU(Aritmetic Logic Unit) biriminde yapılan işlemlere dair bazı belirteç bilgiler kaydedilir. Mesela yapılan işlemlerin sonucunun negatif mi çıktığı, sıfır mı çıktığı, ya da herhangi bir overflow durumu söz konusu mu olduğu gibi bilgiler bu kaydediciye kaydedilir.

Şimdi RAM kaba taslak iki kısma ayrılmıştır. Birincisi SFR(Special Function Register) ikincisi ise GPR(General Purpuse Register). RAM’in istediğiniz adresine verileri kaydetmek istediğinizde RAM in General Purpose Register bölümünü kullanırsınız. Special Function Register  kısmı giriş çıkış portları, kesmeler ve kontrol verileri  gibi mikrodenetleyicinin ve ya işlemcinin özel modüllerinin kullandığı ve dışarıdan müdehale edilemeyen bölümdür.

RAM

 

Mesela PORTB,  giriş ve ya çıkış değerleri RAM in SFR kısmında bir adreste kaydedilir.  Fakat siz SFR kısmındaki bu PORTB adresini de EQU direktifi ile değiştirebilirsiniz.    Mesela; PORTB EQU 0x05  direktifi ile PORTB adresini RAM in 5. adresine taşımış oluruz.

Şimdi kısa bir program yazalım. Aşağıdaki Programı inceleyelim. Bu program PORTA nın birinci biti 1 olduğunda PORTB nin 0. bitini 1 yapıyor.

İlk başta LIST direktifi ile Pic seçtik.  Bu direktif, içerisinde kaynak binary kodları ve kullanılan Pic’in memory lokasyonlarını barındırır. Bu yüzden bu direktifi vermek zorundayız.  Daha Sonra EQU direktifi ile SFR içerisinde bulunan bazı özel lokasyonların yeni adreslerini belirledik.

CLRF(Clear File Reg) direktifi karşısına yazılan adresteki tüm bitleri “0” yapmaya yarar. Böylece PORTB uçlarını komple “0” yapmış olduk.  Burada PORTB kaydedicisi çıkış veya giriş bilgilerini tutan kaydedici iken TRIS kaydedicileri portların giriş mi yok sa çıkış mı olduğu bilgilerini tutar. Böylece CLRF TRISB  komutu TrısB kaydedicisinin içerisindeki tüm bitleri sıfırladığı için tüm port çıkış olur. Daha sonra MOVLW komutu ile ilk önce Working Register’a daha sonra da MOVWF komutu ile TRISA kaydedicisine h’ff’ değeri kaydedilmiştir. Bu değer binary olarak 8 bit “1” dir. Yani A portu komple giriş olarak ayarlanmıştır.

BTFSC (Bit Test File Skip If Clear ) komutu isminden de anlaşılacağı üzere Port A kaydedicisinin 1. bitini kontrol et ve eğer kaydedicinin 1. biti “0” ise bir sonraki GOTO TEST_PORTA komutunu atla anlamına gelir ki bu da bu durum söz konusu olana kadar yani PORTA kaydedicisin 1. biti “1” olana kadar sürekli kontrol etmemizi sağlar.

Ve eğer PORTA nın 1. biti “1” olursa program BSF(Bit Scan Forward) komutunu okuyarak PORTB  kaydedicisin 0. bitini “1” yapar. Daha sonra ise program sonsuz döngüye girer.

 

İçerik Sponsoru: