MSP430 ile Assembly Uygulamaları
|Merhaba,
Bu konuda MSP430F5529 ile Assembly ile bazı uygulamalar yapacağız. Bunlar genel olarak çok yapılmak istenen ram bölgesindeki en büyük ve en küçük sayının bulunması, 32 bitlik sayıların toplama işlemi, ram bölgesindeki bazı sayıları ram in farklı bir bölgesine taşımak gibi uygulamalar olacaklardır. Daha fazla konuyu uzatmadan örneklerimize geçelim. Yapılacak tüm uygulamalarda R5 registeri indexli adresleme için kullanılmıştır. İlk olarak en basit örnek olan ram bölgesindeki 16 adet sayının farklı bir bölgeye taşınmasından başlayalım. Bu uygulamada 2400h ile 2410h adresleri arasındaki 16 adet 8 bitlik sayıyı 16 bitlik gruplar halinde başka bir yere kopyalayacağız.
;ram bölgesini kopyala clr R5 ;R5 registerini temizle aa mov 2400h(R5), 2420h(R5) ;2400h' dan başlayarak taşıma yap incd R5 ;R5 registerinin değerini 2 arttır cmp #10h, R5 ;R5 registeri 10h oldumu diye kontrol et jnz aa ;R5 10h olmadı ise aa ya geri dön nop
Bu yazılımdaki “incd” komutunu “inc” ile değiştirirsek kopyalama işlemini 8 bit olarak yapar. Ancak bu durumda “cmp” komutut ile yaptığımız kıyaslamayı #20h a göre yapmalıyız. Çünkü kıyaslamamız gereken 32 sayı olmuştur.
Şimdi RAM bölgesindeki en küçük ve en büyük sayıyı bulma uygulamlası yapalım. Ram bölgesinde 2400h ile 2410h arasındaki sayılar için arama işlemini gerçekleştirelim. Burada iki register belirledik. Bir tanesi R6, diğeri R7. Bulduğumuz en küçük sayıyı R6 registerine, en büyük sayıyı ise R7 registerine yazacağız. Ancak burada ufak bir detay olarak küçük sayıyı bulmak için negatif sayılarda arama yapacağız. Çünkü pozitif bir sayıdan negatif bir sayıyı çıkartırsanız daha büyük pozitif bir sayı bulursunuz ki bu da yanlış değer elde etmenize sebep olur. Bu yüzden de negatif sayı için kıyaslama yapılacaksa ayrı bir yerde yapmamız gerekli.
;en büyük ve en küçük sayıyı bul clr R5 mov 2400h(R5), R6 ;ram bölgesindeki ilk sayıları r6 mov 2400h(R5), R7 ;ve r7 registerlerine yaz bas tst 2400h(R5) ;sayi negatif mi kontrol et jn neg ;eger negatif ise farklı yerde kiyaslamak icin atla cmp R7, 2400h(R5) ;en buyuk sayiyi bulmak icin r7 deki sayi jn ff ;ile ram bolgesindeki sayiyi karsilastır mov 2400h(R5), R7 ;sayi r7 den daha buyukse sayiyi r7 ye yaz jmp ff neg cmp R6, 2400h(R5) ;en kucuk sayiyi bulmak icin r7 deki sayi jn ff ;ile ram bolgesindeki sayiyi karsilastır mov 2400h(R5), R6 ;sayi r7 den daha kucukse sayiyi r7 ye yaz ff incd R5 ;2410h ram bolgesine gelindi mi diye kontrol et cmp #010h, R5 ;gelmedi ise bas etiketine geri don jnz bas nop
Burada kullanılan “tst” komutu parametre olarak aldığı sayıyı bir teste tabi tutar. Bu test sonucunda eğer negatif bir sayı ise negatif bayrağını setler. Bu yüzden MSP430 için bir sayının negatif olup olmadığını anlamadaki kolay yöntemlerden biridir. Sıraki örneğimizde 1′ den 5000′ e kadar olan sayıların toplamını ele alacağız. Bildiğiniz üzere MSP430′ daki register’ ler 16 bitlik ve 1′ den 5000′ e kadar olan sayıların toplamı 16 bitlik adres bölgesinde taşmaya sebep olacaktır. Bu taşan değeride düzgün şekilde bir yerde saklamazsak toplama işleminden yanlış sonuç elde ederiz.
;1 den 5000 e kadar olan sayıların toplamı clr R5 ;indexli adresleme registeri clr &2400h ;toplamın MSB tarafının tutulacağı adres bölgesi clr &2402h ;toplamın LSB tarafının tutulacağı adres bölgesi aa add R5, &2402h ;R5 degerini sürekli olarak LSB adresinde topla adc &2400h ;taşan bitleri MSB adresinde topla inc R5 ;R5 degerini bir arttır cmp #5001, R5 ;R5 değeri 50001 oldu mu diye kontrol et jnz aa ;5001 olmadyısa aa ya geri don nop
Bu yazılım sonunda ram bölgesindeki iki kısma bakmalıyız. 2400h ve 2402h değerlerine. Toplamın sonucunda elde edeceğimiz sayılar şu şekilde olacaktır. 00BE, C5E4 bu sayıyı 10′ luk tabana çevirirsek 12 502 500 sayısını elde ederiz ki bu sayı ardışık sayıların toplamı formülü ile elde edilen sayıdır. (5000 * 5001 / 2 = 12 502 500) Bir sonraki uygulamada iki adet 32 bitlik sayıyı toplayalım.
32 bitlik sayıların toplanmasında önce 16 bitlik LSB kısmı sonra diğer 16 bitlik MSB kısmı elde ile toplanır. Elde ile toplamadaki amaç LSB kısmından gelen eldeyi de toplama dahil edebilmek. Böylece toplama işlemini doğru yapmış oluruz. Ayrıca MSB’ lerin toplamından gelen eldeyi de farklı bir yerde toplamak gerekir.
clr &2414h ;elde nin tutulacağı ram adresi ;32 bitlik sayı ilk sayıyı tanımkadık mov #0f010h, &2402h ;MSB kısmı mov #08010h, &2404h ;LSB kısmı ;32 bitlik sayi ikinci sayıyı tanımladık mov #0ffffh, &2416h ;MSB kısmı mov #08020h, &2418h ;LSB kısmı add &2404h, &2418h ;LSB kısımları topladık addc &2402h, &2416h ;MSB kısımları elde ile birlikte toplatk adc &2414h ;tasma yı farklı bir yere yazdırdık nop
Değerlerin düzgün görünmesi için msp430f5529 için olabildiğince alt alta getirmeye çalıştım. Burada son olarak dikkat edilmesi gereken son eldeyi toplayacağımız ram bölgesini başta sıfırlamamız gerekir. Sıfırlamazsak toplama sonucumuzu yanlış elde ederiz.
Bu konuda vereceğim örnekler bu kadardı.
İyi çalışmalar dilerim…