Bu sayfadaki yazılar
Sayfanın metni
Sayfa 5
ok işaretini koyacaksınız.
Eğer ikilik sistemin kullanılamaması sizi rahatsız ediyorsa, bunu toplama ve üs alma işlemleri ile kolayca gerçekleştirebilirsiniz. Örneğin, LDA #%00101 satır geçersizdir. Ancak bunun yerine, LDA #2↑0+2↑2 yazabilirsiniz.
Sıra geldi değişken kullanımına. Label'ların dışında, iki tür değişken kullanılabilir. Genel ve yerel değişkenler. Birazdan göreceğimiz gibi, bir tür alt-program sayabileceğimiz makro kullanımı sırasında, o makronun içinde kullanacağımız tüm değişkenler ve label'lar o makro içinde yerel (local) sayılacaklardır. Bunun en önemli sonucu, programın ana kısmında ve makroların içinde aynı isimli değişkenleri veya label'leri kullanırsanız bile, hiçbirinin birbirine karışmamasıdır. Bir değişkenin değeri bir makroda 5, bir diğerinde 2, ana programda da 8 olabilir. Eğer o değişkenin tüm program içinde geçerli bir değere sahip olmasını istiyorsanız, onu genel (global) değişken olarak tanımlamanız gerekir. Bunun nasıl yapıldığını da birazdan göreceğiz. Değişken isimlerinin istediğiniz uzunlukta olabileceğini, tüm karakterlerinin önemli olduğunu, ilk karakterlerinin bir harf olması gerektiğini, geri kalanlarının da harf veya sayı olabileceğini belirterek bu konuyu da kapatalım.
Nihayet geldik assembler komutlarına:
.BA adres
Obje kodu hafızada, bu komutun olduğu satırdan sonraki satırlar için, verilen adresten sonraya yerleştirilir. Adres, desimal veya hexadesimal olabilir. Bir programda birden fazla BA olabilir. Bu durumda, assembler kodunuzun değişik bölümleri değişik adreslerde assemble edilir. Kaset kullanıcıları için verdiğimiz programa bakın.
GL değişken=değer
Adı verilen değişken, desimal veya hexadesimal olarak belirtilen veya matematiksel terim olarak verilen değere sahip olur. Aynı zamanda, değişken genel (global) tanımlanmış olursunuz. Değerin 0-65535 ($0000-$FFFF) arasında olması gerekir.
.EQ değişken=değer
GL gibidir, ancak değişken yereldir (local).
.BY byte1, byte2, byte3......
Verilen byte değerleri hafızaya sıralı yerleştirilir. Her bir byte $00-$FF (0-255) arası değerde olmalıdır. Örneğin:
.WO adres1, adres2
Bildiğiniz veya öğreneceğiniz gibi, 6510 prozesörü bir adresi lo/hi denen formatta saklar. Diyelim ki adresiniz $7A8E. Eğer bu adres hafıza içinde arka arkaya gelen iki byte'a yerleştirilecekse, önce $8E, sonra da $7A yerleşir. Yani önce küçük byte, sonra da büyük byte. .WO komutu, arkasından gelen 0-65535 arası değerlerdeki sayıları sırasıyla bu formata göre hafızaya yerleştirir. Örneğin:
.TX "yazı"
Yazıyı oluşturan harflerin ASCII kodlarını hafızaya yerleştirir.
.OB "dosya-adı,P,W"
Eğer oluşan obje kodunun bir program halinde diskete gönderilmesini istiyorsanız, programınızın en başında bu satır bulunmalı. Kaset kullanıcıları bu komutu kullanamaz.
.EN
Eğer .OB kullanmışsanız, programın en son satırında .EN vererek dosyayı kapatmalısınız. Eğer obje kodu üretilirken bir hata olmuş ve obje kodu üretimi durmuş ve dolayısıyla da dosya açık kalmışsa, CLOSE 14 ile elden de kapatabilirsiniz.
.LI dosya-no,araç-no,ikincil-adres
Obje kodu üretilirken, bu komuttan sonra gelen tüm satırlar, verilen parametrelere göre formatlı bir şekilde gönderilir. Örneğin:
.SY dosya-no,araç-no,ikincil-adres
Obje kodu üretildikten sonra, kullanılan sembollerin alfabetik sırayla, verilen parametrelere göre basımını sağlar. Örneğin:
.ST
Assembler, obje kodu üretirken bu komutu görürse üretimi durdurur.
.DP k0,k1,k2,k3
.LI komutu sonucunda basılacak dökümün formatını ayarlar.
k0 : Assembler ve makine dili komutlarının başlayacağı kolon
k1 : Noktalı virgülün ve açıklamaların başlayacağı kolon
k2 : Kağıdın veya ekranın solunda bırakılacak boş kolon sayısı
k3 : SY komutu verilmişse, sembollerin basımının başlayacağı kolon
Genel amaçlı assembler komutları bu kadar, 10 tane daha var. Onları da birazdan göreceğiz.
Zincirleme Assemble
SUPER ASSEMBLER ile birden fazla assembler kodunu arka arkaya otomatik olarak objeye çevirebilirsiniz. Bu iş için iki assembler kodumuz var:
.AP "dosya-adı"
O anda kullanılan assembler kodunun objeye çevrilmesi bitince, verilen isimli dosya doldurulur ve onun objeye çevrilmesiyle devam edilir.
.CO değişken1,değişken2...
Listede yer alan tüm değişken ve/veya label'lar ve .CO komutundan önce gelen tüm satırlar korunur. .AP ile doldurulan program, bu satırlardan sonrasına yerleşir. Böylece programın başında tanımlayacağınız makro ve değişkenler ikinci programda da geçmiş olacaktır. Bu arada dikkat etmeniz gereken şey, .CO komutundan önceki satırlarda .BA komutu ile ana programın parçalarının olmaması gerektiğidir. En ideal durumda sadece makro tanımlamalarının olması gerekir.
Şartlı Assemble
IF..THEN..ELSE veya GOTO komutlarının benzerlerini kullanarak yazılan programlar, şartlı assemble'ye örnektirler. Bu komutlara göre, assembler kodunun bir bölümü veya bir başka bölümü objeye çevrilir. Veya belli bir bölüm birkaç kez arka arkaya objeye çevrilir. Diyelim ki bir komutun obje kodunda 50 kere arka arkaya gelmesi gerekiyor. Bunun için 50 satır yazmak yerine, bir sayaç
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 4
bölümleridir. Bir satırda bunların bir veya birkaçı olabilir.
Makine dili komutu ile LDA, ADC, JMP gibi, 6510'un anladığı komutları ve bu komutların değişik adresleme şekillerini kasdediyoruz.
Assembler komutları ise, Super Assembler'ın assembler kodunuzu objeye koduna çevirirken gerçekleştireceği birtakım işlemlerin kullanıcı tarafından belirlenmesini sağlarlar. Örneğin, formatlı bir assembler kodu listesi üretebilir, label tablosu isteyebilir, programınızın hafıza içindeki yerini belirleyebilir, değişkenler kullanabilir, birden fazla assembler kodunu birbirine ekleyebilir ve daha birçok işi kolaylıkla gerçekleştirebilirsiniz.
Label'lar ise, programın herhangi bir satırına bir isim vermeye yararlar. Daha sonra bunlar, JMP, JSR, BNE, BEQ gibi atlama komutlarında hedef adres olarak kullanılırlar. Bunların gerçek adres değerlerini assembler hesaplar. Böylece hem siz zahmet etmezsiniz, hem hata olasılığı sıfıra iner, hem de label'ın assembler kodundaki yerini değiştirip RUN ettiğinizde oluşan obje kodu, bu değişiklikle çalışır durumda kalır.
Açıklamaları ise, aslında çok ilkel ve karmaşık bir dil olan makine dilinde yazdığınız programın satırları hakkında yorumlarınızı ve açıklayıcı notlarınızı içerir. Tıpkı BASIC'teki REM komutu gibidirler. Obje kodu üretilirken dikkate alınmazlar. Sadece dökümantasyon açısından önemleri vardır. Size bu özelliği sık sık kullanmanızı tavsiye ederim. İnanın, bir programı yazdıktan birkaç ay sonra, siz bile kendi programınızı anlamayabilirsiniz. Açıklamalar koyarak hem kendinize, hem de programınızı okuyacak olanlara yardımcı olursunuz.
Şimdi, böyle bir satırda geçerli olan kuralları görelim:
1) Her satırın ilk karakteri '-' (eksi) işareti olmalıdır.
2) Her satırda en fazla bir komut olabilir. Bu ya bir assembler komutudur ya da bir makine dili komutu.
3) Bir satırda en fazla bir label olabilir.
4) Eğer label varsa, label ile eksi işareti arasında boşluk olmamalıdır.
5) Eğer satırdaki ilk komut, bir makine dili komutu ise, eksi'den sonra en az bir boşluk olmalıdır.
6) Eğer label varsa, label ile arkasından gelen assembler veya makine dili komutu arasında en az bir boşluk olmalıdır.
7) Bir satırda sadece label olamaz.
8) Bir satırda assembler veya makine dili komutu kullanılmışsa, (başında label olup olmaması farketmez) ve bir açıklama eklenmek isteniyorsa, açıklama noktalı virgülle başlamalıdır.
9) Eğer bir satırda sadece açıklama olacaksa, eksi'den hemen sonra noktalı virgül gelmelidir.
10) Assembler komutları nokta ve iki harften oluşur.
11) Makine dili komutları üç karakterli isimlerinden ve adresleme bölümünden oluşur.
12) Assembler komutları, eksi'den hemen sonra da başlayabilirler, orada boşluk da olabilir.
Tüm bunlar çok karmaşık gelebilir. Ancak aşağıda genel biçimler verilmiştir. Çok kolay olduğunu göreceksiniz.
NNNNN -; açıklama
NNNNN -.AK assembler komutu parametreleri,
NNNNN - .AK assembler komutu parametreleri
NNNNN - .AK assembler komutu parametreleri ; açıklama
NNNNN -.AK assembler komutu parametreleri ; açıklama
NNNNN -LABEL MDK adresleme
NNNNN -LABEL MDK adresleme ; açıklama
Burada, .AK ile assembler komutu, MDK ile makine dili komutu, NNNNN ile satır numarası temsil edilmiştir. Dergimizde bulacağınız örnek programlar da size genel görünüş konusunda yeterli bilgi verecektir.
Makine dili komutlarını zaten Ayhan'ın yazısında görmektesiniz. Açıklamamız gereken, assembler komutlarının neler olduklarını ve ne işe yaradıklarıdır. Ama önce, assembler kodu içinde yapabileceğiniz hesaplamalar ve kullanacağınız değişkenler ile ilgili bazı önemli bilgileri verelim.
Assembler kodunuzda, bir sayı yazabileceğiniz her yerde matematiksel terimler olabilir. Örneğin:
Bu tip işlemlerde, toplama, çıkarma, bölme, çarpma, üs alma gibi beş değişik basit işlemin yanısıra, mantıksal operatörler de mektedir. Bunlar AND, OR, NOT, eşittir, büyüktür ve küçüktür operatörleridir. Yazılışları, iki işaret arasına konmuş baş harflerinden veya sembollerden oluşur:
AND = !A!
OR = !O!
NOT = !N!
büyüktür = !>!
küçüktür = !<!
eşittir = !=!
Bu işlemler parantezlerle kontrol edilebilir:
!N! (değişken1 !=! 5) !A! (değişken2 !<! 20))
Yukarıdaki işlemin sonucu, eğer değişken1'in içinde 5 ve değişken2'nin içinde 20'den küçük bir değer varsa 0 olacaktır. Şimdi bu -1 nereden çıktı diyeceksiniz? Bu işlemin sonucu doğru ise, bunun sayısal değeri -1, yanlış ise 0 olacaktır. Yukarıdaki terim, Basic'te yazılmış aşağıdaki terime eşittir, isterseniz bir deneyin:
NOT (D1 =5) AND (D2 <(20))
Bu işlemlerin dışında, küçük byte ve büyük byte dediğimiz iki işlem daha vardır. Eğer elimizde 0-65535 arasında, yani 16 bit'lik bir sayı varsa, küçük byte bu sayının alt 8 bit'ini, büyük byte da onun üst 8 bit'ini verir. Bunlara KB ve BB dersek, BB*256+KB işleminin sonucu bizim 16 bit'lik sayımızı verecektir. Eğer olayı onaltılık sistemde incelersek, örneğin $5EF8 (24312) sayısının küçük byte'ı $F8 (248), büyük byte'ı da $5E (84) olur.
NNNNN sayısının küçük byte'ını bulmak için <(NNNNN) operatörünü, büyük byte'ını bulmak için >(NNNNN) operatörünü kullanmanız gerekiyor. NNNNN yerine 0-65535 arasında bir sayı, bir label veya bu aralıkta sonuç veren matematiksel bir terim konabilir. Örnek programımızın 200-210 numaralı satırlarında bunun örneğini görebilirsiniz.
Tüm programınız içinde, ondalık ve ya onaltılık sistemde sayılar kullanabilirsiniz. Onaltılık sayıların başına $ (dolar) işaretini koymanız gerekiyor. Programınızın dışında, satır numarası kullanmadan vereceğiniz direkt komutlarda da bu sayı sistemini kullanabilirsiniz. Örneğin, PRINT $C000 komutu ile 49152 cevabını alabilirsiniz.
Sırası gelmişken, diğer Basic komutlarını nasıl kullanacağınızı da belirtelim. LET ve FOR komutlarının dışındaki komutları sadece direkt modda kullanabilirsiniz. Program yazmak yok. Ayrıca PRINT komutundan başka, assembler kodundaki hesaplamalarda kullandığınız terimleri de direkt modda kullanabilmeniz için sola bakan ok tuşunu kullanmanız gerekir. Örneğin, obje kodu ürettikten sonra programda kullandığınız bir label'ın veya değişkenin değerini öğrenmek istediniz. Bu durumda PRINT label-adı komutu yerine, PRINT'in yerine sola bakan