Amiga Dünyası sayı 5, sayfa 55

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 55

mı yazmak için birkaç gün uğraşacaktık. Monitör programları adı verdiğimiz C Monitör, Amiga Monitör, Süper Monitör gibi programlar yardımı ile bir ölçüde assembler çalışabiliyoruz. Komutları normal olarak harfler ile giriyoruz. Fakat monitör programları ile çalışırken daha önce de örneğini verdiğimiz (n 50000) gibi programın adresleme işleri ile de uğraşmak zorundayız. Makina dili programımızın arasına bir satır eklemek istersek, monitör programlarında bu iş imkansız denebilecek kadar zordur, işte assembler derleyicilerin yararı burada ortaya çıkıyor. Bizi bir sürü sayı ile uğraşmaktan kurtarıp, dikkatimizi programın listesini hazırlamaktan çok rutinlerimizi geliştirmeye çekiyor.

Artık makina dilinde ilk programlarımızı yazmaya başlayabiliriz. Vereceğimiz örnek programlar gözle görülür bir iş yapmasa da şimdiye kadar gördüğümüz komutları daha iyi kavrayıp, makina dili bilgimizde sağlam bir alt yapı oluşturmaya çalışalım.

İlk örneğimiz belli bir hafıza bölgesini bir byte'lık bir sayı ile doldurmak olacaktır.

"buffer:" label'ının ardından gelen dc.b 0,0,0,0,0,0 gibi ifade ise yine benzetme yapılırsa Basic'deki DATA satırlarına benzetilebilir, "dc" ifadesi satırın data satırı olduğunu ve ".b" ise o data satırının formatının ne olduğunu ifade eder. Örnekteki gibi ".b" ifadesi ise formatın byte olduğunu; yani satırdaki verilerin birer byte'dan oluştuğu anlamına gelir. Bu açıklama sonucunda örneğimizdeki bufferend-buffer = 20 Byte olduğunu söyleyebiliriz.

Şimdi örneğimizi satır satır açıklayalım. SATIR-1: START: MOVE.L #buffer,A0 Burada MOVE komutunu LongWord modunda kullanarak doldurulacak hafıza bölgesinin başlangıcını temsil eden "buffer" label'ını A0 Adres Registerine atıyoruz.

Amacımız, verilerinin bulunduğu hafıza bölgesinin başlangıcını temsil eden buffer label'ını bir adres registeri (A0) üzerinden kullanıp rahat bir işleyiş yapmak. SATIR-2:

Ll: MOVE.B #255,(A0) 255 sayısını doldurma işlemi bu satırda gerçekleşiyor. Move komutunu byte modunda kullanarak, A0 Adres registerinin gösterdiği hafıza bölgesine 255 değerini gönderiyoruz. Bu komut satırı ilk defa işleme girdiğinde, A0 registeri yukarıdaki satırdaki MOVE.L komutu üzerine "buffer" değerindedir ve bağlantılı olarak bu satırdaki komutun etkisi; A0 registerinin bulunduğu hafıza bölgesine atama yapıldığını düşünürsek, buffer'ın gösterdiği hafıza bölgesindeki ilk byte 255 değerini alacaktır. Böylece amacımızın ilk hamlesini yapmış olduk ve buffer'daki ilk byte'ı 255 yaptık. SATIR-3: ADD.L #1,A0 Add komutu, daha önce de gördüğümüz gibi toplama işlemi yapan bir komuttur. Örnekte de A0 adres registerindeki sayıya 1 ekleme işlemi yapıyor. A0 adres registerindeki değerin, bu satıra kadar buffer değerini gösterdiğini düşünürsek ve bu satırda Add komutu etkisi ile değerinin bir sayı arttığını düşünürsek, A0 registerindeki yeni sayı bu komutun icrasından sonra buffer+1 olacaktır.

SATIR-4:

CMP.L #bufferend,A0 İşte Cmp komutuna bir örnek. Bu satırda yapılan iş çok basit. A0 adres registerindeki sayının bufferend label'ının sayı değerine eşit olup olmadığı karşılaştırılıyor.

SATIR-5:

BNE Ll Bir üst satırdaki karşılaştırma işlemi sonucundan eşitlik sonucu çıkmamışsa, icranın Ll label'ının bulunduğu satırdan itibaren devam etmesi gerektiğini ifade ediyoruz. Aslında bizim, son iki satırda kontrol ettirmek istediğimiz şey buffer'dan bufferend'e kadar olan byte'ların 255 değerini alıp almadığı oluyor. SATIR-6:

RTS Cmp komutunun sonucunda, A0 registerindeki sayı bufferend'e ulaşmışsa, bne komutu ardındaki Ll label'ına gitmeyip altındaki komuttan itibaren icra devam edecektir. Tabii bilgisayar burada RTS komutunu görünce de programımızın işleyişi son bulacaktır. SATIR-7 buffer: dc.b 0,0,0,0,0,0,0,0,0,0,0, 0,0,0, 0,0,0,0,0,0 Burası programımızın data satırı. Program işleyişi sırasında tamamı 0 olan değerlerini sırası ile 255 değerine bırakıyor.

SATIR-8: bufferend: Bu satır normalde hiçbir iş yapmaz. Programda tek görevi buffer ile başlattığımız ve 20 adet byte'ın sonunu belirlemek.

Örnek programımızın akışını, eski bilgilerinizi hatırlayarak kavramaya çalışın. Başlangıç için bu mini rutin çok şey ifade etmektedir. Gelecek sayı görüşmek üzere....

ÖRNEK PROGRAM 1 :

1 START: MOVE.L#buffertA0 2L1: MOVE.B #255,(A0) 3 ADD.L#1,A0 4 CMP.L#bufferend.A0 5 BNE Ll 6 RTS

7 buffer: dc.b 0,0,0,0,0,0,0,0,0,0,0.0,0,0,0,0.0,0,0,0 8 bufferend:

Programda amacımız buffer diye adlandırdığınız 20 byte'lık 0 değeri bulunan hafıza bölgesini $ff (decimal=255) değeri ile doldurmaktır.

Bu arada programda kullandığımız birkaç assembler terimini açıklığa kavuşturalım.

Program içinde satır başlarında "START:", "Ll:", "buffer:", "bufferend:" ifadelerini, Amiga Basic'de olduğu gibi label olarak adlandırıyoruz. Anlamı ise hazırladığımız programın, label bulunan satırının markalanmış ve aynı adlı label tarafından anıldığı anlamına geliyor. Programın başka kısımlarında daha önceki komutlara geri dönmek için kullanıyoruz.

SYSTEM FLAGLARININ KOMUT YAPTIĞI N Z V C X HI Büyük ise

- 1 - 1 1

LS Ufak - 0 - - CC Carry - - - - CS Carry 1 - - - 0 - NE Eşit - 1 - - - EQ Eşit ise - 0 - - - VC Overflow - - 1 - - VS Overflow - - 0 - - PL Pozitif 1 - - - - MI Negatif 0 - - - - GE Büyük 1 - 1 - - 0 - 0 - - LT Küçük 1 - 0 - - 0 - 1 - - GT Büyük 0 1 0 - - 1 1 1 - - LE Küçük - 0 - - - 0 - 1 - - 1 - 0 - -5

TABLO 1

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