assembly programlama-0 ders 2

ibolina

Yeni üye
13 Tem 2008
32
0
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
de
ildir.

​
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.

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

____​
0652

____​
0024

--------------​
____​
2608

___​
1304_
__
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...

​
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.

​
imdi aynı eyleri 2 tabanında deneyelim.

____​
1101

____​
0101

--------------​
____​
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ı
oldu
u 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​
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 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çmedi
inizi 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
de
il %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:

[]​
[][][][][][][]
<-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 de
erini 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​
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
oldu
unu varsayar. Yukarıdaki kodları negatif sayılarla ( sonra açıklayacam ) kullanmak isterseniz pozitif sayıya çevirip öyle

kulanmalısınız.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.