Bu sayfadaki yazılar
Sayfanın metni
Sayfa 50
ADC SSA ç
$3A Carry biti
Bir toplama işleminden sonra oluşması muhtemel bir aritmetik taşma olayını CARRY flag'ından anlayabiliriz. Toplama işlemi sırasında C-flag'ının yanında N- ve Z- flag'ları da etkilenir. Bunlardan başka V-flag'ı da etkilenir. Bu flag'ın yorumu sadece işaretli aritmetik kullanıldığında (negatif veya pozitif) geçerli olduğundan pek üzerinde durmayacağız. D-flag'ına göre toplama işlemi onluk sisteme benzer şekilde yapılabilmesine rağmen, pek az kullanılan, zahmetli ve tehlikeli bir yöntem olduğu için pek değinmeyeceğiz. Aşağıdaki tabloda ADC komutu için geçerli adresleme tiplerini ve komut kod'larını bulacaksınız.
Adresleme tipi ADC
direkt $69 absolut $6D 0.cı sayfa $65 X-indeksli $7D Y-indeksli $79 0.cı sayfa X-indeks $75 indirekt indeksli indeksli indirekt $61 kat bu sefer yerine “alma” söz konusu. Böyle bir durumda sonuç negatif olacaktır. Gene CARRY flag'ını kullanarak sorunumuzu çözebiliyoruz. “Elde” ve “alma” olayları tümüyle ters şeyleri simgelediklerinden, 'alma' durumunu CARRY flag'ının sönük (0) olması ile belirtiyoruz. Tabii yanık bir CARRY flag'ı “alma” olmadığını gösterecektir. Toplama işlemi için bulduğumuz formül burada da geçerli. Sekiz bitten uzun sayılar arasında çıkarma yaparken, CARRY bitinin yardımını istiyoruz. Şimdi bir örnek ve aynı işi yapan BASIC satırını görelim:
SBC $3A
VA hm $3A Carry biti
İkili sistemde çıkarma işlemi toplama işlemine benziyor. Burada da 4 değişik durum söz konusu:
0-0-0 -1 — | bir sonraki basamaktan “alma”
Diyelim ki akümülatör'de $7F var. Yukarıdaki işlem şöyle yürür:
$7F $3A
YOL 9000111010
CARRY sönük olarak (yani “alma”
olmadan) yapılan çıkarma işlemi şöyle olacaktır:
Yo 00111010
M01000101 — $45
Sonuç olarak 9001000101, yani $45 elde ettik. Bu sayı pozitif olduğu için herhangi bir “alma” olayı olmayacak ve CARRY biti yanık kalacaktır. Şimdiki örneğimizde akümülatör $1E içersin, CARRY flag'ımız gene yanık:
$1E 9000011110
$3A - 9000111010
Çıkarma işlemi de toplama işlemi ile benzer sınırlar içinde yürür. Hafızanın içeriği akümülatör'den çıkarılır, sonuç toplamada olduğu gibi akümülatör'e yazılır. Burada da toplamadakine benzer bir soruna rastlıyoruz. Fa-
Çıkarma işlemi şöyle gerçekleşecek:
96 00011110 Yo 00111010
%0011100100
Sonuç olarak %0011100100, yani $E4 elde ettik. İşlem sırasında karşılaştığımız için CARRY biti sönecektir. Peki bu olayın yorumunu nasıl yapacağız?.. Konuya daha hakim olmak için onluk sistemde düşünelim. İlk sayımız 30'du, ikincisi ise 58; çıkarma işlemi elde etmemiz lazım. Peki burada bulduğumuz $E4, yani 228 ne alaka?.. Şayet bulduğumuz bu sonucu sekiz bitlik gösterimin sihirli sayısı 256'dan çıkarırsak 28 elde ederiz. Sekiz bitlik gösterimde 255'ten sonra gene 0'a geliriz (256 yerine). İşlemimiz sonucunda CARRY biti sönük olduğu için elde ettiğimiz sonucun negatif olduğunu anlıyoruz. Bu sayının “ikili komplement”ini bularak pozitif karşılığını elde edebiliriz. Bu işlem şöyle yapılıyor: Sayının tüm bitlerini tersine çeviririz ve sonuca bir toplarız:
11100100 bitleri ters çevirirsek: 00011011 artı bir
Sonuç olarak %00011100, yani $1C, yani 28 bulduk.
Aritmetik işlemleri kullanırken dikkat edilmesi gereken şey; toplama işlemlerinden önce CARRY flag'ının söndürülmesi (yanık CARRY flag'ı, olmayan bir elde yaratır ve işlem yanlış yapılır), çıkarma işleminden önce ise CARRY flag'ının yakılmasıdır (sönük bir CARRY flag'ı, olmayan bir alma yaratır ve yanlış sonuç bulunur). (Dijital devre tasarımı ile ilgilenenler için bir not düşelim. Ana işlem ünitesi çıkarma işlemini, toplama işlemini yaptığı devrelerin aynısını kullanarak yapıyor. Tek fark, çıkarma işlemi sırasında çıkarılacak sayının bitlerini ters çevirip toplamak. Geri kalan tüm işlemler olduğu gibi aynı. Mesela CARRY bitinin yorumlanması... İnanmıyorsanız, kâğıt, kalemi elinize alıp birkaç örnek deneyin.) Aşağıdaki tabloda komut kodlarını ve adresleme tiplerini bulacaksınız:
Adresleme tipi SBC
direkt $E9 absolut $ED 0.cı sayfa $E5 X-indeksli $FD Y-indeksli 0.cı sayfa X-indeks $F5 indirekt indeksli $F1 indeksli indirekt $E6
Klavyeyle gezinmek için ← ve → tuşları.