AMIGA ASSEMBLER (1)

Amiga; hepimizin hayatının akışını değiştiren bir alet. Zevk ile kullanıyoruz. Amiga ile ders çalışıyor, oynuyor, karmaşık problemlerimizi onun yardımı ile çözüyoruz ve hepimiz (oyun tiryakileri dışında) karınca kararınca kendi çapında, bildiğimiz dillerde, işlerimizi görecek programlar hazırlıyoruz. Yaptığımız araştırmalara göre Türkiye çapında Amiga kullanıcılarının % 95'i BASIC, PASCAL, FORTRAN, MODULA, COBOL gibi yüksek seviyeli dilleri biliyor ve bunlar ile programlarını hazırlıyorlar. Geriye kalan % 5 ise sadece Assembler biliyor. Yüksek seviyeli dillerin başını, hepimizin bildiği gibi BASIC çekiyor. Zaten Amiga ve diğer kişisel bilgisayarların ilk kullanım paketinden BASIC çıktığı için, hepimiz ilk dil olarak onu öğrendik. Ve hiçbirinizin BASIC'i öğrenirken zorlandığınızı tahmin etmiyorum. Basit İngilizce komutlar ile rahatça işimizi görecek muhasebe programları, telefon rehberleri, stok programları yaptık. Amiga'da bu tür ihtiyaçları böylece halletmiş olduk. Fakat Amiga sıradan bir bilgisayar değil. 4096 renkli, 4 kanaldan stereo ses çıkışlı, 880 Kbyte disket formatlı yaklaşık 8 Mhz hızında bir makina. Bütün bu özellikleri profesyonel oyun ve demo programlarından gözleyebilirsiniz. Dört kanaldan muhteşem bir müzik çalarken, aynı anda 32 renkli bir ekran üzerinde hızla hareket eden uçaklar, gemiler, birbirinden güzel efektler, rengarenk yazılar görüntüleniyor. Bütün bunları bir arada düşünüp insan rahat olur mu? Böylesine büyük bir güç, parmaklarımızın ucunda iken neden kontrolümüz dışında kalsın. Gerçi bu özellikleri bir ölçüde Deluxe Paint'in efektleri veya SoundTracker ile karşılıyoruz. Fakat iş Amiga'nın muhteşem grafikleri ve seslerini aynı anda ve en hızlı şekilde kontrol etmeye gelince, en kullanışlı dil olarak Assembler ortaya çıkıyor. Aslında bu tür işler BASIC, PASCAL, MODULA gibi yüksek seviyeli diller ile de yapılır. Fakat yüksek seviyeli diller bazı sorunlar yaratıyor.

Birincisi çok yavaş çalışıyorlar. Daha doğrusu grafik ve müzik gibi işler için hızları uygun değil. 32 renkli bir ekranda basit bir scroll (grafiklerin akıcı bir şekilde kayması) hareketi bile makinaya çok büyük bir zaman kaybettiriyor. Bir de olaya müzik girince, makina C-64'ten bile yavaş hale geliyor.

Bu yavaşlığın sebebi ise; BASIC ve bunun gibi derleyicilerin yapısının bu gibi işlere uygun olmaması. Biz BASIC çalışırken, aslında bilgisayar BASIC komutlarını anlayan ve makine dili komutları dizisine dönüştüren bir derleyiciyi çalıştırıyor. Oysa makine dilinde yazdığımız program hiçbir derleyiciden geçmeyeceği için, sanki makinenin bir parçası gibi tam hızla çalışacaktır. Yazdığımız bir BASIC programı RUN ile çalıştırdığımızda, program listesindeki her komut sırası ile okunur, derleyicide kendileri için yazılmış makine dili rutinlerine gider ve görevleri ne ise onu yaparlar. Yani bilgisayarın içinde işleri gören aslında BASIC'te yazdığımız program değil, derleyicideki her komutun karşılığı olan makine dili rutinleridir. Derleyicideki bu rutinler ise tek bir iş için yapılmayıp genel programlama için oluşturulduklarından, Assembler'daki programlar BASIC'tekinden en az 48 kat hızlı çalışıyor.

