Amiga Dünyası sayı 8, sayfa 31

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 31

Örnek programımızda; bir hafıza adresindeki 10 adet değerin büyükten küçüğe göre sıralanmasını işleyeceğiz.

Yan sütunlardaki programa bir göz atın. Şimdi sırayla satırların açıklanmasına geçelim.

SATIR-1: START: LEA BUFFER,A1 Programımızın başında, sıralama bölgesinin başlangıcını temsil eden buffer label'ının hafıza adresinin değerini A1 registerine gönderiyoruz. Amacımız, her rutinde olduğu gibi rutinin ana öğelerini temsil eden sayı değeri veya adresleri registerler üzerinden kullanıp rahat bir çalışma ortamı yaratmak oluyor. Zaten başka türlüsü imkansız olurdu herhalde! SATIR-2: MOVE.L A1,A0 Bu satırda, sıralama bölgesinin başını temsil eden A1 registerinin içeriğini A0 adres registerine kopyalıyoruz. Amacımız değişken olarak A0 registerini ve bölgenin başlangıcı olan adresi de A1 üzerinden kullanmak olacaktır. SATIR-3: MOVE.L #10,D2 Sıralanacak değerlerin sayısını burada D2 data registerine yüklüyoruz. Bu değer, bizim programımızda komutta belirtildiği gibi 10'dur.

SATIR-4: MOVE.L D2,D0 Şimdi D2 registerindeki sayıyı, D0 registerine kopyalıyoruz. Bilindiği gibi, D2 data registerindeki sayı sıralama yapılacak değerlerin sayısını ifade etmektedir. SATIR-5: SUBQ #2, D0 Sıralama programımızın işleyişi esnasında, sıralama bölgesinden değerler sırası ile alınacak ve tek tek diğer değerler ile karşılaştırılacaktır. Tabii bu da bir döngü ile olabilir (7. satır ile 15. satırlar arasındaki döngü). Döngüyü sağlayan DBRA komutu 10'dan işleme girdiğinde 0'da son bulacağından ve sıralanacak verilerin zaten ilk ikisi ilk turda işleme girdiğinden gerçek döngü sayısı eksi iki değer oluyor, işte D0'da sıralanacak veri sayısından 2 eksiltmemizin nedeni budur.

SATIR-6: CLR.L D1 İki değeri birbirleri ile karşılaştıracağız. Bu karşılaştırma sonrası, değerler birbirlerinden büyük veya eşit olmalarına göre yer değiştirebilirler. İşte kısa sıralama rutinimiz de, bu mantık ile çalışıyor. Bu satır, aşağıdaki satırlarda göreceğiniz gibi bir göstergeç görevi yapacaktır. Görevi, yer değişecek değer olup olmadığını ve sıralama bölgesindeki son byte'a erişilip erişilmediğini ifade etmektir.

SATIR-7: L1: MOVE.W 2(A0),D3 Bildiğiniz gibi, işlemci bu satırda A0 registerinin buffer değerini aldığını biliyor. 2(A0) ibaresi ile buffer bölgesindeki 2. word'nolu adresteki değeri alıp D3 registerine gönderiyor.

SATIR-8: CMP.W (A0),D3 Bu satırdaki işlem, A0 registerinin içeriğindeki değerin adresi ile D3 registerinin içeriğini karşılaştırıyor. Bu komutun programdaki görevi, buffer bölgemizdeki A0'nolu değer ile bir sonraki değeri karşılaştırmak.

