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

Sign up to vote on this title
UsefulNot useful