AVR Assembly -6- STS, IN, OUT ve MOV Komutları

Bu yazımızda önceden LDS ile başladığımız bellekten veri okuma ve yazma komutlarına STS, IN ve OUT komutlarıyla devam edeceğiz. Bu komutlar söz dizimi olarak önceden anlattığımız komutlara oldukça benzemektedir. Yalnız her komutun görevini ve operandını iyi bilmek ve ona göre kodu yazmak gereklidir.

STS

STore direct to data Space tabirinin kısaltması olan bu komut bir genel maksatlı yazmaçtaki veriyi belirtilen bellek adresine yazar. Yani yazmaçlar üzerinde işlem yapıp sonra da RAM belleğe kaydetmek istediğimiz zaman bu komutu kullanırız. Bu komut hafıza birimindeki herhangi bir adrese kayıt yapabilir. Yani RAM bellek olduğu gibi giriş ve çıkış yazmaçlarıyla genel maksatlı yazmaçlar da olabilir. Fakat onlar için ayrı komutlar olduğundan performans için RAM belleğe kayıt yaparken kullanılır.

Komutun söz dizimi aşağıdaki gibidir.

Burada K adres değeri, Rr ise yazmaç adıdır. Yani K <— Rr şeklinde bir veri aktarımı söz konusudur. Sağdan sola olduğuna dikkat edelim.  Şimdi buna bir örnek verelim.

STS komutunu verdiğimize göre artık önceki öğrendiğimiz komutlarla daha gelişmiş bir program yazma vakti geldi. Şimdi o programı yazalım ve inceleyelim.

Bu program bellekteki iki değeri birbiri ile toplayıp tekrar belleğe yazar. Yani C dilindeki x = x + y; komutunu tam anlamıyla yapmış olur. Burada iki baytın birbirine toplandığına dikkat etmemiz gereklidir. C dilinde ifade ettiğimiz değişkenler bellek adresinden başka bir şey değildir.  Burada değişken yerine bellek adresi kullansak da ileride bellek adreslerine değişken gibi nasıl isim vereceğimizi anlatacağız.

Şimdi ise PORTC’nin değerini PORTD’ye yazalım. Örneğin C portuna sırayla düğme bağlı olsun ve D portunun tüm ayaklarına led bağlı olsun. Bu durumda C dilinde PORTD = PINC; ifadesini kullanmamız gerekliydi burada ise hafıza adreslerini kullanarak bunu yapalım.

IN

AVR mikrodenetleyicilerin hafıza birimlerin giriş ve çıkış yazmaçları için ayrı  bir bölüm olduğundan bahsetmiştik. İşte bu yazmaçlar için özel kullanılan komut ise IN komutudur. İngilizce olarak IN from I/O location olarak ifade edilen komut daha performanslı bir şekilde giriş ve çıkış yazmaçlarından veri okuyabilir. Yalnız giriş ve çıkış yazmaçlarının iki cins adresi bulunmaktadır. Bunlardan biri hafıza adresi olup diğeri ise I/O adresidir. Bu I/O adresi I/O hafıza biriminden itibaren sıfırdan başlar. Bu komutu kullanırken en çok dikkat etmemiz gereken nokta I/O adreslerini kullanmamızdır. Komutun söz dizimi şu şekildedir.

Burada Rd olarak ifade edilen genel maksatlı yazmaçlar olup R0-R31 arasındadır. A ise giriş ve çıkış adres değeridir. Örneğin PIND’nin değerini R1 yazmacına kaydetmek istediğimizde şöyle bir komut yazarız.

Yukarıda 0x26 derken burada 0x06 demekteyiz çünkü i/o adres değeri bu şekildedir. Bunun bu şekilde olduğunu datasheetten okuyup görebilirsiniz.

Assembly çeviricisi aynı C derleyicisinde olduğu gibi bir başlık dosyasına sahiptir. Burada belli yazmaçların ve değerlerin tanımlandığını görebiliriz. Yani 0x26 yerine PINC, 0x2B yerine PORTD kullanabiliriz. Aynı C dilinde olduğu gibi bu işimizi kolaylaştırmaktadır.

Görüldüğü gibi kodumuz daha anlaşılır oldu. Özellikle bit komutlarında C diline göre daha kolay anlatacağımızı düşünüyouz.

I/O yazmaçlarını adreslerken bu değerleri kullanabiliriz. IN komutu LDS komutuna göre iki kat daha hızlıdır ve yarı yarıya hafıza alanı kullanmaktadır. O yüzden bu komutu kullanmak daha performanslı olacaktır.

OUT

OUT yani (OUT to I/O Location) komutu IN komutunun tersi olarak anlaşılabilir. Bu komut genel maksatlı yazmaçlardaki veriyi I/O adreslerinden birine yazmak için kullanılır. STS komutunun I/O yazmaçları için uyarlanmış halini düşünebiliriz. Yine bu komut STS komutuna göre performanslı çalışacaktır. Komutun söz dizimi şu şekildedir.

Burada A I/O adresi Rr ise yazılacak verinin alındığı genel maksatlı yazmaçtır. Örnek bir komut vermemiz gerekirse şöyle olacaktır.

MOV

Move ifadesinin kısaltımı olan MOV komutu genel maksatlı yazmaçlar arasında veri transferini sağlar. Bu komut bir çevirimde gerçekleştiği için çok hızlı veri yazma işlemi yapabiliriz. Komutun söz dizimi şu şekildedir.

Burada Rd yazım işlemi yapılacak yazmaç Rr ise kaynak yani değerini yazacağımız yazmaçtır. Bir örnekle özetleyelim.

Bu komut R1 yazmacına R2 yazmacının değerini yazar.

Temel okuma ve yazma komutları bu şekildeydi. Elbette farklı kullanımları ve komutları komut seti kılavuzundan görmekteyiz. Bunları daha sonra açıklayacağız.

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.