Yüksek seviyeli dillerin ikinci dezavantajı ise bilgisayarda çalışırken çok yer kaplamaları ve kullanıcıya fazla çalışma alanı bırakmamalarıdır.

Assembler dili ise bu dezavantajları avantaja çevirmek için en uygun dildir. Özellikle hız bakımından Assembler ile diğer hiçbir dil başa çıkamamaktadır.

Artık neyi anlatmak istediğimi aşağı yukarı anladınız sanıyorum. Amiga'yı tam performans kullanmak için makina dili şart!!! Fakat makina dilini öğrenip diğer dilleri bir köşeye atın demiyorum. Arzu ettiğiniz zaman makina dili programlarınızı BASIC veya diğer dillerde yazılmış programlarınızın arasına sokabilirsiniz. Örneğin BASIC'de geniş kapsamlı bir dosyalama programı hazırladınız ve binlerce isim veya benzeri yazıyı sıralamanız gerekiyor. BASIC sıralama rutininiz yavaş kalıyorsa ve derleyicide sıralama komutu yok ise, buraya Assembler'da yazabileceğiniz basit bir rutin ile programınıza yüksek bir hız sağlayabilirsiniz.

Hep Assembler'ın iyi yönlerinden bahsettik, fakat Assembler'da da bazı sorunlar ile karşılaşacağız. İlk olarak bilgisayarımızın iç mimarisini çok iyi tanımanız gerekiyor. Yani grafik, müzik ve çevresel birimlerin yerleştirildikleri ve kumanda edildikleri hafıza adreslerini çok iyi bilmeniz lazım. Bu da yetmiyormuş gibi Assembler'da yazdığınız programlarda hata yaparsanız, bilgisayar hata yapılan satıra gelip hata mesajı vermiyor. Kilitlenip kalıyor veya GURU MEDITATION'dan bir hata mesajı veriyor. Sonuç olarak bilgisayarı açıp kapamak ya da resetlemek zorunda kalıyoruz.

Assembler dilinin avantaj ve dezavantajlarını da öğrendikten sonra, artık yavaş yavaş 68000'e doğru yaklaşalım. MOTOROLA 68000 adındaki mikroişlemci, 16-32 bit veri kanallarına sahiptir. 68000 işlemcinin 16 MegaByte'lık adresleme kabiliyeti ve MULTITASKING (birden fazla işlemi aynı anda yapmak) diye adlandırdığımız bir özelliği var. 68000 hepimizin bildiği gibi Amiga'da 7.16 Mhz ile çalışıyor. Diğer bir deyişle, saniyede yaklaşık 1 Milyon aritmetik işlem yapıyor.

MOTOROLA 68000 makina dilinde, sadece 56 komut ve bunların bir dizi parametreleri var. Bu komutlardan bazıları 8, 16, 32 bit olarak üç ayrı parametreli olarak kullanılabiliyor. 8 bit olarak kullanıldığında BYTE, 16 bit olarak kullanıldığında WORD, 32 bit olarak kullanıldığında LONG WORD diye isimlendiriliyorlar.

Örneğin BASIC'deki POKE komutunun makina dilindeki karşılığı olan MOVE komutunun 8, 16 ve 32 bitlik üç şekli aşağıdaki gibidir.

MOVE.B 01, DO; Byte olarak kullanım 
MOVE.W 0001, DO; Word olarak kulla- 
nım
MOVE.L 00000001; Long Word olarak 
kullanım.

Bu arada yukarıda bahsettiğimiz Bit, Byte, Word ve LongWord gibi deyimlerin ne demek olduğuna kısaca değinelim.

Bit deyimi, bilgisayarın anladığı en küçük sayı birimidir. Her bit'in değeri 0 ve 1'den oluşan ikili sayı sistemine göre bir sayıdır.

Byte deyimi de 8 bit'in yanyana gelerek bir sayı dizisi oluşturmalarıdır. Yani "01101001" olarak 8 bit'i yanyana getirerek bir BYTE oluştururuz, ikili sayı sistemini yakından tanıyanlar bilirler. Yukarıda örnek olarak verdiğimiz "01101001" Byte'ının değeri: 01101001 = 0(128) + 1(64) + 1(32) + 0(16) + 1(8) + 0(4) + 0(2) + 1(1)

