Fonksiyon Çağrılarında Yazmaç Değerlerinin Korunması

07:09 , ,

Sembolik makine dilinde bir fonksiyonu CALL ettikten sonra akış geri döndüğünde yazmaçların durumu ne olacaktır? CALL edilen fonksiyon yazmaçların değerlerini değiştirmiş olabilir. Bu durumda CALL etmeden önce çağıran fonksiyon yazmaçlarda belli değerleri saklamışsa CALL işleminden sonra artık o değerlerin yazmaçlarda olmayabileceğini göz önüne almalıdır. İşte bu konuda da çağıran fonksiyonla (caller) çağrılan fonksiyon (callee) bir anlaşma yapabilirler. Bu anlaşmaya göre çağrılan fonksiyon bazı yazmaçları koruyabilir, bazılarını korumayabilir. Örneğin C derleyicilerinde pek çok çağırma biçiminde çağrılan fonksiyonun EAX, ECX ve EDX yazmaçlarını bozmasına izin verilmiştir. Ancak diğer yazmaçları çağrılan fonksiyon korumalıdır. Yani onların değerleri akış fonksiyona girdiğinde neyse çıktığında da aynı olmalıdır. Tabii bazı yazmaçların korunmasında bir anlaşma yapılmışsa bu durum çağrılan fonksiyonun o yazmaç değerlerini hiç değiştirmeyeceği anlamına gelmez. Çağrılan fonksiyon eğer bu yazmaçların değerlerini değiştirecekse önce onların değerlerini saklaması gerekir. Bunun için stack kullanılmaktadır. Korunması istenen register değerleri fonksiyona girmeden push eder ardından fonksiyondan çıkmadan önce de pop eder geri yükleyebilir. Ancak onları bu biçimde koruma sorumluluğu çağrılan fonksiyona aittir.

Çağıran ve çağrılan fonksiyonların her ikisini de biz yazacaksak hangi yazmaçların çağrılma sırasında çağrılan fonksiyonlar tarafından korunucağını yine biz kendimiz belirleyebiliriz. Eğer biz yalnızca çağrılan fonksiyonu yazacaksak bu durumda çağıran fonksiyonun hangi yazmaçların korunacağı konusundaki beklentisini karşılamamız gerekebilir. Eğer biz yalnızca çağıran fonksiyonu yazacaksak çağrılan fonksiyonun hangi yazmaçları koruduğunu bilmek yine bize fayda sağlayabilir. Örneğin biz programın büyük kısmını C’de yazmış olalım ve oradan sembolik makine dilinde yazmış olduğumuz fonksiyonu çağırmak isteyelim. Bu durumda bizim C derleyicisinin yazmaç koruması konusundaki beklentilerini karşılamamız gerekir. Çünkü derleyici bazı yazmaçların fonksiyon tarafından bozulmayacağı beklentisiyle fonksiyon çağrısından sonra o yazmaçlardaki değerleri kullanıyor olabilir. 

Sonuç olarak ileride karşımıza çokça çıkacak yazmaç değerlerinin korunması ile ilgili kullanılan yöntemler bu şekilde daha anlaşılır hale gelecektir umarım.