Bu sayfadaki yazılar
Sayfanın metni
Sayfa 45
Program: Aritmetik dizinin toplamı,
T
Ne X-Reg
İs m
Carry'nin silinmesi
16-Bit-Toplama
Toplam * son eleman
Yeni
Carry'nin silinmesi
16 Bit - Toplama
Son eleman * D farkı
Yeni son Eleman
X-Register - 1
A: Programımızın akış diyagramı.
Birçoğumuz SYS komutunu oldukça sık kullanırız. Örneğin “POKE 214,Satır No.” ve “POKE 211,Sütun No.” komutlarının ardından yazacağımız “SYS 58640” ile kursorun pozisyonunu belirleyebiliriz. Aslında burada yaptığımız iş bilgisayarın belleğinde bulunan makine dili bir programı işletmekten başka bir şey değildir. Burada 58640 programın başlangıç adresidir ve SYS'yi Basic'teki GOTO komutunun bir benzeri olarak düşünebiliriz. Dolayısıyla SYS komutunu kullanarak Assembler programları çalıştırmak pek zor değildir. Esas sorun Assembler programın kullanacağı parametrelerin kullanılmasında yatmaktadır. Bu sorunun en basit ve en yavaş çözümü değerlerin Alçak ve Yüksek Baytlar şeklinde belli adreslere POKE edilmesi ve daha sonra makine dilinde yazılmış programca okunmasıdır. Şimdi örneğimizde bu yöntemi kullanacağız.
Örnek programımızda birçoğumuzun yakından tanıdığı bir aritmetik diziyi ele alacağız. Eğer “A” ilk eleman, “D” fark ve “N” ise eleman sayısını belirtirse bu tür bir dizinin toplamı şu şekilde olur:
*D)
İlk on doğal sayının toplamı yukarıdaki diziye bir örnektir:
Szl14243444546474849-410
Burada 1 ve N=10'dur. Yukarıdaki örnekte S toplamının 55 olduğunu kolaylıkla hesaplayabiliriz, fakat eleman sayısı çoğaldığında iş oldukça yorucu bir hale gelir. Her ne kadar bu işi yapabilen bir formül (Gauss Formülü) mevcut ise de biz burada herhangi bir formül kullanmayacağız. Programımız kısaca 1'den N'e kadar olan tamsayıları toplayıp sonucu bize bildirecek. Bu sonuç 16-Bit bir sayı olduğu için 32767'den büyük olamaz. Dolayısıyla N için sadece 1 ile 255 arası değerler sözkonusudur (Neden 255 olduğunu program tamamlanınca deneyerek görebilirsiniz). N sadece 1 bayta ihtiyaç duyduğu için bunu $1300'e kaydedebiliriz. A ve D'nin değerleri 1'dir, fakat bunlar da ileride programda değişiklik yapılabilmesi için 16-Bit'lik sayılar olarak hafızaya kaydedilir. “A” değişkeni alçak ve yüksek bayt şeklinde $1310/1311'de, “D” değişkeni ise aynı şekilde $1320/1321'de saklanır. Sonuç ise $1400/1401'de yer alacaktır. Makine dili programımızın ise başlangıç adresi de $1200'dür.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 44
ASSEMBLER - 9
Kursumuzun şu ana kadar olan bölümünde ele aldığımız makine dilinin temelini oluşturan ikilik ve onaltılık sayı sistemlerindeki aritmetik işlemler oldukça başımızı ağrıtmıştı. Bu işlemlerle bir müddet daha uğraştıktan sonra programlarımızda C-64'ün işletim sistemindeki (kernal) rutinleri kullanıp örneğin en basitinden makine dili ile ekranın herhangi bir bölümüne istediğimizi yazabileceğiz. Fakat şimdi tekrar kaldığımız yere dönelim ve makine dilinde çıkartma işleminin nasıl yapıldığını görelim. “Subtract with Carry” (Carry ile birlikte çıkart) veya kısaca SBC komutu makine dilinde çıkartma işlemlerinde kullanılır. Aynı ADC'de olduğu gibi burada da akümülatörün değeri ele alınır ve sonuç tekrar akümülatöre kaydedilir. Fakat SBC'de farklı ve daha karışık olan tek unsur Carry'nin kullanılışıdır. Biz burada Carry'nin kullanılışına detaylı olarak değinmeyeceğiz; karşılaşacağımız sorunlarda ise SEC (Set carry) komutunu kullanacağız. SEC ile Carry'nin değeri 1 yapılmaktadır.
Önemli Not: Herhangi bir toplama işleminden önce muhakkak CLC ile Carry'yi temizleyin. Aynı şekilde yine herhangi bir çıkartma işleminden önce SEC ile Carry'nin “1” değerini almasını sağlayın.
Şimdi iki örnekte yukarıda gördüklerimizi inceleyelim. Öncelikle bir 8-Bit çıkartma: $1300'deki SAYI1'den $1400'deki SAYI2'yi çıkartalım ve sonuç $1500'e yazılsın.
1200 CLD 1201 SEC 1202 LDA $1300 1205 SBC $1400 1208 STA $1500
Yukarıda da görüldüğü gibi SBC mutlak veya dolaysız olarak (Örneğin SBC #$40) adreslenebilir. Dolaysız olarak adreslendiğinde komut iki bayt, mutlak olarak adreslendiğinde ise 3 bayt işgal etmektedir. SEC ise daha önce tanıştığımız CLC gibi tek baytlık bir komuttur. İkinci örneğimiz ise bir 16-Bit çıkartmadan oluşmakta. Programa geçmeden önce belleğin dört baytı aşağıdaki şekilde düzenlenmelidir:
1300 SAYII Alçak Bayt 1301 SAYII Yüksek Bayt 1400 SAYI2 Alçak Bayt 1401 SAYI2 Yüksek Bayt
Sonucu yine $1500 ve $1501'e yazalım.
1200 CLD 1201 SEC 1202 LDA $1300
ANIL GÜL
1205 SBC $1400 1208 STA $1500
Program bu haliyle iki sayının alçak baytlarını birbirinden çıkartmakta ve $1500'e kaydetmektedir.
120B LDA $1301 120E SBC $1401 1211 STA $1501
Bu şekilde iki sayının yüksek baytlarını da birbirinden çıkardıktan sonra görevimiz tamamlanmış oluyor. SBC komutu ADC ile aynı bayrakları (Statü registeri) etkilemektedir.
Bir program projesi:
Şimdi öğrendiklerimizle ilk geniş kapsamlı programımızı geliştirebiliriz. Bu program bize iki açıdan yararlı olacaktır: 1) Şu ana dek tanıdığımız komutları birbirleriyle kombine etme imkânına sahip olacağız. 2) Basic ve Assembler programlarını birbirine bağlamada oldukça sık kullanılan bir yöntemi göreceğiz. Özellikle bu ikinci konu birçok kişi tarafından yeteri derecede bilinmemektedir. Assembler rutinlerini Basic programların içinde kullanmanın birçok yöntemi vardır ve bu yöntemlerin hepsine sırası geldiğinde teker teker