Bu sayfadaki yazılar
Sayfanın metni
Sayfa 21
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 20
YENİDEN KONUMLANDIRMA
Aslında JMP komutu ve beş veri biti SİCİM programında gerekli değildir. Onları yalnızca herhangi bir makine dili rutinini uyarmak veya harekete geçirmek açısından çok önemli bir noktayı aydınlatmak için kullandık. Herhangi bir makine dili programını harekete geçirmeden önce, yeniden konumlandırmaya elverişli olup olmadığını tespit etmek zorundayız. Eğer yeniden konumlandırılamıyorsa, çalışması için onu uyarlamamız gerekir. JMP cümlesi tek bitliktir ($4C) ve arkasından iki bitlik bir adres gelmektedir. Eğer BEQ ve BNE (sap) komutlarının hexadecimal bitlerine bakarsanız, ikisinin de iki bitlik komutlar olduğunu göreceksiniz. Bir sapmanın ikinci biti adres değil, offset'tir. Örneğin, adres $1326'daki ilk BEQ komutu şu şekildedir:
01326 FO 06 $132E
Disassembler $F0'ın BEQ komutu olduğunu bilmektedir. $06 (komut yerine getirilmeden önce yenilenerek $1328'e çıkmış olan) mevcut hafıza adresine eklenerek $132E elde edilir. Öte yandan $131C'deki JMP komutu şöyledir:
0131C 4C 24 13 JMP $1324
$4C JMP anlamındadır. $24 $13 ise gerçek adres $1324'ün “düşük bit-yüksek bit” formatındaki halidir. Bu programı hafızaya $131C'den başka bir adreste, mesela $C000'de yüklediğinizi varsayalım. Bilgisayara bu programı $C000'de işleme geçirmesini söylediğinizde, programın ilk komutuyla bilgisayar adres $1324'e atlayacaktır. Programınız $C000'deyken $1324'te ne bulunduğunu Allah bilir. Büyük ihtimalle, bilgisayarı kapatıp yeniden başlamanız gerekecektir. Öte yandan, diyelim ki programın yerini değiştirip yukarıda tanımlanan BEQ komutu gayet güzel çalışacaktır. Neden mi? Çünkü komutun iki biti $F0 $06 sabit değil göreli bir sapma adresi vermektedir. Bilgisayar adres $2000'e vardığında $F0'ı görür ve onu izleyen biti bir sonraki komut adresine eklenecek bir nicelik olarak ele alması gerektiğini anlar. BEQ komutu $2000 ve $2001'de yer aldığına göre, bir sonraki komut adresi $2002'dir. İşlemci $06'yı $2002'ye ekleyip, (eğer sıfır flag'ı setse) $2008'deki komuta sapar. BEQ, BNE ve tüm diğer sapma komutları göreli adresler taşır ve program hafızanın neresinde bulunursa bulunsun kusursuz iş görürler.
Eğer bir programın yerini değiştirip hafızanın başka bir yerinden başlamak istiyorsanız, mutlaka adres kullanan tüm komutları “ayarlama”nız lazımdır. Buna örnek olarak JMP ve JSR'yi (altrutine atla) gösterebiliriz. Mutlak adres (örneğimizdeki $FFD2 gibi) programın dışındaki bir sabit konumdaysa, değiştirilmemelidir. Ama (örneğimizdeki JMP $1324 gibi) yeri değiştirilen programın dahilinde bir mutlak adres söz konusuysa, düzeltilmesi gerekir.
C-64 sahipleri bu programı adres $C000 (49152)'de başlayacak şekilde yeniden konumlandırmalılar. $1324 özgün programda dokuzuncu bit olduğuna göre, yeri değiştirilmiş programda JMP gene dokuzuncu bite, yani $C008'e gidecek. Bu yüzden, JMP $1324 komutu JMP şeklinde değiştirilmeli. Bunun için de, Sicim Yükleyici'ndeki ikinci ve üçüncü veri maddeleri 08 C0 yapılmalı (adres bitlerinin tersten depolandığını unutmayın). BEQ ve BNE ayarlanmadan yerleri değiştirilebildiği için, bunlara “yeniden konumlandırılabilir” komutlar denmektedir. Bir programın “yeniden konumlandırılabilir” olması için yalnızca göreli sapma veya sabit adreslere sapmalar içermesi ve verileri doğrudan adreslememesi gerekirdi. Verilerin dolaylı adreslenmesini başka bir tartışmada ele alacağız. SİCİM Programını yeniden konumlandırılabilir hale getirmek için yalnızca ilk sekiz biti atmakla yetinebiliriz. (Zaten onlar örnek niyetineydi.) Ama başka programlar bu kadar kolay dönüştürülemeyebilir. Bütün atlama komutlarının yanısıra, yükleme, depolama ve hafıza değerleri üzerinde işlem yapmaya ilişkin bütün komutları incelemeniz gerekir. Genel olarak, programın yeri değiştirildiğinde bütün bu adresleri de değiştirmek lazımdır.