You are on page 1of 3

Assembly Programlama-1

Bugün çarpma yapmayı ö renecez.


Topu topu 35 komutun teker teker ne i e yaradı ını help ve data dosyalarından daha iyi anlatan hiçbir kaynak mevcut
de ildir.
ahsen ben bu örnekleri yazarken arka planda sürekli bu dosyaları açık tuttum.
Bir problemi çözmeye ba lamadan önce benzer problemlerin çözümlerini gözden geçirmek gerekir. imdi biz bu 8 bitlik aptal
i lemciye nasıl çarpma yaptırırız.

nsanlar nasıl çarpma yapar. On tabanında, çarpım tablosundan yararlanarak de il mi:


____0652
____0024
--------------
____2608
___1304_
__0000__
_0000___
--------------
00015648

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.

imdi aynı eyleri 2 tabanında deneyelim.


____1101
____0101
--------------
____1101
___0000_
__1101__
_0000___
--------------
01000001

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.

Normalde iki sayıyı nasıl toplarız:


075
028
------
__3 8+5=13 elde 1
_03 7+2=09 elde 0, 09+1=10 elde 1
103 0+0=00 elde 0, 00+1=01 elde 0
imdi diyeceksiniz bu adam renkli renkli ilkokul çocu una dört i lem anlatıyo. Ama unutmayın ki muhattabınız aslında ben
de il %99.999 saflıkta bir Si kristali. Hem siyah beyaz olması biraz sıkıcı oluyor.
Gördü ünüz gibi her basama a bir önceki i lemin 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 i lemin eldesi de duruyor. Bu yöntemle 16 bitten fazla sayıları da
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 de erini alırken en soldan ta an bit carrye
kaydediliyor. Böylece ta an bitin de erini kaybetmemi oluyoruz. Ba ka bir byteı kaydırdı ımızda da ta an biti bu bytea
aktarmı oluyoruz.

bcf STATUS,C ;carryi temizliyoruz burada ( çarpma algoritması için gerekli )


rlf al,f ;al sola kaydı, en soldaki ta an bit carryde
rlf ah,f ;ah sola kaydı, en sa daki bit alnin ta an 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 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.

Hazırlayan: Görkem Demirta


ikayetler e1448596@ceng.metu.edu.tr adresine...

You might also like