Bugün çarpma yapmayı ö
renecez.
Topu topu 35 komutun teker teker ne ie yaradıını help ve data dosyalarından daha iyi anlatan hiçbir kaynak mevcut
deildir.
Topu topu 35 komutun teker teker ne ie yaradıını help ve data dosyalarından daha iyi anlatan hiçbir kaynak mevcut
deildir.
ahsen ben bu örnekleri yazarken arka planda sürekli bu dosyaları açık tuttum.
Bir problemi çözmeye balamadan önce benzer problemlerin çözümlerini gözden geçirmek gerekir. imdi biz bu 8 bitlik aptal
ilemciye nasıl çarpma yaptırırız.
Bir problemi çözmeye balamadan önce benzer problemlerin çözümlerini gözden geçirmek gerekir. imdi biz bu 8 bitlik aptal
ilemciye nasıl çarpma yaptırırız.
nsanlar nasıl çarpma yapar. On tabanında, çarpım tablosundan yararlanarak deil mi:
____
0652
____
0024
--------------
____
2608
___
1304_
__0000__
_0000___
__0000__
_0000___
--------------
00015648
Biz ne yapıyoruz.
kinci sayının son basamaından baladık. 4 ile 2 yi çarptık 8. Tek basamaklı. kinci bir basamak içerseydi
ikinci basamaı bir sonraki ilemin sonucuna ekleyecektik. 4*5=20. 6*4=24 24+2=26...
ikinci basamaı bir sonraki ilemin sonucuna ekleyecektik. 4*5=20. 6*4=24 24+2=26...
kinci sayının ikinci basamaı ile devam ediyoruz. Herey bir önceki ilemlerle aynı ama bu sefer sonucu bir basamak
kaydırarak yazıyoruz.
Bütün basamaklar için ilemleri 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.
kaydırarak yazıyoruz.
Bütün basamaklar için ilemleri 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.
imdi aynı eyleri 2 tabanında deneyelim.
____
1101
____
0101
--------------
____
1101
___
0000_
__1101__
_0000___
__1101__
_0000___
--------------
01000001
Güzelli
e bakın! Çarpım tablosu gibi birey anlamını yitirdi. kinci sayının sadece ilgili basamaına bakıyoruz. 1 ise lk sayıyı
olduu gibi, gerekli basamak kaydırarak yazıyoruz. 0 ise hiçbirey yapmıyoruz.
olduu gibi, gerekli basamak kaydırarak yazıyoruz. 0 ise hiçbirey yapmıyoruz.
imdi kodumuzu yazmaya balayalı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
org 0x0000
goto
basla
org 0x0005
carp:
clrf
rl ;sonuc=0
clrf
rh
clrf
ah ;carpan1 kayacak yeri temizliyoruz
movlw 0x08
movwf
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 ite. 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
>Animate ile programı çalıtırabilir Halt ile durdurabilirsiniz. Kurcalayın menuleri ite. 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. Eer program düzgün çalımazsa Configure->Select Device
ile 16f628a'yı
seçip seçmediinizi kontrol edin ( hehehe ). Sol en altta bir yerde hangi ilemciyle çalıtıınız yazar zaten.
Yaptıımız ilem 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.
Normalde iki sayıyı nasıl toplarız:
ile 16f628a'yı
seçip seçmediinizi kontrol edin ( hehehe ). Sol en altta bir yerde hangi ilemciyle çalıtıınız yazar zaten.
Yaptıımız ilem 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.
Normalde iki sayıyı nasıl toplarız:
0
75
0
28
------
_
_3 8+5=13 elde 1
_
03 7+2=09 elde 0, 09+1=10 elde 1
1
03
0+0=00 elde 0, 00+1=01 elde 0
imdi diyeceksiniz bu adam renkli renkli ilkokul çocuuna dört ilem anlatıyo. Ama unutmayın ki muhattabınız aslında ben
deil %99.999 saflıkta bir Si kristali. Hem siyah beyaz olması biraz sıkıcı oluyor.
Gördüünüz gibi her basamaa bir önceki ilemin eldesi ekleniyor. Kendimizi 2 tabanıyla sınırlandırmazsak yani 256
tabanında düünürsek her baytı bir basamak gibi kabul edebiliriz.
deil %99.999 saflıkta bir Si kristali. Hem siyah beyaz olması biraz sıkıcı oluyor.
Gördüünüz gibi her basamaa bir önceki ilemin eldesi ekleniyor. Kendimizi 2 tabanıyla sınırlandırmazsak yani 256
tabanında düünürsek her baytı bir basamak gibi kabul edebiliriz.
movf
al,w
addwf
rl,f
;rl+al->rl
btfsc
STATUS,C
incf
rh,f
;elde varsa rh+1->rh
movf
ah,w
addwf
rh,f
;rh+ah->rh
Böylece 16 bit iki sayıyı da toplamı
olduk. Carry bitinde son ilemin eldesi de duruyor. Bu yöntemle 16 bitten fazla sayıları da
toplayabilirsiniz.
Bir de 8 bit sola kaydırmaya bakalım:
toplayabilirsiniz.
Bir de 8 bit sola kaydırmaya bakalım:
[]
[][][][][][][]
<-carry
carry
<-[][][][][][][][]
Tespihin boncuklarını kaydırır gibi bitleri kaydırıyoruz. En sa
daki bit carrynin eski deerini alırken en soldan taan bit carrye
kaydediliyor. Böylece taan bitin deerini kaybetmemioluyoruz. Baka bir byteı kaydırdıımızda da taan biti bu bytea
aktarmıoluyoruz.
kaydediliyor. Böylece taan bitin deerini kaybetmemioluyoruz. Baka bir byteı kaydırdıımızda da taan biti bu bytea
aktarmıoluyoruz.
bcf
STATUS,C
;carryi temizliyoruz burada ( çarpma algoritması için gerekli )
rlf
al,f
;al sola kaydı, en soldaki taan bit carryde
rlf
ah,f
;ah sola kaydı, en sadaki bit alnin taan biti
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
yapmayı size bırakıyorum ). Aynı eyler sa
a kaydırma için de gösterilebilir.
Bütün yukarıda yaptıımız ilemler kullanılan sayıların pozitif olduunu kabul eder. Yani 11111111 sayısının 255e denk
olduunu varsayar. Yukarıdaki kodları negatif sayılarla ( sonra açıklayacam ) kullanmak isterseniz pozitif sayıya çevirip öyle
Bütün yukarıda yaptıımız ilemler kullanılan sayıların pozitif olduunu kabul eder. Yani 11111111 sayısının 255e denk
olduunu varsayar. Yukarıdaki kodları negatif sayılarla ( sonra açıklayacam ) kullanmak isterseniz pozitif sayıya çevirip öyle
kulanmalısınız.