Amiga Dünyası sayı 8, sayfa 30

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 30

Merhaba Assemblercılar. Yazı dizimize, geçen sayıdaki son örneğimizin açıklaması ile devam ediyoruz. Program örneğimizin ilk iki satırını geçen sayıda anlatmıştık. Şimdi, üçüncü satırı kaldığımız yerden itibaren incelemeye devam edelim.

Üçüncü satıra, hatırlama mahiyetinde bir göz gezdirin. Buradaki Cmp komutunun işlevi şu şekildedir:

Karşılaştırma komutunu (Cmp) kullanarak P harfinin ascii kod karşılığı olan hexadecimal $50 veya decimal 80 değerini, A0 adres registerinde bulunan adresin gösterdiği hafıza adresindeki sayı ile karşılaştırıyoruz. Programımızı düşünürsek; buradaki A0, ilk girişte buffer bölgemizin başlangıcını ifade etmektedir. Bu komut ile biz, ilk byte'ın P harfi olup olmadığını kontrol ediyoruz. Bu adreste duran sayının P olup olmamasına göre işlem sonucundaki etki değişecektir.

Bu işlemin sonucu, bir alt satırda değerlendirilecek.

SATIR-4: BNE L2 İşlemci, bir önceki komutun system flagları üzerinde bıraktığı etkiyi buradan okuyarak durumu inceler ve olumlu bulursa işlem akışı Bne komutundan bir sonraki komut ile devam eder. Yukarıdaki işlemin sonucu olumsuz çıkarsa, Bne komutunun gösterdiği adrese atlama yapılır.

SATIR-5: CMP.B #"E",1(A0) İşlemcinin buraya gelebilmesi için, bir üst satırdaki bne komutundan kurtulması gerekmektedir. Programdaki ikinci cmp komutu ile A0 adres registerindeki sayıya bir değer daha ekleyerek, şu sonuca varıyor:

Bu komut işleme girdiği anda, A0'ın içerdiği değer buffer değeridir. Bu komuttaki 1 (A0) değeri ise buffer+1'i temsil etmektedir. İşlemci, programın ilk turunda buffer+1 adresindeki değerin E harfi olup olmadığını kontrol etmektedir.

SATIR-6: BNE L2 Yukarıdaki işlemin sonucu olumlu ise, yani harf bulunmuşsa bir sonraki komuta, bulunmamış ise L2 label'ına atlama yapılır.

SATIR-7: CMP.B #"R",2(A0) İşlemci buraya kadar geldiğinde, aratma

ÖMER SİNAN POLAT yaptığımız ilk iki harf bulunmuş demektir ve üçüncü harfin R olup olmadığını kontrol ediyoruz. Tabii ki 2(A0) ifadesi, ilk turda buffer+2 değeri taşıyor. Bir başka deyişle; A0'ın içeriğindeki değerin, 2 fazlasını ifade ediyor. Buna ek olarak, iyi huylu Cmp komutu A0+2'ye bakarak R harfi olup olmadığını karşılaştırır. Her zaman olduğu gibi bu işlemin de sonucu bir alt satırda değerlendirilecektir.

SATIR-8: BNE L2 Üçüncü harfin bulunması ile, bne komutu işleyişe bir alt satırdan devam eder. Eğer bulunamazsa L2 'ye atlanarak devam edilir.

SATIR-9: CMP.B #"I",3(A0) Aranacak karakter dizisinin dördüncü ve son harfi olan I'nın P harfinden uzaklığı olan +3'üncü adrese bakılır. Ve sonuç system flaglarına gönderilir.

SATIR-10: BNE L2 İşlemcinin bu satırdaki hareketi şöyledir: Son harf de bulunacak olursa, bir alt satıra git. Bulunmazsa L2'ye atla.

SATIR-11: JMP L3 Bu satırda, artık aratma yaptığımız karakter dizisini bulduk demektir. L3 label'ının gösterdiği adrese atlayarak oradaki RTS ile programdan çıkılır.

SATIR-12: L2: ADD.L #1A0 Programda 4 defa kullandığımız bne komutunun hedefi, işte bu satırdır. Görevi, A0 adres registerindeki değeri bir artırmaktan ibarettir.

