Bu sayfadaki yazılar
Sayfanın metni
Sayfa 27
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 26
Assembler İşlemlerle işlemleri:
Şimdi Assembler programlarken çok sık kullanılan ikilik ve onaltılık sayı sistemlerini daha yakından inceleyeceğiz. Bilgisayarımızın algılayabildiği sadece iki rakam vardır: 0 ve 1. Eğer elektrik varsa 1, yoksa 0. Onaltılık sayı sistemini ise bilgisayar doğrudan doğruya kesinlikle tanımaz. Yalnız bu sistemin ikilik sistemle büyük benzerliği vardır. Örneğin en büyük tek basamaklı onaltılık sayı olan $F, ikilik sistemde 1111'e yani yarım bayt'a eş değerdedir. Bir bayt ise (1111-1111) $FF'e eş değerdir. Bildiğiniz gibi C-64'ün tüm belleği 65535 bayttır ve bu $FFFF'e karşılık gelmektedir. Dolayısıyla onaltılık sayı sistemini kullanarak istenen her adresi Low ve High Byte olmak üzere iki bayt halinde belirtmek mümkündür. Makina dilinde program yazarken oldukça sık kullanacağımız ikilik tabana göre hesap işlemleri aslında her zaman kullandığımız dört işleme oldukça benzemektedir:
o o 1 1
—o-o
Burada son toplama işlemindeki iki tabanına göre 10 desimal olarak 2'ye karşılık gelmektedir. Örnek olarak 2+1=3 işlemini ikilik sistemde yapalım:
10 (desimal olarak 2) 01 (desimal olarak 1) = 11 (desimal olarak 3)
Görüldüğü gibi toplama işlemi aynı desimal sayılarda olduğu gibi sütunlar halinde yapılmaktadır. Elde kalan sayılar ise bir sonraki sütuna aktarılmaktadır. Örneğin:
10 (desimal olarak 2) + 10 (desimal olarak 2) = 100 (desimal olarak 4)
İkinci sütunda yer alan 1+1=10 olduğu için sonuç üç rakamlı çıkmıştır.
Altı yeni komut daha:
INX, “Increment X-Register” yani X registerinin içeriğini 1 arttırmak demektir. Buna karşılık INY aynı işi Y registeri için yapar. INC ise herhangi bir baytın içerdiği değeri 1 arttırmaktadır. INX ve INY daha önceki RTS gibi 1 baytlık komuttur ve ardında herhangi bir parametre yer almaz. INC kullanıldığında ise bilgisayara hangi baytın değerinin arttırılacağı belirtilmelidir. Bu nedenle komutun kendisi ile birlikte 3 bayt harcanır. DEX, DEY ve DEC yukarıdaki arttırma işleminin tersini yani eksiltme işlemi yapmaktadırlar. Burada DEX “Decrement X Register” yani X registerini 1 eksilt anlamına gelmektedir. Diğer komutların anlamları ve harcadıkları bayt sayıları da benzer şekildedir. Şimdi öğrendiklerimizi bir programda uygulayalım:
1500 LDA # $00 1502 LDX # $01 1502 STA $d800 1507 STX $0400 1508 BRK
Yukarıdaki satırları yazdıktan sonra G 1500 yazıp RETURN'e basın.
Ekranın sol üst köşesinde tekrar “ABA” harfleri siyah renkte gözükecektir. Şimdi bu programda neler olup bittiğini inceleyelim. Önce akümülatörün içerdiği değeri (siyahın değeri olan 0) ekran renk belleğine ($D800) ve X registerinin içerdiği değer olan 1 (A harfinin POKE kodu) ilk ekran belleğine ($0400) yazılır. Daha sonra X registerinin içeriği 1 (B harfinin POKE değeri) arttırılır ve ikinci ekran belleğine ($0401) yazılır. Daha sonra DEX ile X registeri azaltılır ve üçüncü ekran belleğine ($0401) yazılır. Herhalde farketmişsinizdir; bu sistemi kullanarak birçok kez tekrarlanan bir döngüyü kontrol edebilirsiniz. Örneğin herhangi bir işlem 20 defa tekrarlanacaksa her seferinde X registerini INX ile 1 arttırır ve (daha sonra değineceğiz) X registerinin 20 olup olmadığını anlayabiliriz. Burada hemen FOR-NEXT döngüleri aklımıza gelmekte. Aynı Basic'te olduğu gibi makina dilinde de döngüleri tersten saydırabiliriz. Bunun için DEX veya DEY komutunu kullanmamız yeterli olacaktır. Bu aylık da bu kadar. Gelecek ay BRANCH komutlarını incelemek üzere şimdilik hoşçakalın!