AVR Assembly -4- LDI ve ADD Komutları

Artık AVR Assembly programlamaya başlıyoruz. Bu noktaya gelmeden önce önceki 3 dersi muhakkak okumanız gerektiği gibi AVR mimarisi yazı dizisini de okumanız gereklidir. Aşağıdaki bağlantıdan bunları okuyabilirsiniz.

http://www.lojikprob.com/embedded/atmel-avr-mimarisi-1-mikrodenetleyicilere-ve-avr-mimarisine-giris/

http://www.lojikprob.com/embedded/atmel-avr-mimarisi-2-avr-mikrodenetleyicilerinin-ic-yapisi/

http://www.lojikprob.com/embedded/atmel-avr-mimarisi-3-avr-mikroislemcisi-cpu/

Genel maksatlı yazmaçlardan önceden bahsetmiştik. Şimdi bu yazmaçları kullanarak ilk programımızı yazalım. İşlemci komut seti kılavuzunu da önceki derste verdiğim için başka bir kaynağa ihtiyacımız olmayacak. Assembly programlamada başlıca kaynaklar datasheet ve işlemci komut kümesi kılavuzudur. Bunlardan başka çevirici programa ve dile ait ufak ayrıntılar vardır. Bunları da yeri geldiğinde anlatacağız.

LDI Komutu

LDI komutu 8 bitlik veriyi genel maksatlı yazmaçlara yazmakta kullanılır. Komutun söz dizimi şu şekildedir.

Burada LDI komutu “Load Immediate” yani “Hemen Yükle” deyiminin kısaltılmasından meydana gelmiştir. İngilizce bilenler ezberlemek yerine böyle sembolize ederse daha kolay öğrenebilir.

Rd ise ( d = destination) yani hedef yazmacının adıdır. Buraya yazmacın adını yazarız.

K ise sabit olup 0-255 arası onluk ve 00-FF arası on altılık sayı olabilir.

Assembly dilinde onluk sayılar başına veya sonuna bir takı getirilmeden düz bir şekilde yazılır. On altılık sayılar ise $ veya 0x takısı ile beraber yazılır. “$4F, 0xFF” örneklerinde gördüğümüz gibi yazılan on altılık sayıları C programcısı olarak 0x formatında yazmamız daha iyi olacaktır. Şimdi  komuta ait birkaç örnek verelim ve öteki komuta geçelim.

Görüldüğü gibi Assembly dilinde açıklama eklemek gerektiğinde ; işaretini  kullanıyoruz ve ardından aynı satırda açıklamayı yapıyoruz. C dilinde bu “//” işareti ile yapılıyordu.

Bu yazmaçlara veri kaydetmekle bu veriler üzerinde işlem yapabilme imkanımız olur. R0-R15 yazmaçlarına LDI ile veri yükleyemeyiz. Ayrıca LDI ile 8 bitten fazla veri kaydetme imkanımız yoktur. 0x99, 500 gibi veriler kaydedilmez ve çevirici tarafından hata mesajı verilir. 

Burada değerin düz bir şekilde yazıldığını görmekteyiz. Onluk sayıları bu şekilde kaydedebiliriz. Görüldüğü gibi LDI komutu sadece genel maksatlı yazmaçların bir kısmına veri kaydetmeye yarıyor. Bu kaydettiğimiz veri ise bir “sabit değer” olmak zorunda.

Bu komutu anlamak için bu kadar bilgi vermemiz yeterli olacaktır. Ama sizi şundan da haberdar etmemiz gerekir. AVR mikrodenetleyicileri diğer mikrodenetleyicilerden ayıran en büyük özelliklerden biri üreticinin yeni başlayanlar için yeterli ve anlaşılır kaynağı sağlaması ve bir bilgi paylaşımı topluluğunu meydana getirmesidir. Böylelikle AVR mikrodenetleyicileri diğer onlarca farklı mikrodenetleyicilere göre çok daha rahat öğrenebiliriz. AVRfreaks gibi uzun yıllardır canlılığını koruyan topluluk olduğu gibi programlamak için eksiksiz kaynağımız vardır. Aşağıdaki bağlantıdan LDI komutunun açıklamasına bir bakalım.

https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_LDI.html

Görüldüğü gibi LDI komutu hakkında bütün bilgiler burada özet olarak yer almaktadır. Aslında sürekli olarak faydalandığımız ve farklı kaynaklardan bahsetmemizin sebebi tek kaynağa bağlı kalan bir anlayışı tek etmenize yöneliktir. Bu anlayış yüzünden piyasada eğitim istismarcıları dolaşmaktadır.

ADD Komutu

“Add” İngilizce “eklemek” demektir. Buradan komutun toplama işlemi yaptığınız anlayabilirsiniz. Bu bildiğimiz toplama işlemini yapan komuttur. Mikroişlemcinin ALU adını verdiğimiz aritmetik mantık biriminde toplama, çıkarma, çarpma, AND, OR, XOR gibi mantıksal işlemlerin yapıldığından bahsetmiştik. İşte o aritmetik işlemlerin en temeli de ADD işlemidir. Mikrodenetleyiciler içlerinde “Adder” adı verilen devreleri bulundurmaktadır. Bu devreler iki yazmaçtaki veriyi alır ve mantık kapıları vasıtasıyla toplama işlemine tabi tutar ve sonucu çıkış olarak verir. Sonuç verisi AVR mikrodenetleyicilerde üzerine veri eklenen yazmaçta saklanır. Yani toplama işlemi yaptığımızda her zaman x = x + y şeklinde işlem yapmış oluruz.

ADD komutunun söz dizimi şu şekildedir.

Burada ADD komutu toplama işlemini yapan komuttur. Rd ise hedef yazmaç olup sonuç değeri öteki yazmaçla kendi değerinin toplamının ardından kendi üzerine yazılır. Rr ise kaynak değer yazmacı olup değeri Rd yazmacının üzerine eklenir. Burada işlemlerin sağdan sola yapıldığına çok dikkat edin. C dilinde de atama yani “=” operatörü sağdan sola işlem yapmaktadır. C dilinde Assembly diline ait benzerlikleri görmemiz mümkündür.

Şimdi örnek bir ADD komutunun işletilişini görelim.

Bu komut R20 yazmacının değerini R21 yazmacı üzerine ilave eder. Yani R21 = R21 + R20 işlemi yapılmış olur. Burada iki yazmacın da sonucun da 8-bit olduğuna dikkat edelim. Eğer değerler fazla gelirse taşma gerçekleşir ve sıfırdan itibaren kalan değer sonuç = sonuç – 0xFF şeklinde yazılmaya başlar. Bu durumda elde edilen sonuçtan başka bir elde değeri gereklidir. Bu da SREG yazmacındaki C bitinin bir (1) olmasıyla anlaşılır. Şimdi örnek işlemlerde bunu daha rahat görmemiz mümkündür.

Burada öncelikle R20 yazmacına 0x10 değer sabiti yüklenir. Sonrasında ise R21 yazmacına 0x05 değeri yüklenir. ADD komutu ile R20 ve R21 toplanır ve R20’ye yazılır. Sonucumuz 0x1A olacaktır.

Şimdi ise eldeli bir toplama işlemi gerçekleştirelim.

0x1F ve 0xEF’in toplamı 10E olacaktır. Yalnız yazmacımız 8-bit olduğu için yalnızca 8-bitlik sağ taraftaki değeri gösterme şansı vardır. O yüzden R20 yazmacının değeri 0E olacaktır fakat SREG yazmacındaki C biti bir(1) konumuna gelecektir. Böylelikle eldeli değerimiz olduğunu öğreniriz.

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

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

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.