![]() |
![]() |
||||||||||||||||||||||||||||||
|
Pic Assembly ve Makrolar Hazırsanız Başlıyoruz =)
#DEFIE#DEFINE anahtar sözcüğü ile kendi tanımladığımız değiskenler, yada include dosyalarında tanımlanmıs olan, adlandırılmıs olan adresler kullanacağımız programı daha kolay yazıp gerek baskasının daha kolay anlaması, gerekse uzun bir sürenin ardından programa tekrar bakmamız gerektiğinde, yazdığımız kodları daha rahat anlamamız için adlarda değisiklikler yapabiliriz. Örneğin ; #DEFINE INPUT PORTB,1 #DEFINE OUTPUT PORTB,2 Diyerek yeniden adlandırdığımız PORTB’nin 1.ve 2. bitlerini programın ilerleyen bölümlerinde kendi koyduğumuz isimlerini PORTB,1 ve PORTB,2 yerine kullanabiliriz. Ayrıca böyle bir yaklasımda mesela değisik zamanlarda belirli bir mantığa göre çalısan makineler yada robotlar yaptığımızda kullandığımız microchipin değisik pinlerini dahi input ve output olarak kullanacağımız zaman kodun birçok yerinde değissiklik yapmak yerine sadece programımız basında tanımladığımız bu anahtar sözcüğü değistirerek sorunu çözebiliriz. #ICLUDE#INCLUDE anahtar sözcüğü programlayıcıya daha önceden yazılmıs bir programı ve programında kullanacağı özel, belki evrensel, keywordleri ekleme imkanı sağlayan önemli bir koddur. Örnek verecek olursak; #INCLUDE <p16f876.inc> #INCLUDE <subprogram.asm> COSTAT CONSTANT keywordü sayesinde programcı programın ilerleyen safhalarında değismesini istemediği değiskenleri tanımlama imkanına sahiptir. Örenk; CONSTANT <sabit ismi>=<sabitin sayısal değeri> CONSTANT DELAY=150 VARIABLEVARIABLE keywordü ile yazmıs olduğumuz programda değiskenler tanımlayabilir ve bu değiskenlere göre kosul cümleleri tanımlayabiliriz. Örnek; VARIABLE <isim>=<sayısal değer> VARIABLE COUNTER=150 SET SET keywordü ile bir registerı mesela sayaç olarak atayabilirsiniz, ancak daha sonra aynı fonksiyonu kullanarak tutulan registerı değistirebilirsiniz. Örnek; <kullanılacak isim> SET <registerın adresi> counter SET h’10’ . . . counter SET h’01’ EQUEQU fonksiyonu neredeyse SET ile aynıdır, bir farkla, EQU ile atama ancak birkere yapılabilir. Örnek verecek olursak; <register ismi> EQU <register adresi> register EQU h’05’ ORGORG keywordü ile programın chipin belleğinde hangi adresten itibaren kaydedildiğini belirleyebiriz. Ayrıca kesme alt programının baslangıç adresini belirler. Örnek; ORG h’00’ ENDEND programın bittiğini assemblerın anlamasını sağlar. Kullanmak mecburidir, aksi halde hata kaçınılmaz olur. Bütün kodlar bittikten sonra yazılır, yani alt programların da yazılmasından sonra eklenir.Örneğin; . . . END Kosul İfadeleri IF-EDIF IF ,eğer, ifadesi bir değiskenin değerine, belki net olarak bilinmesi durumunda bir portun değerine göre islem yapmak için kullanılabilir. Örneğin; IF COUNTER<100 INCF COUNTER,F GOTO START ELSE GOTO FINISH ENDIF Yukarıdaki örnekte ELSE ifadesi de dikkati çekiyor, ELSE ise IF ile arastırılan kosulun sağlanmadığı her durumda islevlik kazanarak execution oluyor. NOT : #DEFINE INPUT PORTB,1 ;seklinde bir tanımlama yapınca . . . IF INPUT==1 ;derleme esnasında hata verir ;”illegal character (,) WHILE-EDW WHILE ifadesinden sonra sağlanması gereken sart yazılır, mesela; WHILE a<10 dediğimizde, ”a 10’dan küçük olduğu sürece” ifadesini bilgisayarın anlayabileceği bir dile çevirmis oluruz. Kullanımı; Örnek; WHILE <condition> WHILE A<50 . A=A+1 . ENDW . ENDW IFDEF-EDIF DEFINE ile olusturulan kosul ifadelerini test ederken kullanmak için gelistirilmistir. Örnek; #define condition a==1 . . . ifdef condition . . . Endif IFDEF-EDIF IFNDEF, if not defined, ifadesini kullanarak da sart cümlesi olusturabiliriz. Bu ifdef’in tam tersi sekilde çalısır. Yani #DEFINE aracılığıyla tanımlanan kosul ifadesi #UNDEFINE keywordü ile silinmis ise yada öyle bir kosul ifadesi hiçbir zaman olusturulmamıssa IFNDEF kosul ifadesi sağlanır , yani “true” olur, “ifndef-endif” bloğu içinde kalan koda göre islem yapılır. Örnek; #define input portb,1 #define inputcondition input==1 . . . #undefine inputcondition . . . Đfndef inputcondition . . . Else . . . Endif CBLOCK-EDC (Constants Block) CBLOCK ifadesi parametreye belirli bir sabit değer atadıktan sonra devam eden her parametreye bir öncesinin bir fazlası değer atayan bir nevi sabit dizisi elde etme yöntemidir. Örnek; CBLOCK h’01’ bir , iki, uc ;bir=h’01’ ; iki=h’02’,uc=h’03’ ENDC DB (Defining One Byte Data) Bellekte belirtilen adreslere verileri sırasıyla yazmaya yarayan fonksiyondur. Örnek; DB ‘T’,h’12’,’a’,’b’,h’0f’ DE (Defining the EEPROM) EEPROM hafızasına belirtilen adresten itibaren veri yazmak için kullanılır.Đlk defa tanımlanırken sadece EEPROM hedefli olarak yazılan bu fonksiyon istenilen bellek türünün istenilen adresine veri kaydı için kullanılabilir. Örnek; ORG h’2100’ DE “data”,0 DT ( Data Table ) DT fonksiyonu ile olusturulan tablo her islenilisinde W ,workin register’a , 8086 ve 8085 gibi dillerde A, yani accumulator’ın yerini tutar, kaldığı parametrenin değerini aktarır. Örnek; DT bir,iki,uc Makrolar Makrolar daha yüksek seviyeli programlama dillerindeki , mesela c gibi , fonksiyonların islevini assemblyde görmektedir. Makrolar programcıya bir kodu sadece bir kere makro olarak ifade ettikten sonra sadece o makroyu çağırarak istediği yerde kullanabilme olanağı ve ,mesela, aradan uzun bir süre geçtiğinde unuttuğu programı daha kolay okumasını ,eğer b,r grup olarak proje yapılıyorsa diğer üyeler için kodun okunma kolaylığını sağlar. Nasıl ifade edildiklerine gelince ; <makro ismi> MACRO [<argüman1>,<argüman2>,<argüman3>,…,<argümanN>] ;argüman sayısı ihtiyaca bağlı olarak değisicektir hiçbir argüman kullanılmayabilir de … … … ENDM Makroların kod içinde ifade edildikleri yere gelince , öncelikle unutulmamalıdır ki , daha ileri düzey programlama dilleriyle çalısmıs kisiler “Main” fonksiyonunun dısında fonksiyonların tanımlanmalarıyla makroların tanımlanmasını karıstırmamalıdır, END ifadesinden sonra yazılan kodlar assembler tarafından algılanmayacaktır, dolayısıyla olusturulan makrolar mutlaka bu ifadeden önce yer almalıdır. Ayrıca makrolar asıl program dosyamızın dısında baska bir “.asm” uzantılı program dosyasında ifade edildikten sonra bu makro dosyasını #INCLUDE komutuyla programımıza eklememizle de kullanıma açılmıs olur. Bu kullanımı normalde assembly komutları içerisinde yer almayan çarpma islemi için kendi yazacağımız bir makroyu kullanmak için gözlemlyebiliriz ; ; -------------carpma.asm-----------------; toplam set 0xC0 carpma macro sayi , defa ; “carpma” isimli makromuzu ; “toplam”=“sayi”x”defa” islemi için tanımlıyoruz movfw 0xc0 CarpimDongu addwf toplam,f decfsz defa goto CarpimDongu endm end ----------------------------------------------------------------------------------------------------------------- #INCLUDE ”carpma.asm” … … … carpma 3,5 … … … end Oguzcan Karagoz ozu_ha@hotmail.com YorumlarHiç yorum yapılmamış |
|||||||||||||||||||||||||||||||
![]() |
![]() |
||||||||||||||||||||||||||||||