= 105 Bu işlem sonucunda ikili sayı sisteminde "01101001" Byte'ının, ondalık sayı sistemindeki değerinin 105 olduğunu hesaplıyoruz.

Bilgisayar ikili ve ondalık sayı sistemlerinin anlaşılma ve hesaplama zorluklarından dolayı onaltılık sayı sistemi diye adlandırılan, 16 sembolü bulunan bir sayı sistemini daha kullanır. Bu sayı sisteminde "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F" olarak 16 sembol tanımlanmıştır. 0'dan 9'a kadar olan rakamlara ek olarak, A'dan F'ye kadar 6 harf ile tanımlanmış sembol daha vardır. Bunların değeri ise;

A=10 B=11 C=12 D=13 E=14 F=15'dir. İkili sayı sisteminde, sayı haneleri ikinin üsleri olarak artar, onaltılık sayı sisteminde de buna paralel olarak sayı haneleri onaltının üsleri olarak artar.

Onaltılılık sayıların Ondalık sayı sistemine dönüşümü aşağıdaki şekilde yapılır. Örneğin: "DFF101" onaltılık sayı sistemindeki sayının ondalık değeri; D F F 1 0 1 =

13(1048576)+15(65536)+ 15(4096) + 1(256) + 0(16) -

+ 1 = 13631488 + 983040 + 61440 + 256 + 0+1 = 14676225 (ondalık sayı sistemindeki karşılığı)

Makina dilinde WORD, iki BYTE'a ve LONGWORD iki WORD'a karşılık gelir. Bundan ise LONGWORD'un dört BYTE'a da eşit olduğu çıkar. Kısaca aralarındaki ilişki aşağıdaki gibidir.

LONGWORD = 2 WORD =

4 BYTE

Daha ileriki sayılarda ikili ve onaltılık sayı sistemindeki sayıları gösterirken, bunları başlarına koyacağımız %, $ gibi işaretler ile birbirlerinden ayıracağız. $ işareti ile onaltılık sayı sistemindeki sayıları, % işareti ile ikili sayı sistemindeki sayıları temsil edeceğiz. Ondalık sayı sistemindeki sayıların ise önüne hiçbir işaret koymayacağız.

MOTOROLA 68000'İN

İÇ YAPISI

BASIC'de program yazarken belli değerleri, değişkenler diye adlandırdığımız veri saklayıcılarına atarız. Sonra programdaki rolüne göre değerini artırıp azaltır ya da onu bulunduğu değişkenden alıp kullanırız.

Makina dilinde ise programımızda kullanacağımız değişken sayıları, Register (sicil) diye adlandırdığımız veri saklayıcılarına atarız. Mikroişlemci içindeki bu registerler 32 bit uzunluğunda olup, mükemmel bir bilgi alış veriş hızına sahiptir.

68000'de bu registerlerden 17 tane bulunur. Bunlardan 8 tanesi veri saklayıcı register, 7 tanesi adres saklayıcı register, 2 tanesi ise yığın göstergecidir (daha sonra sırası ile açıklanacaktır).

