
Merhaba Arkadaşlar,
Bir MSP430 dersinde daha yine sizlerle birlikteyiz 🙂 Bu derste çarpma ve bölme işlemleriniz nasıl gerçekleştireceğimizi inceleyeceğiz. Şimdi C, Python, Matlab gibi programlama dillerini bilenler çarpma işlemine neden bir ders ayırıyorsun x=a*b ile çarpma yapılıyor zaten diyebilir. Ancak biz makine dilinde programlama yapıyoruz ve makine sadece toplama, çıkarma (aslında çıkarmayı da toplama cinsine çeviriyor ama neyse) ve lojik işlemleri gerçekleştirebiliyor. Bu nedenle çarpma ve bölme işlemi gerçekleştirirken bunları toplama işlemine indirgememiz gerekecek.
Burada karşımıza çıkan ilk soru şu “Çarpma işlemi nedir?”. İlk okuldan beri bize çarpmanın ne olduğu öğretilmedi (en azından bana öğretilmedi). Sadece çarpım tablosu ezberleyerek çarpmayı öğrendiğimizi zannettik. Mikroişlemciler dersini assembly dili ile öğrenmenin bana kattığı en önemli şey karmaşık durumları basite indirgeyebilmek olduğunu söyleyebilirim. Mesela mikroişlemci ile karmaşık sayılarla işlem yaparken “i veya j” sayısını nasıl tanıtacağımı düşünürken hocam hiç bu sayıyı hesaba katmadan sayıların reel kısmını belleğin bir bölümünde sanal kısmını ise başka bir bölümünde saklayarak işlemleri gerçekleştirmesi bende ufak bir aydınlanmaya neden oldu. 🙂 Yani programlamada yapacağınız işi olabildiğince basitleştirmek çok önemli.
Gelelim sorumuza “Çapma işlemi nedir?”. Aslında biraz düşününce kolaylıkla bulacağınızı düşünüyorum. Birkaç çarpma işlemi yapalım ve çarpmanın gerçekte ne olduğunu anlamaya çalışalım.
\small 2*4=8
\small 4*2=8
Evet yukarıdaki çarpma işlemlerine bide şu şekilde bakalım.
\small 2+2+2+2=8
\small 4+4=8
🙂 Bilmiyorum belki herkes bunu ilk okuldan beri biliyordur ama ben üniversite 3 de fark ettim. 😀 Bana gülebilirsiniz sorun değil ancak görüldüğü gibi 1. sayıyı kendisiyle 2. sayı kadar topladığımızda (tersi de olur çünkü çarpmada yer değiştirme özelliği vardır) çarpma işlemini gerçekleştirmiş oluyoruz.
O zaman gelelim programlama işlemini nasıl gerçekleştireceğimize. Öncelikle basit olandan başlayalım. İki ve kuvvetleri ile çarpma ve bölme işlemleri ikilik tabanda işlem yaptığımız için sayının soluna bir “0” ekleyerek kolaylıkla iki ile çarpma işlemini gerçekleştirebiliriz. Bir basamak sildiğimizde ise sayı ikiye bölünmüş olur (bölmede ufak küsurat hatası olabilir). Bunun için önceki derste de bahsettiğimiz gibi kaydırma komutlarımız var. Yani ayrıca bir program yazmamıza gerek yok. Bu komutlar;
RRA hedef komutu: hedef adresteki sayıyı bir basamak sağa kaydırır ve en sağdaki sayıyı siler.
RLA hedef komutu: hedef adresteki sayıyı bir basamak sola kaydırır ve en soldaki sayıyı siler.
RRC hedef komutu: hedef adresteki sayıyı bir basamak sağa kaydırır ve en sağdaki sayıyı elde bitine (SR içinde) kaydeder.
RLC hedef komutu: hedef adresteki sayıyı bir basamak sola kaydırır ve en soldaki sayıyı elde bitine kaydeder.
Bu komutlarda sağa kaydırma bölme işlemine sola kaydırma ise çarpma işlemine karşılık gelir. 3 basamak sola kaydırdığımızı düşünürsek 2^3 = 8 olduğundan 8 ile çarpma işlemi yapmış oluruz.
Gelelim asıl çarpma işlemine, basit olarak iki kaydedicinin içindeki sayıları çarpıp başka bir kaydedicide saklayan bir program yazdım. Siz bu programa bakarak bunu düzenleyebilir belleğin belirli bölgelerindeki sayıları çarpan program yapabilirsiniz ki genelde işlemler bellek bölgesinde gerçekleştirilir.
#include "msp430.h"
org 0f800h
reset mov #0280h,SP
mov #WDTPW+WDTHOLD,&WDTCTL
mov #05h,R6
mov #05h,R7
call #carp
aa jmp aa
carp clr R8
l1 add R6,R8
dec R7
jnz l1
ret
org 0fffeh
dw reset
end
Evet çarpma işlemi 5 satırlık bir alt program ile gerçekleştirilebilmektedir. İnanmıyorsanız deneyebilirsizin. 🙂
Gelelim bölme işlemine. Bölme olayında işler biraz daha karmaşıklaşıyor. Öncelikle bölme işleminin aslında ne anlama geldiğine bakalım. Bölme işleminin sonucu bize bölünen sayının içinde bölen sayıdan kaç tane bulunduğu bilgisini verir. Bunu işlemi programlamak için birkaç farklı yapı oluşturabiliriz. Örneğin;
- Yazacağımız programda bölünen sayıdan bölen sayıyı çıkartırız ve her çıkartma işleminde bir kaydediciyi bir arttırırız. Bu çıkarma işlemi bölünen sayı sıfırdan küçük veya eşit olana kadar devam eder.
- Veya diğer bir programda bölen sayıyı boş bir kaydediciye ekler, her ekleme sonucunda başka bir kaydediciyi bir arttırır ve ekleme yapılan kaydediciyi bölen sayı ile karşılaştırırız. bölünen sayı, bölen sayının sürekli eklendiği kaydediciden küçük olduğu anda döngü biter ve birer birer arttırdığımız kaydedicide sonuç bulunur.
Bu şekilde kendi tarzınıza göre bölme işlemini gerçekleştirebilirsiniz. Ben bu derste bölme kodunu yazmayacağım siz biraz uğraşın yapabileceğinize inanıyorum 🙂
Dersi sonlandırmadan önce şimdiye kadar bahsetmediğim bir konudan bahsetmek istiyorum. Şuana kadar yazdığımız programlara dikkat ettiyseniz, bazı komutlarda “.b” veya “.w” eklerinin olduğunu fark etmişsinizdir. Bunların anlamı komutlarda yapılacak işlemin “Byte” veya “Word” olarak gerçekleştirilmesidir. Peki bu ne anlama geliyor? Burada işlemcimizin kaç bitlik bir işlemci olduğu sorusu önem kazanmaktadır. Bizim kullandığımız MSP430 işlemcisi 16 bitlik bir işlemcidir. Yani işlemcinin kelime uzunluğu (Word) 16 bit olduğu için işlemlerini normal durumda 16 bitlik olarak gerçekleştirir. Ancak “P1DIR” veya “P1OUT” gibi kaydediciler 8 bit olduğu için bu kaydedicilerle işlem yaparken komutların sonuna bir byte (8 bit = 1 Byte) işlem yapması gerektiğini belirten “.b” ekini eklememiz gerekir. Herhangi bir ek eklemediğimizde veya “.w” eki eklediğimizde komut 16 bitlik işlem gerçekleştirir.
Evet bu derslik bu kadar yeter. Umarım şu ana kadar anlattıklarım faydalı olmuştur. Yeni yazılarda görüşene dek hoşça kalın efendim. 🙂