Stack kullanmaya niyetlendiğinizde bilmeniz gereken çok önemli bir konu var. Hatırlarsanız, JSR komutundan bahsederken, CPU bu komutu gördüğü zaman o anda bulunduğu yeri kaydeder ve alt programa atlar demiştik. İşte bu kaydetme işi stack'te olur.
CPU JSR komutunu gördüğü zaman jsrden bir sonraki komutun adresini oluşturan iki baytlık değeri (küçük ve büyük baytlar) stack'e push eder. Daha sonra alt program çalışıp bittiğinde, RTS komutuna gelindiği zaman, CPU stack'ten iki değeri pop edip bu iki değeri Program Counter'a yazar. Böylece program kaldığı yerden devam eder.
Dikkat ederseniz bu yapı alt programlardan, başka altprogramları çağırabilmenizi de sağlar. Mesela bir JSR ile bir altprograma atladığınızda dönüş adresi stack'e iki bayt olarak push edilir. Ardından rts demeden once bir jsr komutu daha gecerseyenı bı alt programa atlanır ve ıkı yenı bayt daha stacke push edilir. Daha sonra rts komutu gorulurse, yapılan son jsr yüzünden stack'e push edilmiş olan adres baytları ilk pop edilecek (son giren ilk çıkar). böylece içiçe pekçok alt program çağrılabilir. Bunun sayesinde programlarınız bir ana programdan çağrılan alt programlar, ve onların çaırdığı daha alt programlar şeklinde hiyerarşık bir yapıda tasarlanabilir.
Burada iki tehlike söz konusudur:
stack overflow: yani stack taşması. Bu durum çok fazla push işlemi sonucu SPnin 0'a kadar azalıp daha sonra $ff'e dönerek stackteki önceden push edilmiş dataların üzerine yazmaya başlaması. Bunun sonucu çok büyük olasılıkla programın kilitlenmesi olacaktır.
stack'te dengelenmemiş push ve poplar. Her alt programda kac tane bayt push edilmişse o kadar beytın pop edilmesi gerekir. Mesela bir alt programda bir bayt (mesela 0 olsun) push eder ve rts'den önce pop etmezseniz şu durum oluşur. Stackteki son üç bayt sırasıyla 0, donüş_adresi_küçük_bayt, ve donüş_adresi_büyük_bayt olur. rts komutu gelsiği anda stackten dönüş adresi olarak son iki baytı yani yanlış iki baytı alır ve yanlış adrese döner. Bunu da sonucu çoğu zaman programınızın kilitlenmesi olacaktır.
Bu yüzden programınızı yazarken, bir alt programdan dönmeden önce mutlaka push ettiğiniz her baytın pop edildiğini ve fazladan bir pop işlemi olmadığını kontrol etmelisiniz.