Karıştırılanlar

KARIŞTIRILANLAR 1 || Carry ve Overflow Farkları


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







Yorum bırakın