Amiga Dünyası sayı 7, sayfa 43

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 43

Merhaba. Yeni bir örnek programla yazı dizimize devam ediyoruz. Yine her zamanki gibi örneğimizi yazıp, her satırı tek tek size anlatacağım.

Bu sayımızdaki örnek programda amacımız; belli bir hafıza bölgesinde bir veya birkaç byte'ı aramak olacaktır.

Diyelim ki arama yapacağımız hafıza bölgesi buffer'dan bufferend'e kadar olan 10 byte uzunluğundaki hafıza bölgesi ve aramamız gereken değer ise 5 değeri olsun. Amacımız buffer ile başlayan bu bölgede 5 değeri taşıyan byte'ın hafıza adresini bulmak olacaktır.

Yine size aynı işi yapan birkaç örnek program sunacağım ve siz de aynı işin değişik şekillerde nasıl yapıldığını göreceksiniz.

ÖRNEK PROGRAM 3a:

1 START: LEA bufferA0

2 LEA bufferend,A 1 3 Ll: CMP.B #5,(A0) 4 BEQ L2 5 ADD.L #1,A0 6 CMP.L Al A0 7 BNE Ll 8 L2: RTS 9 Buffer: dc.b0,0,0,0,0,0,0,0,0,0, 0,0.0,0,5,0,0,0,0,0 lOBufferEnd:

Şimdi ilk örneğimizin açıklamasına geçelim. Rutinin her satırını tek tek açıklıyorum.

SATIR-1:

START: LEA buffer,A0 Programın başlangıcını, aratma yapılacak hafıza bölgesinin başlangıcını temsil eden değer olan buffer değerini A0 adres registerine atamak ile yapıyoruz.

SATIR-2:

LEA bufferend,A1 İkinci satırda aynen birincisi gibi ama bu sefer arama bölgesinin sonunu belirten bufferend değerini A1 adres registerine gönderiyoruz. Böylece üzerinde çalıştığımız hafıza bölgesinin başlangıç ve bitiş değerlerini adres registerleri üzerinden kullanabiliriz.

SATIR-3:

L1: CMP.B #5,(A0) İşte arama yaptığımız ilk satır burası. Şu anda A0 registerinde buffer değeri yani hafıza bölgemizin ilk byte'ı bulunmaktadır. Ve biz

CMP komutu ile A0 adres registerinin gösterdiği hafıza adresinde 5 sayısı var mı ona bakıyoruz. Örneğimizde bu hafıza adresinde 5 değeri olmadığına göre bu satır olumsuz sona erecektir. Ve durum system flaglarına iletilecektir.

SATIR-4:

