Bu sayfadaki yazılar
Sayfanın metni
Sayfa 21
Program Yavaşlatma SFF-X-Reg | LDX FF | FE DEY â BNE 1504 Negatif DEX BNE 1502 Negatif en
Resim 2'de son öğrendiğimiz komutlarla ilgili bazı gerekli bilgiler yer almaktadır. Burada yine komutlar için harcanan süre çevrim sayısı (cycle) birim alınarak verilmiştir. Bu değerlerden faydalanarak yazdığınız programdaki bekleme sürelerini isteğiniz doğrultusunda belirleyebilirsiniz. Bu bekleme sürelerinde bilgisayarımız programın işleyişini yavaşlatmaktan başka bir iş yapmaz fakat bu oldukça önemli bir unsurdur. Örneğin bir kelime işlem programı düşünün. Eğer bu programda tüm metinler bir anda ekrana gelip giderse hiçbir işe yaramaz. Dolayısıyla benzeri durumlarda makine dilinin işleyişini yavaşlatmak son derece önemlidir. Yalnız geciktirme programlarının oldukça çeşidi vardır. Bunlara yine daha sonra zamanı geldiğinde değineceğiz.
Carry ve Overflow:
Şu ana dek bilgisayarımızın tam sayıları nasıl sakladığını öğrendik ve buna bağlı olarak da aritmetik işlemlerinde kullanılan 9 yeni komut ile tanıştık. İsterseniz kısa bir hatırlatma yapalım: Tam sayılar C-64 tarafından ikinci dereceden karşılıkları ile algılanmaktadır. 8-Bit bir sayının 7. Bit'i o sayının önündeki işareti belirtmektedir. Eğer bu Bit “0” ise bu sayı her zaman kullandığımız normal bir ikilik sayıdır. Diğer durumda ise, yani 7. Bit “1” ise elimizde negatif bir sayının ikinci dereceden karşılığı var demektir. 16 Bit'lik (2 Bayt) sayılar kullanırken ise 15. Bit işaret göstergesi olarak kullanılır. Bu sayılarla işlem yaptığımız bazen yanlış sonuç çıktığını daha önce belirtmiştik. Bu sorunu çözerken statü registerindeki iki bayrağı (göstergeyi) daha kullanacağız: Carry ve V-bayrağı. “To Carry” dilimizde “taşımak” anlamına gelmektedir. Register göstergesinde bu bayrak kısaca “C” ile gösterilir. Şimdi, her şey iyi de burada taşınan nedir, diye sorabilirsiniz. Bu soruyu en iyisi bir örnek ile cevaplayalım. Örneğimizde normal ikilik sayılarla (İşaret Bit'ine bakmadan) işlem yapacağız. 128 ile 130'u toplayalım:
128 1000 0000 +130 1000 0010
258 (1)0000 0010
Sonuç olarak elde ettiğimiz 258 tastamam doğrudur fakat 8 Bit'e sığmamaktadır. Burada artan Bit özel olarak bu iş için ayrılmış bir yere, yani Carry Bit'ine taşınmıştır. Eğer C-64'de aritmetik işlemlerinde bu tür bir artan olursa Carry Bit'i olur. (Resim 3) Bazı durumlarda bu Carry Bit'ini göz ardı edebiliriz, fakat genellikle sonraki işlemlerde bu Bit'in kullanılması gerekir. Yine burada da bazı özel durumlar için hata söz konusudur. Bilgisayarımız “1” değerini aldığında hemen işe negatif sayıları karıştırmakta ve yanlış sonuçlara ulaşmaktadır. Bunu aşağıdaki örneği incelerseniz daha iyi anlayabilirsiniz:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 20
Geçen sayıda değinmeye başladığımız 16 Bit işlemler oldukça başımızı ağrıtmıştı. Şimdi isterseniz biraz bu sayı karmaşasından uzaklaşalım ve basit bir Assembler prog- Tamını incelemeye başlayalım. Yalnız burada yeni bir komut karşımıza çıkmakta: BNE “Branch if Not Egual zero” veya diğer bir deyişle “eğer sıfır değilse dallan” bu komutun kısa bir açıklamasıdır. Burada sadece statü registerindeki Z-göstergesi (Bu göstergeyi INX, DER ... komutlarını incelerken detaylı olarak ele almıştık) ““0” değerini almışsa bir dallanma yani istenen bir adrese sıçrama gerçekleşir. Aşağıda göreceğiniz programın akış diyagramı Resim 1'de gösterilmiştir. 1500 LDX # $FF 1502 LDY # $FF 1504 DEY 1505 BNE $1504 1507 DEX 1508 BNE $1502 1S0A BRK Programda ilk olarak X ve Y registerlerine başlangıç değerleri yüklenir. Bunu takip eden satırdaki DEY komutu ise Y registerindeki başlangıç değerini bir indirerek $FE olmasını sağlar. Daha sonra bilgisayar BNE komutu ile karşılaştığı için statü Şer, Z göstergesine (Sıfır göstergesine) bakar. İlk etap sonunda doğal olarak burada sıfır değeri yer almayacağı için (Y registe-
Komut Adresleme Byte Kod Desimal Süre Etkilediği Yöntemi Sayısı Flaglar INX Sihir 1 22 2 NZ INY Sihir 1 200 2 NZ INC Mutlak 3 EE 238 6 NZ DEX Sihir 1 CA 202 2 NZ DEY Sihir 1 88 198 2 NZ DEC Mutlak 3 CE 206 6 NZ SED Sihir 1 F8 248 2 - CLD Sihir 1 D8 216 2 -
ANIL GÜL ri sıfırdan farklı olduğu için değeri 1'dir) program tekrar $1504 adresine döner. Burada Y registeri tekrar | azaltılır ve tekrar BNE ile 0 değerine ulaşıp ulaşmadığı kontrol edilir. Bu işlemler tam 255 defa tekrarlandıktan sonra Z göstergesi O değerini alacaktır ve dolayısıyla program bir sonraki satıra atlama imkânını bulacaktır. Bir sonraki satırda ise bu sefer DEX ile X registeri | azaltılacak ve BNE ile sıfır değerini alıp almadığı kontrol edilecektir. İlk kontrolde X registeri sıfır olamayacağı için program tekrar $1502'ye dönecektir. Bu şekilde yukarıda 255 defa yapılan azaltma işlemi tekrar yapılacak, fakat X registeri yine sıfır olmadığı için yukarıdaki döngü tam 255 defa tekrarlanacaktır. Sonuçta dış döngü 255 defa, iç döngü ise 65025 defa yapılacaktır. Yukarıda incelediğimiz programı yazarken bilgisayarın, BNE $1504 komutundan sonraki adres olarak $1508 yerine $1507 vermiş olması herhalde dikkatinizi çekmiştir. İlk bakışta BNE üç baytlık bir komut gibi gözükmektedir, fakat hafızada sadece iki bayt işgal etmiştir. Bu Branch komutlarının özel adresleme sisteminden kaynaklanmaktadır. “Relatif adresleme” olarak adlandırılan bu sistemi daha sonra diğer Branch komutları ile beraber ele alacağız. Her ne kadar makine dili çok çok hızlı işlese de G 1500 ile örnek programımızı çalıştırdığımızda registerler gösterilene dek bir miktar zaman geçecektir. Eğer daha uzun gecikmelere ihtiyaç duyulursa DEC komutu kullanılarak bir döngü daha ilave edilebilir.