Karıştırılanlar diye bir seri başlatmamın nedeni aslında kendi karıştırdıklarımı anladıktan sonra başkalarına da yardımcı olabilmektir.
Yeni yeni mikrodenetleyiciyileri anlamaya çalışanlar ilk başta Carry ve OverFlow arasındaki farkı anlamakta zorlanabilirler. Şimdi bunları açıklamaya çalışalım.
CARRY BAYRAĞI
İki adet hex tabanda sayıyı toplayalım
FF+01=?
işlemi daha rahat anlamak için binary tabana çevirelim
11111111
00000001
100000000
Olacaktır. gördüğünüz gibi 8 bitlik 2 sayı toplandığında 9 bitlik bir sayı ortaya çıktı. Yani bir taşma durumu meydana geldi bu durumda Carry bayrağı 1 olur. Burada önemli olan şey şudur. Eğer Carry bayrağını hesaba katmadan işlemin sonucuna bakacak olursak Akümülatöre yüklenen sayı 8 bitlik olacağından bu işlem için sonucu 00 görecekti. Aslında sonuç 256 . Ne kadar büyük bir hata değil mi ? O yüzden aritmetik işlemlerde Carry bayrağı hesaba katılarak işlem yapılır. Bu örneği birde Keil programında görelim;
Kodlarımız şu şekilde olacaktır (8051 mikrodenetleyicisi için)
MOV A,#0FFH
MOV B,#001H
ADD A,B
END
Şimdi simule edelim
Kırmızı kalemle işaret ettiğim yerde gördüğünüz gibi A registerının yani akümülatörün değeri 0x00 olarak görünüyor. cy yani Carry bayrağı ise 1 olarak görünüyor.
Carry bir de borç alma durumunda 1 olur mesela;
00000001
00000010 bu çıkarma işlemini yapacak olursak alttaki sayı büyük olduğundan borç alma durumuna gidilecektir. Simule edersek;
kodlarımız;
MOV A,#01H
MOV B,#02H
SUBB A,B
END
Akümülatörde kalan değer FF olmuştur. Oysaki bu çıkarma işleminin sonucu değildir. İki sayıdan da daha büyüktür. Borç aldığından Carry bayrağı 1 olmuştur. carry bayrağındaki değeri akümülatördeki değerle birleştirirsek 9 biti de 1 olan sayı elde ederiz. 2 nin complementine göre bakarsak bu sayı -1 e karşılık gelir ki bu da bizim 1-2 işleminin sonucudur.
Sanırım Carry bayrağı anlaşılmıştır…
OVERFLOW BAYRAĞI
Carry bayrağının yaptığı işlevi işaretli sayılar için yapar. Şöyleki verdiğimiz sayıları 2 nin complementi verilmiş gibi bakar sonuç -128< <+127 arasındaysa OV bayrağı 0 olur aksi halde 1 olur. Veya şöyle de düşünebiliriz : işlemi işaretli sayılara göre yapıp taşma veya borç alma durumu varsa OV bayrağı 1 dir deriz.
şöyle bir örnek yapalım
01110011
00010111 toplama işlemi yapılıyor
10001011
Önemli not: mikrodenetleyici bu sayıların işaretli mi yoksa işaretsiz sayı mı olduğunu bilmiyor. Dolayısıyla şöyle bir mantık yürütüyor. Hem işaretliymiş gibi hem de işaretsizmiş gibi işlem yapıyor. İşaretsiz sayı için Carry bayrağına bakıyoruz işaretli sayı için de OV bayrağına bakıyoruz.
Şimdi bu işlemi işaretsiz sayılar için düşünecek olursak sonuçta herhangi bir taşma veya borç alma işlemi olmadığından Carry bayrağı 0 olacaktır. Bir de sayıları işaretli olarak düşünürsek sayıların MSB yani soldan ilk biti bizim için önemli. iki sayının da MSB biti 0 olduğu için bu sayılar pozitif dolayısıyla iki pozitif sayının toplamı pozitif olması gerekir. Ancak işlemin sonucuna bakarsak MSB biti 1 olmuş. Yani sonucu negatif çıkarmış. Yani MSB bitine taşma olmuş dolayısıyla OV bayrağı 1 olacaktır. simule edersek;
Kodlarımız;
MOV A,#01110011b
MOV B,#00010111b
ADD A,B
END
gördüğünüz gibi OV bayrağı 1 carry bayrağı 0 olmuştur.
önemli not 2: Eğer işaretli sayılarda işlem yapılıyorsa OV bayrağı 1 olduğunda sonuç kullanılmaz. 0 olduğunda kullanılır.
bir de OV nin 0 olacağı durum için örnek yapalım
11001000 toplama işlemi yapılıyor..
00111100
100000100
Eğer sayıları işaretsiz olarak düşünürsek sonuçta bir taşma olduğu için Carry bayrağı 1 oldu. Sayıları işaretli olarak düşünürsek ilk sayımız -56 değerine karşılık gelir ikinci sayı ise 60 değerine karşılık gelir. toplama işlemimizin sonucu +4 olması gerekir.
önemli not 3 : sayıları işaretli olarak düşünürsek Carry bayrağı dikkate alınmaz.yani Akümülatöre yüklenen 8 bitlik sayıya bakılır
bu işlemin sonucunda carry bayrağındaki değeri yani taşan değeri atıp kalan 8 bitlik değere baktığımızda sonucun +4 ü ifade ettiğini gördük. sonuç doğru o halde OV bayrağı 0 olacaktır. simüle edersek;
kodlarımız
MOV A,#11001000b
MOV B,#00111100b
ADD A,B
END
kısaca overflow la işlem yapmayı düşünüyorsak sayılar 128 den küçükse(işaretsiz düşünürsek) normal işlem yapılır sonuç -127 ve 128 arasındaysa ov=0 değilse ov=1 olur ve sonuç kullanılmaz. eğer sayı veya sayılar 128 VE 128 den büyükse(işaretsiz düşünürsek) -256 ekleriz ve yine normal işlem yapar sonuç -127 ve 128 arasındaysa ov=0 değilse ov=1 olur ve sonuç kullanılmaz