BEQ L2 Branch komutlarından BEQ kullanıp bir satır önceki işlemin sonucunun 0 (yani cmp.b #5,(a0) satırının sonucunda eşitsizlik) olup olmadığına bakıyoruz. Yine örnek üzerinden yola çıkarsak bu işlemin sonucunun 0 olmadığını (5 eşit değil 0) görürüz.

Öyleyse beq komutu L2 Label'ına atlama yapmayacak demektir. Diğer bir deyişle beq komutu system durum flagları üzerinde araştırmasını yapıp sonucu özelliği üzerinde değerlendirip bir alt satırdan işleyişe devam etmesi gerektiğine karar veriyor.

SATIR-5:

ADD.L #1,A0 Önceki iki satırda arama bölgesindeki ilk byte'ın kontrollerini yapmış oluyoruz ve aramamız gereken değer olan 5 değerinin bu byte'a eşit olmadığını görüyoruz. Şimdi yapmamız gereken şey ise arama yapılacak bölgedeki bir sonraki byte'ı aranacak sayı ile (5) karşılaştırma yapmamız gerekiyor.

Bu iş için de Buffer+1 değerine ulaşmak için bu satırı kullanıyoruz, add.l #1,a0 ile A0 adres registerindeki hafıza adresinin değerini bir artırıyoruz ve böylece A0 bu satırdan itibaren buffer+1 değerine sahip olacaktır.

SATIR-6:

CMP.L A0,A1 Bir önceki satırda A0'ın içeriğini bir değer artırmıştık. Ve şu anda değeri buffer+1 olmaktadır. Aynı şekilde programa başlarken A1 registerine de bufferend değerini yani arama bölgesinin en son yerini belirlemek için kullanmıştık. Şimdi bu satırda A0 ile A1 registerlerinin karşılaştırmasını yapıyoruz. Amacımız ise A0 registerinin bufferend yani arama bölgesinin sonunu geçip geçmediğini kontrol etmek oluyor. Açıklamaya bir alt satırdan devam ediyoruz.

SATIR-7

BNE L1 Bu komut bir üst satırdaki komut ile bağlantılı olarak çalışıyor. Satır-6; A0 ve A1 adres registerlerindeki değerlerin eşit olup olmadığını kontrol ederek durumu system flaglarına yazı-

AMIGA

yor. Ve Satır-7'de durumu system flaglarından okuyup sonucu değerlendiriyor. ASSEMBLER

Rutinde bu satır aynı zamanda rutin döngüsünün son satırını temsil etmektedir. Ve son işlemin sonucu (A0 ile A1'in karşılaştırmalarının sonucu) eşit (0) oluncaya kadar L1 olarak isimlendirilmiş label'a (SATIR-3)'e geri dönüyor.

Buraya kadar oluşturduğumuz satır-3'den satır-7'ye kadar olan döngü sonucunda arama bölgesinin sadece bir byte'ını kontrol etmiş olduk. Döngünün son satırı ile arama bölgesinin sonuna ulaşmadığımızı görünce counter olarak kullandığımız A0 registeri yardımı ile arama hafıza bölgesinin bir sonraki satırını kontrol ediyoruz.

Bu işlem bufferend-buffer kadar (bu bölgenin 20 byte olduğunu düşünürsek 20 defa tekrar ediliyor.) sürecektir.

SATIR-8:

L2: RTS işlemci bu satıra iki türlü gelebilir. Birincisi satır-6 ve satır-7'deki arama yapılan hafıza bölgesinin sonunun gelip gelmediğini kontrol eden cmp ve bne komutlarının etkisi ile döngüden kurtulabilir.

İkinci olarak aratılan sayıyı (5) bulduğunda (satır-3 ve satır-4'den) satır-4'deki beq L2 komutu ile döngüden çıkabilir.

Tabii bizim verdiğimiz örneği göz önüne alarak sonucu değerlendirdiğimizde aratılan hafıza bölgesinin 15'inci byte'ındaki 5 değeri olduğunda bilgisayar bu satıra satır-4'den inebilir. Yani arama işlemi sonucunda aranan sayı bulunmuş olacaktır.

SATIR-9:

Buffer dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0, 0,0,0,0 Bilindiği gibi bu satır örneğimizdeki arama bölgesinin kendisini oluşturmaktadır. BUFFER olarak adlandırdığımız bu hafıza bölgesinin uzunluğu 20 byte'dan oluşmaktadır. Daha öncede anlattığım gibi dc.b ifadesi bu bölgeyi oluşturan verilerin birer byte olarak dizildikleri anlamına geliyor.

SATIR-10:

Bufferend: Bu satırda yapmak istediğimiz olay, bir önceki satır ile doğrudan ilgilidir. Yani bu satırda bulunan ve tek bir bufferend: isimli label; 20 byte olarak tanımladığımız buffer isimli hafıza bölgesinin sonunu belirlemek için kullanılmaktadır.

Programımızın genel amacı 5 değerli byte'ın hafıza adresini bulmaktı. Bu da buffer+15 adresi olmaktadır.

Kısa rutinimizin asıl kısmında, buffer bölgesinden tek tek byte'ları alıp 5 değeri ile karşılaştırdık. Arama bölgemizin sonunu belirlemek için şu yolu kullandık.

Rutinin başında bufferend label'ını A1 adres registerine gönderdik. Sonra ana döngünün sonunda her defasında bufferend'e ulaşıp ulaşmadığımızı kontrol ettik. Şimdi örneğimizin bir başka şeklini göreceksiniz.

Klavyeyle gezinmek için ← ve → tuşları.