SATIR-9: BCC L3 İşte bir branch komutu. Görevi; yukarıdaki komuttaki işlemin sonucu olan sayı, ilkinden büyük ya da eşit ise atlama yapılacak olan yere git (yani L3 label'ına) olmaktadır.

SATIR-10: L2: MOVE.W (A0),D1 Bir üst satırdaki işlemin sonucunda karşılaştırılan değerler büyük ya da eşit olmadığında, işlemci bu satırdan itibaren icrasına devam edecektir. Word modunda kullanılan move komutu, A0 adres registerinin gösterdiği adresteki sayıyı alıp, D1 registerine gönderiyor.

SATIR-11: MOVE.W 2(A0),(A0) Buradaki move komutu ise, A0 adres registerindeki değerin iki fazlası olan değerin gösterdiği hafıza adresindeki değer ile yine A0 registerinin gösterdiği değerin değişimini ifade ediyor.

SATIR-12: MOVE.W D1,2(A0) Move komutu, D1 registerindeki word değeri A0 registerindeki değerin iki fazlasına koyuyor.

Son üç satırdaki komut birbirleri ile doğrudan alakalıdır. Çünkü karşılaştırılan sayılar büyük ya da eşit olmadığında, bu üç satır yardımı ile yerleri değiştiriliyor. Bu işlem şöyle olmaktadır: Birinci satırda ilk önce A0'daki değer D1'e konmaktadır. Sonra A0'ın gösterdiği değerden sonraki değer, ilk değer yerine konuyor (ikinci komut). Daha sonra üçüncü komut ile D1'deki değer ikinci değer yerine konuluyor. SATIR-13: MOVEQ #1,D1 D1 registerine değerlerin yer değişimi yapıldığını belirtmek için 1 değerini gönderiyoruz. Aşağıda bunun kontrolünü yapacağız.

SATIR-14: L3: ADDQ.L #2,A0 İşlemci, yukarıdaki BCC komutunun sonucunda karşılaştırdığı sayılardan büyük veya eşit sonucu çıkarırsa, o anda söz konusu değerin yerini sağlamlaştırmış demektir. Buradaki ADD komutu yardımı ile bir sonraki word'ün değerini A0 registerine yüklüyoruz.

SATIR-15: DBRA D0,L1 İşte meşhur döngümüzün kilit noktası. Değerler sırası ile büyükten küçüğe doğru bu döngünün filtresinden geçerek tablodaki gerçek yerlerini bulacaktır.

Komut gereği D0'daki değer 0'a ulaşıncaya kadar döngü L1 ile bu satır arasında devam edecektir.

SATIR-16: TST D1

Sıralama yapılan bölgedeki en son byte'a ulaşıldığında ve ondan büyük olmadığı anda, D1 registeri 0 değerinde olacaktır. Ama sıralama işleminin ortalarında devamlı L2 komut dizisine girilip devamlı değerlerin yerleri değiştiğinden, D1 registeri 1 değeri ile buradan çıkacaktır.

SATIR-17: BNE START Bir üst satırın system flaglarına etkisini buradan okuyabiliriz. İşlemin sonucu aynen satır-16 açıklamasındaki gibi gerçekleşecektir.

SATIR-18: RTS Programın nihayeti buradaki RTS komutudur.

SATIR-19: BUFFER: dc.w 3,510,2,6,9,4,1,7,8 Sıralama bölgesi ve karmaşık dizilmiş değerler işte karşınızda. Tabii programın sonucunda bunlar büyükten küçüğe doğru sıralanmış halde olacaklar.

Böylece kağıt üzerinde son örneğimizi vermiş oluyoruz. Artık gelecek sayıdan itibaren uygulamalı örneklere başlayabiliriz. Fakat daha önce örnekleri yazacağımız SEKA ASSEMBLER'i kullanmayı öğreneceksiniz. Gelecek sayıda görüşmek üzere!

ÖRNEK PROGRAM 5a :

1 START: LEA BUFFER.A1

2 MOVE.L Al, A0 3 MOVE.L #10,D2 4 MOVE.L D2,D0 5 SUBQ #2,D0 6 CLR.L Dİ 7 L1: MOVE.W 2(A0),D3 8 CMP.W (A0),D3 9 BCC L3 10 L2: MOVE.W (A0),D1 11 MOVE.W 2(A0),(A0) 12 MOVE.W D1,2(A0) 13 MOVEQ #1,D1 14 L3: ADDQ.L #2,A0 15 DBRA D0.L1 16 TST D1 17 BNE START 18 RTS 19 BUFFER: dc.vv 3,5,10,2,6,9,4,1,7,8

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