SATIR-13: CMP.L A1, A0 Bildiğiniz gibi, programın başında A1 registerine bufferend değerini göndermiştik. Burada da bir önceki satırda yaptığımız işlem sonucu olan A0'ın değeri ile A1'i karşılaştırıyoruz. Amacımız tabii ki aratma yapılan bölgenin sonunun gelip gelmediğini kontrol etmek.

SATIR-14: BNE L1 Burada, üst satırın sonucu değerlendiriliyor. Sonuç olumlu ise (yani A0 ile A1 adres registerlerinin karşılaştırıldıklarında ortaya çıkan işlemin sonucu) program 15'inci satıra gelir ve durur. Böylece kısa programımız aratılan karakter dizisinin bulunamadığı sonucuna varır. SATIR-15: L3: RTS Bu komut programdan çıkışı sağlar.

AMIGA ASSEMBLER

SATIR-16: buffer: dc.b "ABCHG KPOIDFPEGFGDPERIDFfJEH^ETRYREY"

Arama yapılacak hafıza bölgesi burası olmaktadır. Byte olarak tanımlanan bu bölge, aynı zamanda ascii kodlama olarak bir dizi karakterler içermektedir.

SATIR-17: bufferend: Buffer olarak isimlendirilen bölgemizin sonunu gösteren label'dır. Bu satırdaki label; işlemcinin, programın akışı esnasında son olarak okuyacağı adresin tanımlaması için konmuştur.

Son örnek programımızı genel olarak özetlemek gerekirse:

A- İlk iki satırda, arama yapılacak bölgenin başlangıç ve bitiş adreslerini A0 ve A1 adres registerlerine yerleştiriyoruz. B- Üçüncü satırdan itibaren programımızın arama döngüsü başlıyor. Üçüncü satırdaki Cmp komutu ile, A0'daki yeni buffer bölgemizin ilk byte'ının P harfi olup olmadığı kontrol ediliyor. Sonuç hayır ise, A0'daki değer (yani, programa başlarken söz konusu bölgenin başlangıcını temsil eden değer) bir artırılarak (satır 12'deki Add komutu yardımı ile) üçüncü satıra geri dönülür ve yeni adreste (arama bölgesinin ikinci byte'ında) P harfinin ASCII kodu aranır. Bulamadığımızı düşünelim. İşlemci P harfini bulana kadar 3-4- 12-13-14 döngüsünde gidip gelecektir. Tabii A0'daki, yani değişken olarak kullandığımız bu registerdeki değeri her turda bir değer artırarak işleyişe devam etmektedir.

Bu döngü esnasında, üçüncü satırın P harfine rastladığını düşünelim. Buradan itibaren de döngünün akışı çok basit bir mantık ile olmaktadır. İşlemci, şimdi beşinci satırdaki cmp komutu ile E harfinin P'den sonra gelip gelmediğini kontrol ediyor. 5. satırdaki karşılaştırmanın da 6. satırda olumlu karşılandığını ve P-E harflerinin sıralı olarak arka arkaya bulunduğunu varsayalım. Şimdi işlemci, 7. satırda öngörülen R harfinin E'den sonra gelip gelmediğine bakıyor. Buradaki yönergenin de olumlu olduğunu düşünerek 9. satıra geliyoruz. Şimdi sıra, son harf olan I harfine geldi. Bu harfin de bulunup bulunmadığına bakılarak sonucunu iki türlü değerlendirmeye tabi tutuyoruz.

1- L2 label'ına gidilip yeni bir değer alınarak arama işlemine P'den itibaren devam edilir.

2- PERİ karakter dizisi bulunarak program durdurulur. Tabii sonuç adres (PERİ kelimesinin hafızadaki başlangıç adresi) A0'da durmaktadır.

Aslında arama programlarında bu tür bir döngü çok esnek kullanımlı olmasa da, belli bir formata sıkı sıkıya iş görmektedir. Ve aynı zamanda anlaşılabilirliği en kolay olan döngü olma özelliği taşımaktadır. Tabii aynı iş, binbir türlü rutinlerle de yapılabilir.

Evet. Şimdi size makina dilinden başka dillerde çok büyük zaman alan sıralama işlemlerine bir örnek vereceğim.

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