Bu sayfadaki yazılar
Sayfanın metni
Sayfa 46
LDA y£ SOA 10 olarak)
Bu adresleme tipinin karakteristik belirleyicisi, yüklenecek değerin hemen önünden gelen # işaretidir. Direkt adresleme akümülatör'ün doğrudan $0A (onaltılık olarak $0A) değeriyle yükleneceğini gösterir. Bu işe karşılık gelen BASIC komutu ise:
0
Bu adresleme tipi herhangi bir register'e sabit bir değeri yüklemek için kullanılır. Bu adresleme tipi X- ve Y- Register'leri için de vardır. Bunlara örnek olarak:
LDX LDY $AB
verebiliriz. Burada X-Register'i $7F (ondalık olarak 127) değeriyle, Y-Register'i $AB (ondalık olarak 171) değeriyle yüklenir. Bu adresleme tipinde aynı zamanda yüklenmesi gereken değer de makine dili programın bir parçası haline gelir. Hafızada komut ve yüklenmesi gereken değer peşpeşe Byte'lar olarak durur. Makine dili programı bu adreste yürürken bu Byte'ı alır ve bunu bir komut olarak yorumlar. Diyelim ki komut olarak $A9'a (ondalık olarak 169) rastladı; ana işlem ünitesinin içindeki karmaşık devreleri hemen bunun bir LDA #$.. komutu olduğunu algılar. Aynı karmaşık devreler bu sefer de bir sonraki Byte'ın komut değil de veri olacağına karar verirler. Bir sonraki Byte okunur ve değeri akümülatör'e yüklenir. Burada gördüğünüz gibi bu işlem toplam olarak iki Byte sürüyor (komutun kendisi bir Byte; yüklenecek veri diğer Byte olmak üzere). Ana işlem ünitesi bir komutun başlangıcından, bu komutun bitimine, bir sonraki komutun başına kadar program sayacının değerini otomatik olarak iki artırır. İkinci olarak absolut adresleme tipini inceleyelim. Bu adresleme tipi register'e sabit bir değer değil de, bir hafıza biriminin (adreslenebilir bir Byte'ın) içeriğini yüklemek için kullanılır. Örnek verecek olursak:
LDA $COAF
Burada akümülatör'e $C0AF adresinin içeriği yüklenir. Şimdi ufak bir sorun çıkıyor. Bu işlem hafızada nasıl yerleşmekte?.. $C0AF adresi 16-bitlik bir sayıdır ve bu özelliğinden dolayı bir Byte'a sığmaz. Hemen herkesin aklına gelen çözüm pratikte de gerçekleşiyor ve 16-bitlik bu sayı 8-bitlik iki sayıya bölünüp hafızaya öyle yerleştiriliyor. Bu arada 65XX serisi ana işlem ünitelerinde geçerli olan bir kuralı hatırlatalım: Önce düşük basamaklı Byte, peşinden yüksek basamaklı Byte geliyor. Yani 16-bitlik bir sayının önce sağ tarafı, sonra sol tarafı yazılıyor. Şimdi bu işlem hafızada nasıl görünür, bir inceleyelim. Önce LDA komutunun bu adresleme tipine karşılık gelen kod'u $AD (173), daha sonra $AF (175) ve son olarak $C0 (192) gelir. Aynı işlemi yapan satırı yazmak istersek:
Az $COAF
Tabii ki aynı komutun X- ve Y-Register'leri için karşılıkları var. Bunlar için ayrı bir örnek vermeyeceğiz. Çünkü akümülatör'le yapılan işlemden farklı bir şey yok. Diyelim ki ana işlem ünitesi bu işlemi hafızada yürütüyor. Önce komutu tanır, arkasından adresin düşük değerli kısmını (Lo-Byte da denir) okur, onun arkasından adresin yüksek değerli kısmı (Hi-Byte da denir) gelir. Şimdi ana işlem ünitesi tüm bir satırı okudu. Ne yapacağını biliyor, fakat henüz hiçbir şey yapmamış durumda. Burada ana işlem ünitesi kısa bir süre programın kendisinden ayrılır ve adreslemesi gereken bölgeyi adresleyip oranın içeriğini alır ve akümülatör'e yükler. Görüldüğü gibi bu işlem tipi üç Byte sürmekte. Yani bu işlem bittiğinde program sayacının değeri üç artacaktır. Şu ana kadar iki ve üç Byte süren komutları gördük. Bunlardan başka bir de bir Byte uzunluğundaki komutlar var ki bunlar genelde ana işlem ünitesinin içini ilgilendiren veya başka bir deyimle herhangi bir operand'a gereksinim duymayan komutlardır. Burada, birinci bölümde andığımız durum register'inden söz edelim. Yükleme komutları sırasında N (negative) ve Z (zero) flag'ları etkilenir. Diyelim ki örneğimizdeki gibi akümülatör'e $0A yükledik. Bu sayı sıfır olmadığı için Z flag'ı sönük (=0) olacak; bu sayının yedinci biti sönük olduğu için N flag'ı sönük olacaktır. Başka bir adresleme tipi de sıfırıncı sayfa adreslemesidir. Bu adresleme tipi yapı bakımından absolut adreslemeyle eşdeğerdir. Fakat geçerli olduğu adres bölgesi hafızanın ilk 256 byte'ıdır. Bu adres bölgesi $0000'dan $00FF'a kadar gider. Dikkat ettiyseniz, adresin yüksek değerli Byte'ı sıfır değerindedir. Sıfırıncı sayfa ismi de buradan gelmektedir. Açıkça görülmektedir ki bu adresleme tipinde aynı işlem için absolut adreslemeye göre bir Byte tasarruf ediyoruz. Böylece bu işlem hafızada daha az yer tutacağı gibi, aynı zamanda ana işlem ünitesi tarafından belli bir miktar daha hızlı yürütülür. Dezavantaj olarak sınırlı adres bölgesi görünmekle birlikte, avantajlar daha ağırlıktadır. Çünkü bilgisayarımızın önemli sistem değişkenleri (işletim sisteminin bilgisayarı hayatta tutmak için kullandığı hafıza bölgesi) bu bölgede saklanmaktadır. Bir örnek verecek olursak:
LDA $73
Bu işlem hafızaya iki Byte olarak yerleşecektir. Bunlar komutun kendisi olan $A5 (165) ve adresi gösteren $73 (115)'tir. Bu işlemi BASIC'te yazmak istersek:
$73
Tabii BASIC'te vereceğimiz karşılaştırmalı örnekler açısından absolut adresleme ile sıfırıncı sayfa adresleme arasında bir fark görünmeyecektir. Bu arada aklımıza gelmişken bir şeyi hatırlatalım: Sıfırıncı sayfa ile ilgili adreslemeleri, isterseniz absolut adreslemeler ile de yapabilirsiniz. Hiçbir engel yok, fakat size sağlanan avantajı kullanmamakla programınız uzar ve biraz yavaşlar. Önemli bir adresleme tipi de indeksli adreslemedir. Burada X- ve Y- indeks registerlerinin asıl önemini daha iyi kavrayacağız. Bilhassa makine dilindeki özel döngülerde çok kullanılan bu adresleme tipine örnek verecek olursak:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 47
LDA $25B8,X
Burada ilk bakışta görünen absolut adreslemenin indeksleme ile birlikte yapıldığı. Peki gerçekte ne oluyor?.. Gayet basit: Ana işlem ünitesi $25B8 adresini oluşturduktan sonra hemen bu adresin içeriğine saldırmıyor. Önce bu adrese X-Register'inin içeriğini topluyor; yeni bir adres oluşturuyor. Bu adresin içeriğini akümülatör'e yüklüyor. Diyelim ki X-Register'inin içeriği $35. Şimdi ana işlem ünitesinin içinde şöyle bir aritmetik işlem yapılıyor:
$25B8 + $35 = $25ED
Yani sonuç olarak akümülatör'e $25ED adresindeki yazmaçın içeriği yükleniyor. Programın bu bölgesi her defasında değişik bir X- değeriyle yürütülürse elde edilen adres farklı olacağı için her defasında farklı bir değer yüklenecektir. Bu adresleme tipi bilhassa döngülerde ve veri tablolarının işlenmesinde kullanılır. Mesela bir şifreleme tablomuz ve bir şifre çözücü tablomuz olsun, bu ikisi sayesinde bu karışık işlemleri, indeksli adreslemeyi kullanarak basit işlemlerle yerine getirebiliriz. Daha ilerde başka uygulama örnekleri de göreceğiz. BASIC'te bu işlemi yapan satır şöyle bir şey olacaktır:
$25B8
Buradaki X, X-registerinin içeriğini; A'da akümülatör'ü simgelemektedir. İndeksleme işleminde X-registerinin yerine Y-registerini de kullanabiliriz. Örneğin:
25B8,4
LDA
Burada ise Y-register'inin içeriği adrese toplanır ve esas adres oluşturulur. Mesela; böylece birbirinden bağımsız iki döngü değişkenimiz olur ve içiçe geçmiş döngüler kurabiliriz. Sıfırıncı sayfanın da kendine özgü indeksli adresleme tipi vardır. Burada sıfırıncı sayfa adreslemesinin avantajlarının yanında indeksleme işlemini de kullanabilmemiz sağlanır. Bir örnek olarak:
LDA $BA,X
Bu da iki Byte'lık bir komut olacaktır. Şimdi geliyoruz; değişik ve kullanışlı olduğu kadar anlaşılması zor olan bir adresleme tipine, indirekt indekslemeli adresleme. Bu adresleme sıfırıncı sayfanın özelleşmiş bir kullanımı olduğu için sıfırıncı sayfanın önemini daha iyi anlayacağız. Sıfırıncı sayfada peşpeşe gelen iki Byte'ın içeriği bir adres oluşturuyor, daha sonra bu adrese Y-register'i toplanıyor ve esas adres oluşturuluyor. Çok mu karışık?.. Peki, bir örnekle görelim:
LDA ($70),Y
Diyelim ki, $0070'in içeriği $20; $0071'in içeriği $C8 olsun. Bu ikisi birlikte $C820 adresini oluştururlar. Hemen arkadan Y-register'inin indeksleme işlemi geliyor. Diyelim ki Y-register'inin içeriği de $B3. Böylece bu değeri de adresimize toplayarak $C8D3 adresini elde ederiz. Bu adresin içeriği (diyelim ki $C8D3'ün içeriği $4F olsun); akümülatör'e yüklenir. Şematik olarak inceleyecek olursak:
LDA ($70),Y
(870) $20 (871) sC8 $C820 m- $B3 $C8D3 (SC8D3)- $4F
Bu değer de akümülatör'e yüklenir. BASIC'te bu işlemi şöyle yaptırırız:
A-PEEK(PEEK 4112)4256*PEEK(113)4 1)
sT0 si
İndirekt adresleme operand'ın parantez içinde yazılmasıyla ayırt edilir. Bu adresleme tipi çok güçlü program yapılarının kurulmasını sağlar. Çünkü iki Byte süren bir işlemle bütün hafıza elinizin altında. Bu adresleme tipi de döngülerde ve tabloların değerlendirilmesinde kullanılır. Basit indekslemeden daha esnek ve güçlüdür. Çünkü yalnızca bir sayfayı (256 Byte'lık bölge) değil tüm hafızayı işleyebiliyorsunuz. Tabii bu işlemleri yapabilmek için sıfırıncı sayfada iki Byte'lık bir göstergeç hazırlamak gerekiyor. Son olarak indekslemeli indirekt adreslemeyi göreceğiz. Bu tip yukarıda anlattığımızın tersine Y-register'i ile değil X-register'i ile yapılıyor. Genelde kullanımı ötekine göre daha az olan bu adresleme tipinde de sıfırıncı sayfada bir göstergeç bulunuyor. Bu göstergeç esas adresi içeriyor. İndeksleme işlemi ise sıfırıncı sayfa içinde bu göstergecin yerini bulmak için yapılıyor. Daha anlaşılır olması için gene bir örnek üzerinde çalışalım:
LDA (70,X) $08 840 (879)- 820 $2040 (82040)- SA9
Bu değer de akümülatör'e yüklenir. BASIC'te bu satırı şöyle yazarız:
AzPEEK(PEEK(1124 1)
1
Demek ki burada önce X-değeri operand'a toplanıyor ve göstergecin adresi elde ediliyor. Bu göstergecin içeriği alınarak esas adres elde ediliyor ve bu adresten akümülatör'e yükleme işlemi yapılıyor. Bu adresleme tipi pek ender kullanılır ve pek kullanışlı olacağı da şüphelidir. Bu yüzden başlangıçta bu adresleme tipine pek önem vermeyeceğiz. Şimdiye kadar gördüğümüz komutları ve adresleme tiplerini toplu olarak görelim: