1.Bayrak Kaydedicisi (Flag Registeri):............................................................................................. 1
1.1 6502 Mikroişlemcinin Programcı Tarafından Kullanılan Bayrak Kaydedicileri.......................... 2
Z(Zero Flag)Sıfır Bayrağı...................................................................................................... 2
N(Negative Flag)Negatif Bayrağı......................................................................................... 2
C(Carry Flag)Elde Bayrağı:...................................................................................................... 3
V(Overflow Flag)taşma bayrağı:............................................................................................... 4
I(Interrupt Disable Flag)kesmeyi engelleme bayrağı:.................................................................. 4
D(Decimal Mode Flag)ondalık Mod bayrağı:........................................................................... 4
B(Break Flag)dur bayrağı:....................................................................................................... 5
1.2 6800 Mikroişlemcinin Programcı Tarafından Kullanılan Bayrak Kaydedicileri.......................... 5
1.3 8085 Mikroişlemcinin Programcı Tarafından Kullanılan Bayrak Kaydedicileri.......................... 6
1.4 8086 Mikroişlemcinin Programcı Tarafından Kullanılan Bayrak Kaydedicileri.......................... 6
1.5 80286 Mikroişlemcinin Programcı Tarafından Kullanılan Bayrak Kaydedicileri........................ 7
1.6 80386 Mikroişlemcinin Programcı Tarafından Kullanılan Bayrak Kaydedicileri........................ 7
Bayrak komutları ve olayları deyince aklımıza hep sayıları oluşturan bit'ler gelmeli. Basit olarak iki sayının karşılaştırılmasında ortaya o sayının aynı olduğu, aynı olmadığı, büyük veya küçük olması yada sıfır olması gibi durumlar çıkar. Bu durumları öğrenmenin tek yolu o duruma göre şekil alan bayrak register (f) bitlerinin durumunu öğrenmemizdir. Bir test veya bir matematiksel işlem olduğu durumlarda sonuçlar daima bayrak registerin ilgili bitlerine yansır.
Bayrak register gerçek modda 16 bit, korumalı modda ise 32
bitliktir. Yani gerçek modda toplam 16 bit tane sebep-sonuç biti ayrılmış aynı
şekilde korumalı modda 32 tane sebep-sonuç biti ayrılmıştır.32 bitlik bayrak
registere EFlag adı verilir ve aynı 16 bitlik şekli gibi sadece ilk 16 biti
kullanılır.(Bazı bitler dökümante edilmemiştir). EFlag registerin sonraki 16
biti ileride yapılacak CPU güncellemeleri için ayrılmıştır.En başlıca olanları
ZF (zero flag), CF (carry flag) ,SF, AF, gibidir. Örneğin bir işlem sonucu 0 ise
ZF set olur yani 1 olur.
Bayraklar işlevleri açısından 3 gruba ayrılılar. Status flaglar (durum
bayrağı), Control flaglar (kontrol bayrağı) ve, System flaglar (sistem bayrağı).
Durum bayrakları programın içindeki komutsal, mantıksal ve matematiksel
işlemlerin sonuçlarını verir. Genelde kullanılan bayraklar bunlardır. Kontrol
bayrağı sadece 1 tanedir ve ileride göreceğimiz repz komutunun aşağı yada yukarı
işlem yapma şeklini ayarlar. Sistem bayrakları ise sistemle ilgili işlemler için
kullanılır. Genelde bunları işletim sistemi yada kullanacağımız debugger gibi
yüksek düzeyli bir program değiştirir.
Bayrak registerin tam yapısı aşağıdaki gibidir:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
10 |
11-31 |
CF |
? |
PF |
? |
AF |
ZF |
SF |
TF |
IF |
DF |
OV |
? |
IO |
? |
NTF |
RF |
V86 |
|
Şekil 1.1 Bayrak registerin yapısı
Veya bayrakları başka bir şekilde anlatmak istersek şöyle bir benzetme yapabiliriz;bir futbol maçında yan hakemlerin oyunun kurallarına göre bazen ellerindeki bayrakları kaldırdıkları ve böylece orta hakeme bilgi verdikleri görülür. Benzer şekilde mikroişlemci de yapılan bir işlemden sonra data sonuçlarının durumlarını gösteren mikroişlemci de bulunan 6 flip-flop’tan her biri mikroişlemciye bilgi verir ve bunların her birine de bayrak adı verilir. Flip-flop’ların durumları,istenildiğinde 8 bitlik bayrak kaydedicisinde görülebilmektedir.
Durum kaydedicisinde 8 bit bulunmasına rağmen 7 si kullanılır.Bu bitlere “flags” veya “bayraklar” denir.Bir Bir program çalıştırıldığında MİB bu bayrakları kullanarak hangi koşulların oluştuğunu gösterir.Programcı bu bayrakların bazılarını şartlı sapma komutları için kullanır ve programın sapması mı gerektiğini yoksa devam etmesi mi gerektiğini belirler.Bu bayrakların işlevlerine kısaca değinelim.
N |
V |
I |
B |
D |
I |
Z |
C |
Elde/Borçlu
Bayrağı(Carry)
Sıfır sonuç Bayrağı(Zero Result)
Kesmeyi
Engelleme(Interrupt Disable)
Ondalık
Mod Bayrağı(Decimal Mod)
Dur
Bayrağı(Break)
(Kullanılmaz)Her
Zaman 1 dir
Taşma
Bayrağı(Overflow)
Eski
Sonuç Bayrağı(Negative Result)
Şekil 1.2 6502 MİB nin programcı tarafından kullanılabilen bayrakları
Sonuç 0 ise MİB Z=1 durumuna geçirir.Sonuç 0 değilse MİB=0 yapar.
Bu mikroişlemcide veriyi işleyen kaydediciden diğer kaydediciye veri gönderen veya bir kaydedici ile hafıza arasında veri iletimi yapan komutların çoğu çalıştırıldığında Z bayrağı etkilenir.
Örnek olarak MİB in bir toplama komutunu yürüttüğünü ve sonucu A akümülatöre yerleştirdiğin düşünelim.Sonuç 01100111 ise N=0 olur.Çünkü bit7 (MSB)=0 dır.Eğer sonuç 11000110 ise MİB N bayrağını N=1 yapar.Çünkü MSB=1 dir.
Mikroişlemcide N=1 negatif sayıyı,N=0 pozitif sayıyı gösterir.
Örnek:Hexadecimal+28 ile –0A sayılarını toplayalım.Önce negatif olan 0A sayısını bu sayının ikiye tamlayanına (25 complement) çeviririz.
00001010=0A 28=0010 1000
11110101=bire tümleyeni (15 complement ) + F6=1111 0110
Buna
da 1 eklendiğinde ikiye tümleyeni bulunur. 1E=0001 1110
11110101
+
1
pozitif sonuç(MSB=0)
11110110=F6 N=0 olur.
C(Carry Flag)Elde Bayrağı:Bu bayrağı MİB birkaç değişik amaç için farklı biçimlerde kullanabilir.Birincisi,8 bitlik iki sayı toplandığında MSB den (en büyük basamaktan)sonra bir elde olup olmadığını gösterir.
Örneğin A nın içinde 10101000 sayısı olsun.Buna hafızadan 01010110 sayısını ekleyip sonucu gene A ya kaydet komutunu işaretlemediğimizde;
10101000 Bu işlem sonucunda MİB elde bayrağını “0” yapar.Yani C biti 0 olur.
+ 01010110
11111110
MSB
Elde
yok
Eğer A akümülatörüne hafızadan 01100110 sayısını eklersek;
10101000 Bu toplamada elde 1 olur ve MİB elde bayrağını “
+ 01100110 “1” yapar.Yani C=1 olur.
1
00001110
A da depolanacak sonuç
Elde biti
Elde bayrağı işaretsiz sayıların çıkartma işleminde,borçlu ”Barrow” olup olmadığını da izler.Örneğin küçük bir ikili sayıdan büyük bir ikili (iki tabanına göre sayı) sayıyı çıkartmak istediğimizde en büyük basamak ( MSB) bir”1” borç alarak çıkarma işlemini tamamlar.Böyle olduğunda MİB C=0 yaparak bir borç alma olduğunu gösterir.Çıkarma işlemende borç gerekmiyorsa MİB C=1 yapar.Diğer bir deyişle borç=C olur.
C bayrağı ayrıca bazı shift (kaydırma) ve rotate (döndürme) komutlarında da kullanılır.
6502 komut setinde programcının herhangi bir zaman C bayrağını 1 veya 0 yapabilmesini sağlayan SEC ve CLC komutları vardır.Hex cinsinden SEC komutunun işlem kodu (op-code) 38 dir.CLC için 18 dir.SEC işletildiğinde C=1 olur,18 işletildiğinde C== olur.N ve Z flagları için bunlara benzer komutlar yoktur.
V(Overflow Flag)taşma bayrağı:İşaretli sayılar MİB tarafından toplandığında veya çıkartıldığında bir taşma olup olmadığını V bayrağı gösterir.İşaretli sayılarda 8. bit (bit-7) işaret biti olarak görev yapar.Negatif sayıları ikinin tamlayanı biçiminde gösterdiğimizde,bayının değeri için 7 tane bit kalır.Böylece ancak -12810 ile +12710 aralığındaki sayıları gösterebiliriz.Bir toplama veya çıkarmada sonuç bu aralığın dışına taşarsa MİB otomatik olarak V=1 yapar.
ÖRNEK: +9610=01100000
+ +6510=01000001
10100001
İşaret biti
Burada iki pozitif sayının toplanmasıyla negatif bir sonuç görünmektedir.Halbuki sonucun negatif görünmemesi gerekir.MİB taşma bitini 1 e set ederek sonuçta toplamada sonuç değeri bitlerinin işaret biti pozisyonuna taştığını belirtir.V=1 .Eğer herhangi bir taşma olmasaydı MİB V=0 yapardı.
İki zıt işaretli sayının çıkarma işleminde de taşma olabilir ve MİB V bitini gerektiği gibi düzenler.
V bitiyle C bitinin birbirine karıştırılmaması gerekir.V bayrağı işaretli sayıların aritmetik işlemlerinde yedi bitlik sayı değeri kapasitesinin taştığını beliler.C bayrağı ise işaretsiz sayıların işlemlerinde 8 bitlik sayı değeri kapasitesinin taşmasını belirler.
Programcı 6502 MİB de clv komutuyla V bayrağını 0 yapabilir.Taşma bayrağını set eden (V=1) komut yoktur.Fakat bu mikroişlemcide S.O.(Set Outflow) diye bir giriş ucu vardır.Dışardan bir sinyalle bu girişten V=1 yapılabilir.Dışarıdan bir aletin durumunu anlamada için programcı V bayrağını test eder.Böylece dışarıdaki aletin sinyal gönderip göndermediği anlaşılır.
I(Interrupt Disable Flag)kesmeyi engelleme bayrağı:Bu bayrağı SEI komutunu kullanarak I=! Ve CLI komutunu kullanarak I=0 yapabiliriz.MİB sürekli bir işlem gerektiren bir program bölümünü çalıştırmakta iken herhangi bir kesme yapılması istenmeyen sonuçlar doğurabilir.Örneğin MİB bir zamanlama döngüsündeyken veya diğer bir G/Ç aygıtıyla iletişimdeyken kesme yapılamaz.Programın içinde CLI komutuyla I=0 yapıldıktan sonra MİB kesme komutlarına duyarlı olur.
D(Decimal Mode Flag)ondalık Mod bayrağı:6502 nin aritmetik devresi hem ikili sitemde hem de ondalık sitemde toplama ve çıkarma işlemi yapabilmektedir.D=0 olduğunda mikroişlemci bütün toplama ve çıkarma işlemlerini ikili cinsinden yapar.D bayrağı 1 olduğunda toplama ve çıkarma işlemleri BCD (Binary Coded Decimal)cinsinden yapılır.
Örnek:D=0 iken(104)10 ile (18)10 sayılarını toplayalım.(İkili biçimde)
01101000 (104)
+ 00010010 (18)
01111010 (122)
D=1 iken (68)16 ile(12)16 sayılarını BCD toplayalım.
0110 1000(68)
+ 0001 0010(12)
1000 0000(80)sonucu elde edilir.
Halbuki normal ikili toplama yapmış olsaydı sonucun (7A)16 elde edilirdi.
0110 1000(68) A sayısı BCD biçiminde iki rakamla (10)
+ 0001 0010(12) gösterilir.D=1
iken böyle olayı engellemek
0111 1010(7A) için sonucun her dörtlü grubunun üzerine 610=0110
eklemek gerekir.
0111 1010 (7A)
+
0110 0110
1110 0000 Örnekte görüldüğü gibi eğer dörtlüden
komşu
dörtlüye elde yok ise 0110 ikili
sayısını bu dörtlüden çıkarmak gerekir.
1110 0000
+
0110
1000 0000 (80) bulunur.
Programcı gerekli komut ile D bayrağını “1” veya “0” yaparak,hangi aritmetik modunu seçtiğini kararlaştırmış olur.D bayrağı bir değere geçirildiğinde bundan sonraki aritmetik işlemler aynı moda yapılır.Ancak D değeri değişirse işlem biçimi de değişir.
B(Break Flag)dur bayrağı:B bayrağı bir dur komutunun işletildiğini belirtmek için kullanılır.BRK komutunu “Software Interrupt”(yazılım kesmesi) de denir. I bayrağının durumu ne olursa olsun MİB her zaman BRK komutuna duyarlıdır.
6502 MİB hal kaydedicisiyle benzer görev yapar.Bit5 N biti farklı bir görev yapar.6800 MİB ABA,ADC VE ADD komutlarını çalıştırdığında bit3 den bit4 e bir elde olduğu zaman
H biti (bit5) “1” durumuna geçer.Eğer bit4 e elde oluşmazsa H biti “0” a reset olur.Bit 6 ve bit7 her zaman “1” e eşittirler.buradaki C,V,Z,N ve I durum bayraklarının görevleri 6502 MİB ndeki bayraklarla aynıdır.
1 |
1 |
H |
I |
N |
Z |
V |
C |
Elde/Borçlu
Bayrağı(Carry)
Taşma bayrağı(Overflow Flag)
Sıfır
Sonuç(Zero Result Flag)
Eksi
Sonuç Bayrağı(Negative Result)
kesme
bayrağı(Interrupt Bayrağı)
Yarım Elde (Half Carry Flag)
Şekil 1.3 6800 MİB nin programcı tarafından kullanılabilen bayrakları
Bu mikroişlemcisinin beş bayrağı vardır. Sekiz bitlik bayrak kaydedicisinin üç tanesi kullanılmaz.
S |
Z |
- |
AC |
- |
P |
- |
C |
Şekil 1.4 8085 MİB nin programcı tarafından kullanılabilen bayrakları
S İşaret Bayrağı(signum):S=1 olduğunda sonucun negatif S=0 olduğunda ise sonucun pozitif olduğu anlaşılır.
Z Sıfır Bayrağı(zero):bir işlem sonucu sıfır çıktığında Z=1 aksi halde Z=0 olur,
AC Seçmeli (keyfi)Elde Bayrağı(auxiliary carry flag):Bu bayrak onlu (desimal)toplama komutunda (DAA) kullanılır.Toplamanın sonucunda 3. sıradan 4. sıraya bit taşması (elde) varsa AC bayrağı 1 olur.aksi halde sıfır olur.
P Eşlik Bayrağı(parity flag):Bu bayrak akümülatördeki “1” lerin sayısını gösterir.Eğer “1” lerin sayısı çift (even) ise P=1,aksi halde P=0 olur.
C Elde Bayrağı(carry flag):Elde bayrağıdır.
8086 mikroişlemcisinin programın durumu sözcüğünü (PSW-Program Status Word)içermek için 1 adet kaydedicisi vardır.bu 16 bitlik kaydedicinin yalnızca 9 biti kullanılır.Bu kaydediciye Bayrak(flag) kaydedicisi de denir.Bayrak kaydedicisi Şekil 1.5 de gösterildiği gibidir.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
|
|
O |
D |
I |
T |
S |
Z |
- |
A |
- |
P |
- |
C |
Şekil1.5 8086 MİB nin programcı tarafından kullanılabilen bayrakları
O Bayrağı:İşaretli sayaların taşmalarını kontrol eder.İşlem sırasında sonucun dışına bir taşma meydana gelmemişse bir elde mevcut O bayrağına 1 .aksi halde 0 değeri aktarılır.
D Bayrağı: Zincirlerle (String) iş zamanı kullanılır.Eğer zincir en küçük adreste yerleşmemiş birinci elemanından başlayarak işlem görürse D=0, aksi halde ,yani işlem en büyük adreste yerleşmiş elemandan küçük adresteki elemana doğru yürütülürse D=1 olur.
I Bayrağı:kesmeleri organize edebilmek içindir.I=1 halinde mikroişlemci gelen kesimleri kabul eder(kesmeye izin verir).aksi halde gelen kesmeler kabul edilmez(kesmeye izin verilmez).
T Bayrağı.Program oluşturan komutları tek tek ele alabilmek içindir.T01 halinde bir komut icra edildikten sonra bir sonraki komuta geçmez ve icra edilen komutun etkilerini inceleyebilmek üzere bir süre bekler.T=0 halinde program bir bekleme olmaksızın icra edilir.
S Bayrağı:İşareti gösterir.S=1 sonucun negatif,S=0 ise pozitif olmasını gösterir.
Z bayrağı:Yapılan işlem sonucunun sıfır olup olmadığının belirlenmesi içindir.Z=1 sonucun 0 olduğunu ,Z=0 ise sıfır olmadığını gösterir.
AC Bayrağı:Desimal işlemlerde en küçük 4 bitten 4. bite elde olup olmadığını kontrol edebilmek içindir.AC=1 bu eldenin olduğunu AC=0 ise olmadığını gösterir.
P Bayrağı:Sonuçtaki 1’lerin sayısının çift olup olmadığını göstermek içindir.P=1 bu sayanın çift,P=0 ise tek olduğunu gösterir.
C Bayrağı:İşaretsiz sayılar üzerinde işlem yapılırken eldenin olup olmadığını göstermek içindir.C=1 eldenin olduğunu ve C=0 ise eldenin olmadığını gösterir.
80286 bayrak kaydedicisi de bitlik olup 8086’ya göre 2 fazla bayrakta kullanılmaktadır.12. ve 13. bitlerde gösterilen durumlar (IOPL ve NT) eklenmiştir.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- |
- |
NT |
IOPL |
O |
D |
I |
T |
S |
Z |
- |
A |
- |
P |
- |
C |
Şekil1.6 80286 MİB nin programcı tarafından kullanılabilen bayrakları
IOPL Bayrağı(ınput/output privilege flag):Giriş/Çıkış öncelikle seviyesini belirleme bayrağı olup “1”e eşit olup ta önceliği bulunan komutlar işleme konur.
NT(Nested Task Flag):Yuvarlanmış işlemler bayrağı “1” e eşit olduğunda iki işlemden küçük bölümlü olana öncelik tanır.
Kalan bayrakların nitelikleri aynen 8086 mikroişlemcisinde olduğu gibidir.
80386 mikroişlemcisindeki bayrak kaydedicisi 32 bit’liktir.Bunun ilk 16 biti aynen 80286 ‘da olduğu gibidir.Ek olarak iki bayrak daha kullanılmaktadır.
31 16 15 0
EFLAG |
|
Şekil1.7 80386 MİB nin programcı tarafından kullanılabilen bayrakları
16.Bit-RF(Resume Flag):Bütün Debug hatalarının bir sonraki adımda belirsizleşmesi için kullanılmaktadır(RF=1).Her iki komut başarılı şekilde sonuçlandığında RF=0 durumuna otomatik olarak geçer.
17.Bit-VM(Virtual 8086 Model):VM=1 olduğunda ve 80386 korumalı moda ise (PE=1);mikroişlemci olarak 8086 modunda çalışır.Bu durumda göreli segmentler,sanki 8086 mikroişlemcisinde çalışıyormuş gibi işlem yapar.