Bu sayfadaki yazılar
Sayfanın metni
Sayfa 23
1200 CLC 1201 LDA $1400 1204 ADC $1300 1207 STA $1500
ADC mutlak olarak adreslendiği için 3 bayt kaplamıştır. Bu türden 8-Bit işlemler oldukça sık kullanılır: Örneğin bir döngüde ADC kullanılarak adım aralığı istenilen şekilde belirlenebilir. Pratikte 16-Bit hesap işlemlerinin çok önemli yeri vardır. Bildiğiniz gibi 16-Bit'lik bir sayı yüksek bayt ve alçak bayt olmak üzere iki parçaya ayrılır. İnceleyeceğimiz örnekte sadece 16 Bit'lik iki sayı toplanacak. SAYI1'in alçak baytı $1300'e, yüksek baytı ise $1301'e yerleştirilmelidir. Aynı şekilde SAYI2 ise $1400 ve $1401 adreslerinde yer almaktadır. Programımızın başında her zaman kullanmamız gereken hazırlık komutları yer almaktadır.
1200 CLD 1201 CLD
Önce her iki sayının da alçak baytlarını toplayalım:
1202 LDA $1300 1205 ADC $1400 1208 STA $1500
Burada 15. Bit işareti belirlediği için bu tür bir hata söz konusu değildir. Fakat birçok durumda iki sayının toplamı 255'ten ($FF) büyük olabilir. Eğer bu son hal gerçekleşirse Carry değerini alır. Şimdi yüksek baytları toplayalım: 120B LDA $1301 120E ADC $1401 1211 STA $1501
Carry Bit'inde ne olursa olsun yukarıdaki toplam işleminde beraber toplanacaktır. İşlemizin sonucu $1500
(Alçak Bayt) ve $1501'de (Yüksek Bayt) yer almaktadır. Örnek olarak 2176 (0000 1000 1000 0000) ve 1009 (0000 0011 1111 0001) sayılarını toplayalım. Burada kullanacağımız bellek birimleri şu şekilde düzenlenmelidir:
1300 1000 0000 Alçak Bayt 1301 0000 1000 Yüksek Bayt 1400 1111 0001 Alçak Bayt (SAYI2) 1401 000 001 Yüksek Bayt
İlk önce alçak baytları toplayalım:
1300 1000 0000 1400 1111 0001 Carry 0 1500 0001 Carry 1 Şimdi de yüksek baytları: 1301 0000 1000 1401 0000 0011 Carry 1 1501 0000 1100
Böylelikle sonuç olan 3185 (0000 1100 0111 0001) alçak ve yüksek bayt olarak $1500 ve $1501 adreslerinde yer alacaktır. Yalnız burada Carry'nin değeri “1”'dir. Bu nedenle yeni bir işleme başlamadan önce CLC ile Carry temizlenmelidir. Toplam hakkında bilmemiz gereken her şey yukarıda anlatılanlardan ibaret. Gelecek sayıda makine dilinde çıkartmanın nasıl yapıldığını göreceğiz. Hoşça kalın...
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 22
64 0100 0000 — 0000
(126) - 1000 0010
Görüldüğü gibi sonuç yanlıştır. 6. Bit'leri toplarken 7. Bit “1” olmuştur. İkinci dereceden karşılıklarla çalışırken bu negatif bir sayıyı göstereceği için işlem hatalı olacaktır. Bu gibi durumlarda imdadımıza statü registerindeki V-bayrağı (göstergesi) yetişir ve değerini alır. Kısaca şöyle diyebiliriz: Eğer yukarıdaki örnekte olduğu gibi istenmeyen bir zamanda yanlışlıkla 6.Bit'ten 7.Bit'e bir taşma meydana gelirse bu bayrak “1” olur. Bu işin aslı esasında daha karışıktır, fakat bu kadar bilgi bizim için yeterlidir. Görüldüğü gibi makine dilinde hemen hemen tüm operasyonlardan önce olabilecek hatalara karşı önlem alınmalıdır. Aslında bu bilgisayar kullanırken hiç alışık olmadığımız bir unsurdur, fakat ileride bu öğrendiklerimizin pratik uygulamasına geçtiğimizde bunların şimdiki kadar başımızı ağrıtmayacağını göreceğiz. Yukarıdaki işlemde 6. Bit'ten 7. Bit'e bir taşma meydana gelirse 16-Bit sayılar kullanırsak problem kendi kendine çözülür:
64 00000000 01000000 *66 00000000 01000010
130 00000000 10000010
Bildiğimiz gibi 16 Bit sayılarda 15. Bit işaret göstergesi olarak kullanılır. Şimdi diğer bir durumu inceleyelim.
-125 1000 0011 -4 1100 0000 (469) (1)0100 0011
Burada da yanlış bir sonuçla karşılaştık. Yine yanlışlıkla işaret göstergesi değişikliğe uğradı. Yalnız bu sefer değişiklik 6. Bit yerine Carry'den kaynaklanmakta. Carry olduğu için 7. Bit bu sefer “0” olmuştur. Bu problemi de 16-Bit sayıları kullanırsanız kolayca çözebilirsiniz. Şimdi yine öğrendiklerimizi kısaca toplayalım: Eğer 8- Bit işlemlerde ikinci dereceden karşılıklarla gösterilebilinen alanın (-127 ile + 127 arası) dışına çıkılırsa işaret Bit'i (7.Bit) değişmekte ve yanlış sonuç vermektedir. Bu durumda hemen statü registerinde V-bayrağı (göstergesi) üzerinde bir kırmızı lamba yanar ve bize 16-Bit sayılar kullanmamızı söyler. Şimdi gelelim Carry Bit'inin unutulabileceği durumlara. İkinci dereceden karşılıkları ile yapılan tüm 8-Bit aritmetik işlemlerinde bu Bit göz ardı edilebilir. Bunu iki örnekte gösterelim:
*4 0000 0100 — — 1110 *2 (1)000 000
Carry Bit'ine bakılmazsa sonuç doğrudur.
— 1111 1010 *1111 1110 — 1000
Burada da yine Carry Bit'i ihmal edilirse sonuç doğru çıkar. Artık C-64'ün tam sayıları nasıl işlediğini öğrendik. Şimdi bu sayı karmaşasını yine bir yana bırakarak pratik uygulamalara geçelim.
Bilgisayar Hesaplıyor: ADC, CLC
ADC, bizim 6510 mikroişlemciden öğreneceğimiz ilk aritmetik komutudur. Anlamı “Add with Carry”, yani “Carry ile birlikte topla”'dır. Şimdi elimizde iki tane 8- Bit sayı olsun: SAYI1 ve SAYI2. Yalnız bu sayılar fazla büyük değil ve toplamlarında herhangi bir taşma beklenmiyor. Akümülatöre yükleyelim:
LDA #$SAYII Ve bunu izleyen satır:
ADC # $SAYI2
Bu komutlarla karşılaşan mikroişlemci iki sayıyı toplar ve sonucu akümülatöre yazar. Sonucu görmek istediğinizde akümülatörün değerini STA ile herhangi bir adrese yazdırırız. Yalnız Assembler programlarında Carry'i etkileyen birçok işlem vardır. Bu nedenle hiçbir zaman Carry'nin 1 veya 0 olduğundan emin olamayız. ADC komutu hesap işlemine Carry'i de dahil ettiği için bunun silinmiş olması gerekir. 6510 makine dilinde bu işi yapan CLC komutu mevcuttur. SAYI1 = 12 ve SAYI2 = 7 alınırsa programımız şu şekilde olur:
1200 CLC 1201 LDA 1203 $07 1205 STA 1500
İlk satırımızda yer alan CLC bir baytlık komuttur ve sadece Carry'yi etkilemektedir. ADC ise burada kullanılan şekliyle iki baytlık bir komuttur ve dolaysız olarak adreslenmiştir. Daha önce de belirttiğimiz gibi ADC birkaç göstergeyi (bayrağı) etkileyebilir. Bunların başında Carry ve V-bayrağı gelir, fakat 7. Bit'in 1 değerini almasıyla ortaya negatif bir sayı çıkacağı için N-bayrağı ve $FF değeri aşıldığında da Z-bayrağı değişikliğe uğrayabilir.
$1201 numaralı satırı aşağıdaki şekilde değiştirdiğimizde programımız daha ilginç hale gelir:
1201 LDA $1400
Görüldüğü gibi burada mutlak adresleme yöntemini kullandık ve LDA 3 baytlık bir komuta dönüştü. Dolayısıyla programın kalan kısmı 1 bayt ileriye kaydırılacaktır. Bu son hali ile programımız $1400 adresinin içerdiği değere ADC komutunun ardındaki sayıyı ekleyecektir. LDA komutunda yaptığımız değişikliğin aynını ADC için de yapabiliriz. ADC'nin de mutlak adreslenmesi ile örneğin $1300 adresindeki değerin $1400'dekine eklenmesini sağlayabiliriz. Bu işlemi gerçekleştiren program şu şekildedir: