ASM dilinde özel komutların kullanılması!

Başlatan arslan74, 28 Ocak 2005, 07:57:29

arslan74

Merhaba arkadaşlar,
Size ASM ilgili bir sorum olacak. Pic'in normal komutları haricinde ASM'de cok değişik farklı komutlarda var. İşin acıkcası bunları pek kullandığım yok ve bu konudada fazla bilgi de yok. Help menüsünde gezerken bir cok değişik ASM komutuna rastladım. En önemliside "if" komutunu gördüm.
Sormak istediğim şu bu if komutu aynı Basic te gibi kullanilabiliyormu. Yani programın içinde bir biti veya bir baytı kontrol etmek için kullanabiliyoruz mu?
Eğer öyle ise bunu cok basit bir kullanımla gösterebilen arkadaşlar olursa benim gibi asm ile program yazan arkadaşlara cok faydası dokunur.

Bundan başka diğer özel komutlarıda bilen arkadaşlar bunları bu yazının devamına eklerlerseler cok sevinirim.

Ben inceleyib bulduklarımı buraya ekleyeceğim.

Herkese  Çalışmalarında başarılar,

Hasan ARSLAN.

bsivgin

Sayın Hasan Bey,

sizin belirttiğiniz if komutu bir directive'dir. Yani program build yapılırken derleyici bu komutları derlemez. Bunlara örnek olarak EQU, SET, ORG, ENd gibi directive'ler örnek verilebilir.

If komutu while komutu gibi komutlarda yüksek seviyeli dillerdeki olduğu gibi işlem görmez. Yüksek seviyeli dillerde bu komutlar derlenirken if komutunun assembler karşılığı oluşturularak derlenir. Örneğin aşağıdaki gibi bir herhangi bir dilde yazılmışsa (komutlar örnek olarak verilmiştir)

if porta.0=1 then
high porta.1
else
high porta.2


bunu assemblerde yazmak istersek karşılığı şöyledir

     BTFSS PORTA,0
     goto diğer
     bsf porta,1
     return
diğer
     bsf porta,2
     return
     


ancak assembler içinde kullanılan if komutu eğer şart doğru ise derleme yapılır. Şart doğru değilse diğer kısım derlenir. Yani şart durumuna göre derleme yapmayı belirler. Aşağıdaki örneğe bakarsanız. Kristal frekansını kullanıcı programı derlemeden önce seçmekte böylece seçtiğiniz frekansa göre PORTA'nın mı yoksa PORTB'nin mi giriş yada çıkış olacağı belirlenmektedir. Bu nerlerde kullanılır diyebilirsiniz. Örneğin aynı devreyi hem 10MHz de kullanıyorsunuz hemde 4 MHZ'de programı derlemeden önce sadece kristal_frekans değişkenini ayarlayarak derleyicinin programın sadece o frekansta çalışan kısımlarını derlemesini sağlayabiliyorsunuz.

variable kristal_frekans  

kristal frekans set  D'10'

if kristal_frekans==D'10'         ;
    clrw                
    movwf TRISA          
    movlw 0xff              ; kristal frekansımız 10 seçildiği için bu kısım
    movwf TRISB          ;derlenir
 else
    clrw                
    movwf TRISB          
    movlw 0xff           ;kristal frekansmız 10 seçildiği için bu kısım
    movwf TRISA         ;derlenmez
 endif

derleme sonucunda program hafızasında sadece şu komutlar görünür:

    clrw                
    movwf TRISA          
    movlw 0xff              
    movwf TRISB          


Saygılarımla
Bülent ŞIVGIN
www.diyot.com

argeci

merhaba geliştirilmiş komutlar belli görevlere ait makroları içerir mesela banksel register ismi verdiğiniz zaman sizin banksel yazdığınız yere derleyici o registerin hangi bankta olduğunu hesaplar mesela
BSF STATUS,RP0
BCF STATUS,RP1 yazar yani macro tipi bir kullanım düşünülmüştür kullanırsanız işiniz kolaylaşır mesala16 serisinde movff komutu yoktur yani bir register değerini başkabir register değerine yükleyemezsiniz sizde otursanız movff diye bi makro yazsanız ve adını ldf reg1,reg2 deseniz aynı işi yapmış olursunuz bu durumda siz her seferinde LDF REG1,.REG2 yazdığınızda derleyici gider yazdığınız satıra
MOVF  REG1,W
MOVWF REG2
koyar siz yapıca makro olur bunu microchip yapınca özel komut olur yanlış hatırlamıyosam yanlışsa arkadaşlar düzeltsin C deki inline işlemine benzer bir yapı gibi düşünün.
If tan tam emin olmasamda ordaki if pic basicdeki gibi bir is değil derlemeden önce yerleme işlemini yöneten bi if işlemidir mesala bi gecikme routini yazsanız if dersiniz osc 4mhz ise veya 10mhz ise gibi
esselamü aleyküm ve rahmetüllahi ve berekatühü Allahın selamı rahmeti bereketi hepinizin ve hepimizin üzerine olsun