32 Bit uzunluğunun anlamı ise; 32/8 = 4 BYTE demektir. Buradan da 68000 içindeki her register'in 32 Bit = 4 BYTE = 2 WORD = 1 LONGWORD bilgi alabileceğini çıkarıyoruz. Registerlerin alabileceği değerleri rakamsal olarak ifade etmek gerekirse 00000000'dan FFFFFFFF değerine kadar onaltılık sistemde herhangi bir sayı veya hafıza adresi olabilir. Yani aritmetik işlemlerde registerleri kullanırken hiçbir sorun çıkmayacaktır (Commodore 64 Makina dili kullanıcılarının büyük sorunu olan registerlerin 255'den büyük değer alamaması). Registerlerin (diğer bir deyişle değişkenlerin) BASIC'deki değişkenlerden farkları ise şudur: Basic'de hepimizin bildiği gibi değişkenlere A,B,C,D,E,F,G vb. isimler verip, bol sayıda değişken tanımlayıp kullanıyorduk. Fakat makina dilinde veri değişkenleri 8 tane ile sınırlıdır (fakat hiçbir zaman bunların azlığından şikayetçi olmayacaksınız). İsimleri ise D0-D1-D2-D3-D4-D5-D6-D7 olarak tanımlıdır. Registerleri kullanırken bu isimler ile kullanacağız.

Veri Registerinin üç ayrı kullanım modu vardır. Yukarıda 32 Bit olduklarından söz etmiştik. Modları ise; 8, 16 veya 32 bit şeklinde. Yani biz mikroişlemcinin veri saklayıcılarını ister tek byte (byte), ister 2 byte (word), istersek 4 byte (longword) olarak kullanabiliriz. Bu kullanımların farklarını ise bir örnek ile açıklayalım. 0 ile 255 arasında bir sayıyı registerlerin birinde saklamamız gerekiyor. Örneğin D0 no'lu registere atayacağız. D0 no'lu registeri 1 BYTE modunda kullanıma sokarız. Eğer sayımız 0 ile 65536 arasında ise registeri WORD modunda çalıştırmamız gerekir. Ve sayımız 65536'dan büyük bir sayı ise de, registerimizi zorunlu olarak LONGWORD'a programlarız. Bu modların çok iyi izlenmesi ve her registerin modlarının iyi düşünülmesi gerekir. Nedeni ise çok basit; zamandan ve hafızadan kazanmak. Tek bir Byte'a sığabilecek bir sayıyı LONGWORD olarak bir registere atıp onun 4 katı işlem ve hafıza harcamasına mani olmalıyız.

68000'de veri registerilerinden başka, 7 tane de adres registeri olduğunu söylemiştik. Adres registerleri A0-A1-A2-A3-A4-A5-A6 olarak isimlendirilmiştir. Bu registerlerin veri registerlerinden farkı, hafıza adreslerini depolamakta kullanılmalarıdır. Bunlar 68000'e verileri hangi hafıza adresinden alıp, nereye koyacağını bildirirler. Ayrıca, diyelim ki programımızda herhangi bir hafıza adresini devamlı kullanmamız gerekiyor. Bu adresi, adres registerlerinin birine atayıp buradan doğrudan registerin ismini kullanmak, size büyük bir kolaylık ve hız sağlar.

Makina dilinde, BASIC'deki gibi alfanümerik dizilerin atandığı A$, B$, C$, D$ gibi değişkenler de bulunmamaktadır. Bu gibi işlemler 68000'de şöyle yapılmaktadır. Örneğin BASIC'de A$ = "AMIGA" olarak yapılan işlem, makina dilinde "AMIGA" yazısının ASCII kodlarını hafızada herhangi bir yere arka arkaya koymak ve başlangıç adreslerini bizim istediğimiz bir adres registerine atamak şeklinde yapılır.

68000'in diğer iki registerleri ise şunlardır. PROGRAM COUNTER (Program Sayacı): 68000 çalışırken hafızadan bir komut alır. Bunu işleme sokar. İşi biten komutun arkasındaki bir başka komutu alır ve onu da okuyarak görevini yerine getirir. Bu böyle program bitene kadar devam eder. Bu arada program sayacı devamlı işlem halindedir. Yaptığı iş ise, mikroişlemcide bir sonraki işleme girecek komutun adresini içeriğinde tutmaktır. Uzunluğu 32 bit'tir.

STATUS REGISTER (Durum Sicili): Durum saklayıcı işlemci içinde 16 bit'lik bir iç hafıza alanıdır. 68000, icrasında sonra, bazı durumları kontrol ederek sonuçları bu registerdeki 16 FLAG'a (bayrak) aktarır. Flag dediğimiz nesneler, bir bit uzunluğundadır ve 1 veya 0 değerlerini saklarlar. Örneğin aritmetik işlemlere göre bu register içindeki flaglar bize bilgi verirler. Örneğin; bir toplama işleminde elde varsa veya bir çıkarma işleminde ödünç alma varsa CARRY (elde) bayrağı 1 değerini alır.

Gelecek sayımızdan itibaren 68000'in komutlarını öğrenmeye başlayacağız. Başarılar...