Şimdi Ara

Assembly'de Call komutu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
15
Cevap
0
Favori
2.752
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Assembly ile program yazmaya uğraşıyorum. Kitaplardan okuduğum bir şey var aklıma takılan. Call komutu ile bir alt rutin çağırdığımızda bu rutin içinde kaç call rutini çağırabiliriz. En fazla sekiz diyor, ama bazı programlarda alt alta 10-15 call komutu kullanıldığını görüyorum alt rutin içinde. Lütfen konu ile ilgili bilgisi olanlardan açıklama bekliyorum.



  • Bu konu tamamiyle yığın (stack) derinliği ile ilgilidir. Bir call yaptığın zaman işlemci geri döneceği adresi yığına yazar ki nereye döneceğini bilsin. Eğer yığın derinliği azsa: PIC'lerde olduğu gibi 8-seviyeli bir yığın varsa, bu "iç içe" en fazla 8 kez call yapabileceğin anlamına gelir. Ha dokuzuncuyu yapabilir misin? Yaparsın ama programın doğru yere geri dönemez, "apışıp kalır" .

    Yukarıda özellikle "iç içe" kelimesine dikkat çekmek istiyorum. Alt alta call kullanmakla farklıdır. Yani bir call ile fonksiyona gidilp geri dönüyorsan bu yığında yer kaplamaz. Ama bir call yapıp gittiğin yerde yine bir call yapıyorsa bu kez yığında yer işgal etmeye başlarsın. Umarım anlatabilmişimdir.

    Edit : İmla hatası



    < Bu mesaj bu kişi tarafından değiştirildi HYP -- 14 Ocak 2006 16:50:37 >




  • HYP yüzbaşım kitabını bekliyorum haberin olsun ilk müşterin ben olacağım emin olabilirsin
  • Sevgili HYP üstadım,
    Anladığım kadarı ile bir CALL yaptık diyelim. Bu alt rutin içinde en fazla 7 call daha mı yapabiliriz (Pic için)? Örnek olarak şöyle bir program yazdık diyelim.

    ......
    call DELAY
    ......

    DELAY
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    call 1msnbekle
    return

    çalışır mı?

    ya da bir başkası
    ......
    call DELAY
    ......

    DELAY
    call 1msnbekle
    call 1msnbekle
    .......

    1msnbekle
    call flash
    call flash
    call flash
    call flash
    call flash
    call flash
    call flash
    call flash
    call flash
    call flash
    return

    Bunlar çalışır mı? Çalışmazsa çalışabilecek bir halde yazabilir misin rica etsem,
  • Anlamadım ?

    quote:

    Orjinalden alıntı: AnarKin

    HYP yüzbaşım kitabını bekliyorum haberin olsun ilk müşterin ben olacağım emin olabilirsin



    @yenimezun:

    Yazdıklarının hepsi çalışır. Çalışmaması için geri dönüş olmadan sürekli call yapman lazım. Dikkat edersen ilk örnekte call DELAY yapınca yığına ilk dönülecek adresi atıyorsun. Sonra call 1msbekle diyorsun dönülecek adresi yazıyorsun. 1msbekle rutini bitince geri dönüyorsun yığın boşaldı. Dolayısıyla bu gibi durumda bir sorunla karşılaşmazsın. Gelelim ikinci örneğe burda önce DELAY'a dallanıp dönüş adresini yığına atıyorsun, sonra 1ms bekleye dallanıp buranın dönüş adresini de yığına atıyorsun. Sonra buradan da falsh alt programına dallanıp buranın dönüş adresini yazıyorsun. Yani yığında toplam 3 adres oldu. İlk flash alt programından geri dönünce yığında bir yer boşalıyor. Sonra tekrar flashı çağırıyorsun tekrar 3 oluyor. Böyle gidip hiç bir zaman 8 seviyeyi de doldurmuyorsun.

    call ap1


    ap1
    call ap2


    ap2
    call ap3


    ap3
    call ap4

    ap4
    call ap5

    ap5
    call ap6

    ap6
    call ap7

    ap7
    call ap8

    ap8

    BURADA DA BİR DALLANMA YAPARSAN ap1'i çağırdığın satıra geri dönemezsin. Çünkü yığına yazacağın son veri ile dönüş adresini ezersin




  • Duyduğuma göre kitap çıkarıyormuşsunda ondan dedim yoksa yokmu böyle birşey ?
  • Uçmuş gördüm seni Kitap yazmak akademisyen işidir. İşim olmaz
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • quote:

    Orjinalden alıntı: HYP

    Uçmuş gördüm seni Kitap yazmak akademisyen işidir. İşim olmaz


    öyle diyosan ..




  • HYP üstadım.Bu konuyu kime sorsam bu kadar net bir biçimde izah edememiştiHerşeyden önce gösterdiğin ilgi ve sabırdan dolayı sana fazlasıyla teşekkür ediyorum. Özür dileyerek bir şey daha sormak istiyorum. Aynı durumu INTERRUPT için de bir örnekle açıklayabilir misin mümkünse?
  • Bu nasıl bişey oluyor, anlamadım. 255 adres ileri mi demek istedin acaba? Her neyse...

    quote:

    Orjinalden alıntı: profahmet

    call komutunu 255 defa dallandırabiliyor goto komutuda 1024 defa


    @yenimezun; durum kesme içinde aynıdır. PIC'e bir kesme geldiği zaman o an çalışan komutun bitmesi beklenir daha sonra dönüş adresi (yani sonraki komutun bulunduğu adres) yığına atılır ve kesme vektörüne gidilip (0x004) kesme hizmet programı çalıştırılır. Kesme hizmet programı bittiğinde ise (retfie ile) yığından dönüş adresi alınır ve ana program koşturulmaya devam edilir.

    Peki bu kadar şey anlattık. Madem anladığını da söylüyorsun. O zaman şu soruya cevap ver: bir kesme geldi, ve kesme programı koşturulurken ikinci bir kesme gelirse ne olur

    Edit: yazım hatası



    < Bu mesaj bu kişi tarafından değiştirildi HYP -- 15 Ocak 2006 1:58:01 >




  • Üstadım
    Bildiğim kadarı ile bir kesme geldiği anda (PIC için konuşuyorum) Diğer kesmelerin gelmesi engelleniyordu. Sanırım GIE PIC tarafından donanımsal olarak bloke ediliyordu. Yanlışsam lütfen düzelt:)
    Aslında sormak istediğim bir başka şey var ama çok mu oluyorum diye utanıyorum
    Bir program yazmıştım.(Hala da tam anlamıyla çalıştıramadım) Bu program içinde 250 satırlık bir tablo var (analog giriş voltajını düzeltilmiş dijital göstergeye çevirmek için). Diyelim 0 - 50 arası bir okuma yapacağım giriş voltajına göre. Tabloyu (PIC 16F870 kullanıyorum) program belleği içinde değişik yerlere koyduğumda programın çalışma kararlılığı da değişiyor. Örneğin tabloyu kodların en sonuna aldığımda 0-35 arası doğru okurken 35 ten sonra program kilitleniyor. Tabloyu başa aldığımda program hiç çalışmıyor. ORG komutu kullanmayı denedim, ama sonuç alamadım. Bu konuda da değerli fikirlerini alsam diyorum




  • Fena cevap değil. Peki ya iç içe kesme kullanmak istiyoruz. Bunun üstesinden nasıl geleceğiz? Boşver cevap verme verdikçe sormaya devam ediyorsun çünkü

    Bu arada sorularının cevabı için sana PIC16F877'nin katalog notlarını okumanı tavsiye ediyorum. Sora sora bitmez yoksa. Ama kısaca şunları söyleyebilirim: PCL ve PCLATH diye bir başlık olmalı ve o başlık altında muhtemelen ADDWF PLC komutu ile sadece program sayıcının düşük anlamlı 8-bitlik kısmına müdehale hakkın olduğu için bu yolla ancak 256 adım atlayabileceğini ve call/goto komutu ile ancak 2k'lık bir bellek bölgesinde atlama yapabileceğini söyler. Örneğin Program belleğinde sona doğru yerleştiridiğin bir tabloya her yerden erişemezsin. Page (sayfa) seçimini kendin ayarlaman lazım. Detay için katalog bilgileri ve sadece bu konu için yazılmış olan "Implementing a Table Read (AN556)" adlı uygulama notunu okumanı tavsiye ederim.




  • Çok teşekkür ederim Tamam artık sormuyorum
  • hocam sizle bir kitap yazalım hatta siz söyleyin ben yazayım siz yorulmayın
  • Bir kitap geyiğidir gidiyor bakalım ne olacak Ha Prentice Hall, Kluwer, CRC veya IEEE'den teklif gelirse hayır demem tabii
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.