MSP430 ile Assembly Uygulamaları

launchpad_logo

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…

 

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir