Makine diline merhaba (6)
ASSEMBLER'LA ÇALIŞMA
Şimdi size küçük bir makine dili program vereceğiz. Bunu verirken aynı zamanda, assembler kullanmanın faydalarını ve avantajlarını vurgulayacağız. Bunun için aşağıdaki problemi, makine dilinde formüle edeceğiz: Yapmak istediğimiz işlem, Commodore 64'ün tüm karakter setini ekranda göstermek. Önce bu problemi BASIC'te nasıl çözeceğimizi gösterelim. Commodore 64'ün karakter setinde 256 değişik karakter yer almaktadır ve bunlar 0'dan 255'e kadar rakamlanmıştır. BASIC'te bu problemi çözmek için şöyle bir döngü kurmak gerekir.
100 X-0
120 POKE 1024 4 X,A:REM ekran
kodu
130 A-I
140 POKE 552964 X,A:REM renk
kodu
150 X-X41
160 IF X < >256 THEN 110
170 END
Bu programı RUN komutuyla çalıştırdığınızda, tüm karakter seti ekranın üst tarafını kaplayacaktır. Bütün bu işlem aşağı yukarı 7 saniye zaman alacaktır. Programa dikkat ettiyseniz, bazı şeyler fazlasıyla abartılıp yazılmış durumda. Bunun nedeni, programın makine diline yakın olması ve makine diline çevirirken fazla sorun çıkarmaması. Öyleyse, haydi iş başına!
100 X=0 m X değişkeni için X-register'ini, A değişkeni için ise akümülatörü kullanacağız.
NOA-X TXA
X-register'inin içeriği aküye kopyalanıyor. Bu arada X'in içeriğine hiçbir şey olmuyor.
120 POKE
10244 X,A — STA 1024,X
Burada, akünün içeriği 1024+X adresine saklanıyor. Yani indeksli adresleme tipini kullanıyoruz.
» LDA#1
Akü 1 numaralı renk koduyla (beyaz) yükleniyor.
140 POKE
552964 X,A m STA 1024,X
ve 55296+X adresli hafıza elemanına yazılıyor.
ç
150X-X4*1 m INX
X-register'inin değerini bir artırmak için sayma komutlarını kullanabiliriz. 160 IF X < 256 THEN 110
Bu komut belli bir şartı arıyor. Şart gerçekleşmişse 110'uncu satıra sıçrıyor. Aranan şart ise X'in değerinin 256 olması. Fakat, biz biliyoruz ki X-register'i en fazla 255'e kadar değerleri alabiliyordu. Diyelim ki X-register'i 255 içeriyor ve satırdaki INX işlemi yürütüldü, ne olur? Gayet basit, 255'ten ($FF), 256 ($100) elde ederiz. Fakat dokuzuncu bit'i temsil edecek kimse olmadığı için, elimize geçen değer sadece $00'dır. Bu durumu nasıl ayırt edeceğiz? Hemen, pek güçlü hafızamızı bir kere daha yokluyoruz ve flag'lar bahsini hatırlıyoruz. X-register'inin değerini her yükselttiğimizde, N- ve Z-flag'ları da etkilenir ve durumları X-register'inin yeni değerine göre tekrar belirlenir. Elde edilen değer $7F'ten (127) büyükse N-flag'ı yanar, küçükse de söner. Artırma sonucu, X-register'inde sıfır elde edersek Z-flag'ı yanar, diğer durumlarda söner. Yani, bizim durumumuzda Z-flag'ını kontrol etmemiz gerekiyor. Bu flag'ın durumuna göre programımız şartlı olarak dallanmak zorunda.
160 IF X <> 256 THEN 110 ya da 160 IF X BNE satır 110 Fakat şimdi de şöyle bir sorun çıkıyor. Makine dilinde program yazarken, hiçbir zaman "110'uncu satıra sıçra" diyemeyiz. Bunun yerine, sıçranacak hafızanın adresini vermemiz gerekmektedir. Ama, bu adresi bilmiyoruz. Önce biz programımızı belli bir adrese yerleştirelim ve bütün komutların uzunluklarına göre adreslerini belirleyelim. Programımız gene $6000 adresinde yer alsın.
100 $6000 LDX * O
110 $6002 TXA
120 $6003 STA $0400,X
130 $6006 LDA < |
140 $6008 STA $D800,X
150 $600B INX
160 $800C BNE $6002
170 $600D RTS
Dikkat ettiyseniz, program sayacını her bir komutun uzunluğu kadar arttırarak bir sonraki komutun adresini bulmak için kullandık. Yani 160'ıncı satırdaki sıçrama işleminin
2
$6002 adresine yapılması gerekmektedir. Programımıza bir de kodlarını ekleyelim de tam olsun.
100 $6000 A2 00. 0
110 $6002 BA TXA
120 $6003 9D 00 04 STA $0400,X
130 $6006 A9 01 LDA #1
140 $6008 96 00 D8 STA $D800,X
150 $6009 E8 INX
160 $600C DO 9? BNE $6002
170 $600D 60 RTS
160'ıncı satırdan 110'uncu satıra yapacağımız dallanma işlemi sırasında kullanacağımız ofseti daha hâlâ belirlemedik. (Bunun için isterseniz, şartlı programlama komutları bölümüne bir kere daha göz atın.) Yapılması gereken işlem, farkı pozitif olarak belirlemek ve bunun ikili sistemde komplementini almaktan ibarettir.
$600E
$6002
$000C $0C = 00001100 AA 11110100 = $F4
Ofset byte'ı olarak $F4 elde ettik. Kodumuzda eksik olan yere bu rakamı da koyduk mu hiçbir eksiğimiz kalmayacak. Şimdi, programımızın herhangi bir biçimde (monitor programı veya BASIC'te ufak bir program) hafıza elemanlarına yazılması gerekmektedir. Programın, hafızaya alınmasını sağladıktan sonra, cursor'un aşağı yukarı ekranın ortalarında olmasına dikkat ettikten sonra,
SYS 6*4096
SYS 24576 komutuyla, makine dili programınızı çalıştırın. Aniden tüm karakter seti ekranın üst şeklinde belirecektir. Halbuki, BASIC'teki programımız bu iş için 7 saniye harcamıştı. Şimdi ise hiçbir şey gözle takip edilemiyor. İşte size somut gerçek. Artık makine dilinde programlamanın gücüne iyice inandınız sanırım. Şimdi, Assembler programları ile ilgilenelim. Çünkü, bu yardımcı programlar çok rahat ve hızlı bir biçimde program yazılmasını sağlıyorlar. Ayrıca, sistemli de çalışırsanız, çok büyük projelerin altından kolaylıkla kalkarsınız. Kısaca Assembler ile çalışmak size büyük kolaylıklar sağlayacaktır.