Bu sayfadaki yazılar
Sayfanın metni
Sayfa 60
Şekil 1.
Merhaba, bu sayıdan itibaren sizlerle birlikte Amiga Assembly ile nasıl program yazacağımızı öğreneceğiz. Amiga Assembly ile program yazmak son derece eğlenceli ve kolaydır. Basit bir Assembly kodu aşağıdaki gibidir:
Örnek bir program
;basit bir kontrol toplami (checksum) hesaplama startı move.l ;DO register'ine 70 koy move.l #0,d1l ;Dl register'ine 70 koy lea data(pc),a0 ;data'nin adresini ;A0'a al. A0 data'ya #bakan bir pointer şolmus oluyor «loop: move.b (a0)4*,dI1 ;A0'in gosterdigi ;adresten bayt olarak şoku ve Dl'e koy ŞA0'i (pointer) bir Parttir add.l d1,d0 ;Dl1l'i longword olarak
;DO'a ekle
ŞDI ile sifiri ;karsilastir bne.s .loop ;Dl1 sifir degilse git
move.l d0,checksum ;DO'in degerini ;checksum'a yaz
rts ;#programdan cik data: dc.b “plazma',0 ;bayt olarak plazma #yazisi even ;şbir sonraki adresi yap checksum: de.l © şchecksum'i tutacak
;bir longword
Peki bu kodu nasıl derleyeceğiz? Bunun için Amiga'da kullanabileceğiniz pek çok assembler vardır, ben yazılarımda AsmPro V1.17 kullanacağım. Sizler dilerseniz AsmOne, PhxAss ya da başka bir derleyici kullanabilirsiniz. İleriki sayılarda diğer derleyicilere de değineceğiz.
Yukarıdaki kodu derlemek için sisteminizde AsmPro olmalı, eğer yoksa http://www.aminet.net adresinden AsmPro kelimesini aratarak bulabilirsiniz. Aminet'ten indirdiğiniz lha arşivini bir yere açın ve AsmPro'yu çalıştırın.
Sizden “AsmPro:” isimli disketi yerleştirmenizi isteyebilir, bu noktada — CLI'den (shell penceresi) — “Assign AsmPro: <AsmPro'nun-bulunduğu-klasör>” ile AsmPro'nun olduğu yeri gösterebilirsiniz. Dilerseniz “cancel” deyip geçebilirsiniz. Bu ve benzeri AmigaOS konularını Plazma'nın ileriki sayılarında okuyabilirsiniz.
Nerede kalmıştık? Kodu derlemek için AsmPro'yu açtınız, karşınıza workspace'iniz (çalışma alanınız) için kullanacağınız RAM tipi ve miktarını gireceğiniz bir ekran gelecektir. Burada Fastmem veya Chipmem'i işaretleyip miktar için 100 KB seçebilirsiniz. (Daha fazla da olabilir) Burada bir hatırlatma yapalım seçtiğimiz miktar sadece derlenmiş program için değil tüm çalışmamız için kullanılacaktır, yani üzerinde çalıştığımız kaynak kodlar (source), derleme işleminde kullanılan etiketler (label) vb., o yüzden biraz yüksek tutmakta fayda vardır.
Devam edelim, herhangi bir şey yazmıyorken Enter tuşuna bastığınızda AsmPro ekranı temizler. Escape tuşu ile hızlıca Editör'e girip çıkabilirsiniz. Bir kez Escape tuşuna basarak editöre girin ve yukarıdaki kodu aynen yazın. Burada kod satırlarının sağ tarafındaki açıklama (comment) kısımlarını da yazabilirsiniz, “;”den sonrasını AsmPro dikkate almayacaktır.
Yazmayı bitirdiğinizde tekrar ESC tuşu ile editörden çıkın. “a” (tek harf, sadece A) komutunu yazıp Enter'a bastığınızda derleme işlemi gerçekleşecektir. Ekranda aşağıdaki gibi satırlar görmelisiniz:
>a Pass 1.. Pass 2.. No Errors >
Derlediğiniz kodu çalıştırmak için sadece J komutunu (jump)
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 61
vermeniz yeterlidir. Aynı şekilde “j start” da diyebilirsiniz, bu şekilde kodunuzun belirli bir yerinden itibaren çalıştırmaya başlayabilirsiniz.
Eğer derleme işlemi sırasında hatalar görüyorsanız, konsol ekranında (editör dışında) sağ tuş ile Assembler/Preferences/Assembler menü seçeneğini seçerek derleyici ayarlarına ulaşabilirsiniz. Burada “UCase - LCase” ve “Label :” seçeneklerini seçin. Bunlar sırasıyla büyük/küçük harf farkını kapatır ve etiketlerden sonra “:” konma zorunluluğu getirir.
Eğer hata almaya devam ediyorsanız yazdığınız kodda hata vardır. İyice gözden geçirip tekrar deneyin.
J komutu ile programınızı çalıştırdığınızda aşağıdakine benzer satırlar göreceksiniz;
DO; A0: SSP:
00000285 00000000 00000000 00000000 11390FC1I 00000000 00000000 00000000 110BCBF4 USP:
Bu gördükleriniz 68000'in register'larıdır. D0 register'ının değeri 'plazma'nın harflerinin hafızadaki değerlerinin toplamı olan $285 olarak görülmekte. Bu şekilde programımız bittiğinde register'ları hangi durumda bıraktığını görebilirsiniz.
Ayrıca aşağıdaki komutlarla 'checksum' adresindeki değeri de görebilirsiniz,
>h checksum
Bu komut ile hafızanın dump'ını alırken, aşağıdaki komutla hafızanın disassemble edilmiş halini görebilirsiniz. Yön tuşlarıyla hafızanın başka bölgelerini de görebilirsiniz.
>d checksum
Benzer şekilde a ve d komutlarını arka arkaya verdiğinizde programınızın derlenmiş halini görebilirsiniz.
Programımızda kullandığımız 68000 komutlarının anlamlarını öğrenmeye başlamadan önce 68000 işlemcinin register'larına kısaca bir göz atalım.
68000 Register'ları
68000 işlemci 16/32 bitlik bir işlemcidir, 32 bitlik veriler üzerinde çalışabilir ancak veri yolu 16 bit, adres yolu 24 bitliktir.
68000 işlemcilerde 8 adet data register'ı, 8 adet adres register'ı, durum register'ı (SR, status register), 2 adet yığın göstergeci (USP ve SSP) ve program göstergeci vardır.
Register'larla .b, .w, .l gibi sonekler (suffix) kullanarak sırasıyla byte (8 bit), word (16 bit) ve longword (32 bit) işlem yapabilirsiniz. Buna ileride tekrar değineceğiz.
Şekil 2.
Data register'ları D0-D7 olarak yazılır. Aritmetik işlemler ve diğer depolama gereksinimleri için kullanılabilirler. Bu register'lar üzerinde bayt (8 bit), word (16 bit) veya longword (32 bit) olarak işlem yapılabilir.
Adres register'ları A0-A7 şeklindedir. Belirli hafıza adreslerini tutarlar ve o adreslerle ilgili okuma/yazma işlemlerini gerçekleştirmede kullanılırlar (pointers). Data register'ları gibi 32 bitlik register'lardır. Ancak bu register'lar üzerinde sadece word ve longword işlem uygulanabilir. (Örneğin ADD.W #1,A0 kullanılabilir, ancak ADD.B #1,A0 kullanamazsınız.)
Bu noktada ufak bir ek bilgi verelim, data register'larının tümünü dilediğiniz gibi kullanabilirsiniz, ancak adres register'larının sonuncusu olan A7 aynı zamanda yığın göstergecidir (SP, stack pointer). Bu nedenle bu register'ı diğerleri gibi kullanmayın!
Durum register'ı (SR, status register) 2 bayt'tır ve aşağıdaki bilgileri içerir;
1. 0: Aritmetik ve kaydırma komutlarından etkilenir 2. 1: V, Overflow: Taşma olduğunda set edilir 3. 2: Z, Zero: Son işlemin sonucu sıfır ise set olur 4. 3: N, Negative: Son işlemin sonucu negatif ise set olur 5. 4: C, Carry: Aritmetik işlemlerden etkilenir 6. 5-7: Kullanılmıyor 7. 8: I0: Interrupt bitleri 8. 9: I1: Interrupt bitleri 9. 10: I2: Interrupt bitleri 10. 11: Kullanılmıyor 11. 12: Kullanılmıyor