Subroutine Çağırmada neden 2 tane indis yazmacı kullanılıyor? (ASM18/C18)

Başlatan strom, 11 Aralık 2010, 19:40:36

strom


Arkadaşlar bilindiği üzere C18'de bir fonksiyonu çağırdığınızda iki tane pointer kullanılır.Bunlar FSR1 (Stack Pointer olarak) ve FSR2 (Frame Pointer olarak) dir.Peki neden Frame Pointer kullanılma ihtiyacı duyulmuş?Stack Pointer kullanılarakta bütün stağa ulaşabiliriz.Bunun için PLUSW komutunda negatif değerli bir W değeri kullanmak yeterli.

Benim aklıma tek bir sebep geliyor.Frame Pointer kullanıldığında PLUSW komutunda W'nin "-" değerleri için parametrelere, W'nin"+" değerleri için local değişkenlere ulaşabiliyoruz ya.Böylelikle W'nin 255 değeri içinde bir değişkene ulaşabiliyoruz.Ancak sadece Stack Pointer kullanıldığında W'nin "+" değerlerinişn anlamı olmadığı için sadece 127 tane değişkene ulaşabiliyoruz.

Acaba başka bir numarası var mı iki pointer kullanılmasının?

tmcone

C18 'de  stack pointer daima software stacktaki bir sonraki boş noktayı gösterir. Frame pointer ise fonksiyonunun hem parametrelerine hem de yerel değişkenlerine hızlıca ulaşmayı sağlar. Bir fonksiyon içerisinden başka bir fonksiyon çağrıldığında, çağıran fonksiyonun frame pointeri stacka kaydedilir. Daha sonra çağrılan fonksiyonun frame pointerı yüklenir. Böylece frame pointer değiştirilse bile stack pointer her zaman bir sonraki boş noktayı gösterir.

Yalnızca stack pointer kullanarak da fonksiyonun değişkenlerine ulaşılabilirdi. Fakat  C18'de  yukarıdaki nedenlerden ve PIC18  mimarisinin C için yeterince elverişli olmamasından dolayı iki pointer kullanımı tercih edilmiş. Bunun 127 ya da 255 değişkene ulaşmakla hiçbir ilgisi olamaz. Çünkü C18 256 byte'tan daha büyük stack boyutlarını desteklemekte; hem FSRxL hem de FSRxH registerlarını artırıp azaltabilmekte. Bu arada 4 byte dan daha büyük ya da çok sayıda parametre geçmek oldukça yavaş ve verimsiz bir işlem. Çok sayıda parametre geçmek için  struct pointer kullanılmalıdır C de. Ayrıca C30 derleyicisini incelerseniz mimarideki değişikliklerin de etkisiyle C18'den çok daha iyi tasarlandığını görebilirsiniz.