Professional Documents
Culture Documents
Biz ne yapıyoruz. kinci sayının son basama ından ba ladık. 4 ile 2 yi çarptık 8. Tek basamaklı. kinci bir basamak içerseydi
ikinci basama ı bir sonraki i lemin sonucuna ekleyecektik. 4*5=20. 6*4=24 24+2=26...
kinci sayının ikinci basama ı ile devam ediyoruz. Her ey bir önceki i lemlerle aynı ama bu sefer sonucu bir basamak
kaydırarak yazıyoruz.
Bütün basamaklar için i lemleri yaptık. ( 0 olanlar dahil ) Sonuçları alt alta yazdık. Hepsini topladık. Farkettiyseniz 4
basamaklı iki sayının carpımı en çok 8 basamaklı edebilir.
Güzelli e bakın! Çarpım tablosu gibi bir ey anlamını yitirdi. kinci sayının sadece ilgili basama ına bakıyoruz. 1 ise lk sayıyı
oldu u gibi, gerekli basamak kaydırarak yazıyoruz. 0 ise hiçbir ey yapmıyoruz.
imdi kodumuzu yazmaya ba layalım:
list p=16f628A
#include p16f628A.inc
cblock 0x70
rl ;sonuc low byte
rh ;sonuc high byte
al ;carpan1
ah ;carpan1 icin kayacak yer
bl ;carpan2
co ;sayac
endc
org 0x0000
goto basla
org 0x0005
carp:
clrf rl ;sonuc=0
clrf rh
clrf ah ;carpan1 kayacak yeri temizliyoruz
movlw 0x08
movwf co ;sayac=8
lb1:
btfss bl,0 ;carpan2 ilk basmagi kontrol ediyoruz
goto lb2
movf al,w ;ilk basamak 1 ise ah:al sayisini rh:rl ye ekliyoruz
addwf rl,f ;rl+al->rl
btfsc STATUS,C;eldemiz varsa rh+1->rh
incf rh,f
movf ah,w
addwf rh,f ;rh+ah->rh
lb2: ;ilk basamak 0 ise toplama yapma
decf co,f
btfsc STATUS,Z
return ;8 kere tekrar ettiysek i miz bitti
bcf STATUS,C ;i imiz bitmediyse
rlf al,f ;carry flagini temizle carpan1i kaydir
rlf ah,f
rrf bl,f ;carpan2 yi de kaydir ki ayni komutla ikinci basamagini kontrol edebilelim (btfss bl,0)
goto lb1 ;islemleri tekrar yap
basla:
movlw 0x0a ;carpan1=10
movwf al
movlw 0x05 ;carpan2=5
movwf bl
call carp ;i lemi yap sonuc rh:rl ikilisinde
goto $ ;dur. $ bulundugumuz adresi temsil ediyor mesela bir sonraki adresi $+1 ie gosterebiliriz
end
Burdaki kodların ço unu kopyala-yapı tır ile MPLAB IDE'ye aktarabilir ve kullanabilirsiniz. Aktardıktan sonra save as deyip
.asm uzantısıyla kaydedin. Project->Quickbuild xxxx.asm ile derleyin. Debugger->MPLAB SIM seçin. Tekrar Debugger-
>Animate ile programı çalı tırabilir Halt ile durdurabilirsiniz. Kurcalayın menuleri i te. lemlerin sonucunu View->File
Registers menüsünü kullanarak kontrol edin. Açılan pencerenin sol alt kö esindeki Symbolic butonu ile de equ veya cblock
kullanarak hafıza adreslerine verdi iniz isimleri de görebilirsiniz. E er program düzgün çalı mazsa Configure->Select Device
ile 16f628a'yı
seçip seçmedi inizi kontrol edin ( hehehe ). Sol en altta bir yerde hangi i lemciyle çalı tı ınız yazar zaten.
Yaptı ımız i lem iki adet 8 bit sayıyı çarpıp 16 bitlik bir sonuç elde etmek. Aslında burada sadece çarpma yapmayı
ö renmedik. ki 16 bit sayıyı toplamayı da gördük. 16 bit sayıyı kaydırmayı da.
Bu yöntemle birden fazla byte kaydırılabilir. Ancak son byteın en sol biti bu yöntemle kaybolur. ( Kaybolmayacak ekilde
yapmayı size bırakıyorum ). Aynı eyler sa a kaydırma için de gösterilebilir.
Bütün yukarıda yaptı ımız i lemler kullanılan sayıların pozitif oldu unu kabul eder. Yani 11111111 sayısının 255e denk
oldu unu varsayar. Yukarıdaki kodları negatif sayılarla ( sonra açıklayacam ) kullanmak isterseniz pozitif sayıya çevirip öyle
kulanmalısınız.