Stack size ne için kullanılır ?

Başlatan Maxim, 16 Ekim 2009, 17:21:26

Maxim

Örnek;

Declare STACK_SIZE 20
ile 20 byte bir yer rezerv ediliyor , ne amaçlanıyor ?

pop ve push komutları ne zaman, niye kullanılıyor ?

sanırım picbasic tarafında da kullanılan bir yapı,
hatta her dil için gereken birşey ?

ingilizce açıklamasını okudum ama bir anlam veremedim .

z

Basic icin değil de genel konusursak;

Stack sadece kullanicinin push -pop komut isletimi icin değil call tipi komutlarda geri donus adresinin saklanmasi icin de kullanilir. Ayrica stack, hesaplamalarda parametre aktarimi ve yaz boz alani olarak da kullanilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Maxim

peki pop ve push komutları ne işe yarıyor hocam ?

bir de yap boz alanı gereklimi ?
ağır bir formülü zaten hesaplatabiliyoruz hafızada normalde ?

z

Hesaplama derken,  dilin kendi fonksiyonlarininin islenmesi asamasinda yapilan hesaplardan bahsediyorum.

Ornegin y=sin(5) islemi icin pek cok yaz boz alani gerekir. Dil kullanicisi, sin(5) islemi yapilirken ne tip alt islemler yapiliyor, bu islemlerde hangi degiskenler kullaniliyor ve bu degiskenler nerede tutuluyordan haberi olmaz.

Dili tasarlayanlar, bu tip islemlerde kullanilacak degiskenleri ya stack alaninda yada dil icin reserve edilmis alanda tanimlarlar. (C de islemler ve parametre aktarimi stackta yapilir)

Push ve pop icin genel aciklama yapayim. Diyelimki A degiskeninde bir veri var.

A degiskenine yeni bir deger atamamiz gerekiyor ote yandan da A degiskeninin o anda sakladigi degeri de kaybetmememiz gerekiyor.

Akla gelen ilk cozum

B=A
A=yenideger

seklindedir.

Burada B gibi ramda fuzuli yer kaplayan degisken kullandik.

Halbuki

Push A
A=yenideger

demek yeterlidir.

Ne zaman sakladigimiz A degeri lazim olursa pop A demek yeterli olur.
Boylece B gibi bir degisken kullanmamis oluruz.

Ancak  ilk ornekte, B degeri A nin ilk degerini her zaman saklarken, stack uzerinde yapilan saklama isleminde,  stacka push ile atilip ardindan pop ile veri cekilirse artik saklanan veri stackta kaybolur ve veriye bir daha erisilemez.

Stack islemleri dikkat gerektiren islemlerdir. Son giren ilk cikar mantigi gecerli oldugundan sistemi gocertmek sozkonusudur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Maxim

Son giren ilk cikar mantigi ,
LIFO değilmi ,
last in first out ..

bu bağlamda aklıma geldi ,pic içinde fifo nasıl kullanılıyor acaba ?

first in first out

z

LIFO yada FIFO tarzi islemleri yazilimla kolayca yaparsin.
Circular buffer kullanirsan bu isler daha da kolaylasir.

Ornegin 16 lik bir alan tanimlarsak

y ve x i baslangicta 0 yaparsin.

Mem
  • =dat
    x=x+1
    x= x and 15

    ile verileri buffera atarken

    z=mem[y]
    y=y+1
    y=y and 15

    seklinde de verileri cekersin

    Bu FIFO, LIFO icinde

    Mem
  • =dat
    x=x+1
    x= x and 15

    ile verileri buffera atarken

    x=x-1
    x=x and 15
    z=mem


  • ile verileri cekersin.

    Ornekte crash icin onlem alinmadi, sen gerekli kontrollari eklersin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

remzi

Mikroişlemciler kesmeye veya bir altprograma dallandığında stack pointer'a kaldığı yer yazılır. Görevini tamamlayıp altproramdan ana programa dönerken stack pointerdaki adres bilgisini alarak geri döner. Pop ve diğer komutlar stack pointer'a adres bilgisini yazmak ve okumak için kullanılır...

M_B

@Z Hocam
Ornekte crash icin onlem alinmadi, sen gerekli kontrollari eklersin.

Dediniz.
Hocam Crash olayı nedir birazcık bilgi ve acıklama yapabilirmisiniz.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

fractal

z  hoacm iu stack push pop komutlarını ve kullanımlarını cok iyi açıklamışsın.ünideyken neden anlayamadığımı anlamıyorum şimdide...
Restantum cogniscutur Quantum deligutur

z

Sinirli uzunlukta bir veri alanina bir taraftan veri yazilirken bir baska taraftan bu verileri okurken, okuma indeximiz yazma indexine esit yada yazma indexini asarsa aslinda olmayan veri okunmak isteniyor demektir.

Yada tersine yazma indeximiz okuma indeximize esit yada okuma indexini asarsa bu kezde okunmamis veri uzerine yeni veri yaziliyor demektir.

Eger yazma indexi okuma indexini gecerse veriler ezilir ve sistem coker.
Buna crash oldu diyoruz.  Bunun icin yazma indexi okuma indexini gectimi gecmedimi  diye test ederiz. Eger gecti ise

Su durumlar sozkonusudur.

1- Secilen buffer uzunlugu yeterli değil
2- Veri ureten kaynak cok hizli
3- Verileri isleyen fonksiyon cok yavas

Donanimsal FIFO iceren seriportlarla calisirken bu kontrol  donanim ile yapilir. Eger ezme sozkonusu ise crash flagi (kimi zaman over run da denir)  set olur. Boylece verilerin okunmasi/islenmesinde yavas kalindigi yani bir seylerin ters gittigi anlasilmis olur.

Eger bufferlarla yazilimsal olarak calisirken bu tur durumlardan haberdar olmak istiyorsak crash kontrolunu gene yazilimla yapmamiz gerekir.

Ornegin dairesel bufferda x yazma indeximiz, y da okuma indeximiz ise yazma asamasinda x=y olursa crash durumu sozkonusudur.

Ayni sekilde okuma asamasinda y=x ise bufferda okunacak veri yok demektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

fractal

@z@ bu açıklamalarda süper olmuş.teşekkürler..
Restantum cogniscutur Quantum deligutur

teknikelektronikci

aciklamalar süper elinize saglik

bir sey sorcam 8051 de akümülatör denen olay  vardi pop push da sanirm akümülatöre atiyordu (yanlis hatirlamirosam) pic de de ayni duurm söz konusumu?
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

muhittin_kaplan

8051 de pop ve push SP dan alır ve atar. stack pointer ise herhangi bir dallanmada kullanılır. son gelinen adresi (yani Program Counter değerini) en üste alır. ilk giren son çıkar mantığıyla çalışır.