Mikro İşlemci Yapısı ve Registerlar

Mikro İşlemci ve Yapısı
Bugün kullandığımız bilgisayarlarda bilgileri yorumlayan ve işleyen kısım bilgisayarın merkezi işlem ünitesidir. Merkezi işlem ünitesi (Central Processing Unit – CPU) bellek ve çeşitli giriş/çıkış üniteleri ile bus adı verilen veri yollarını kullanarak haberleşmektedir. İşlemciler, dahili ve dışsal hatlarının bilgi transferi ve işleyebilecekleri maksimum bilgi
kapasitesine göre 8 bitlik, 16 bitlik ve 32 bitlik işlemciler olarak adlandırılır. Bu dokümanda anlatılan assembly dili 16 bitlik bir işlemci olan Intel 8086 (dışsal ve dahili veri transferi word’ler halinde yapılmaktadır) serisi içindir. Dilin 8086 serisi için olması, yazdığınız programların 8088, 80186, 80286, 80386, 80486, Pentium ve Celeron serileri ve AMD
işlemciler üzerinde çalışmayacağı anlamına gelmemektedir. İşlemci, register adı verilen bölmelerden oluşur. Bu register’ları Data register’ları, Pointer ve Index register’ları, Segment register’ları, Instruction Pointer (komut göstergeci) ve
Program Status Word (Flag register’ı) olarak gruplandırabiliriz. Aşağıda 8086 işlemcinin register yapısı basitçe gösterilmiştir.
Data Register’ları
Şekilde de görüldüğü gibi 8086 işlemci 14 adet 16-bit kapasiteli register’a sahiptir. Bu register’lardan Data register’ları ( AX, BX, CX ve DX ) kendi içlerinde 8-bit kapasiteli iki  register’a bölünmektedir. Bu register’lar AX için AH ve AL, BX için BH ve BL, CX için CH ve CL ve DX için DH ve DL olarak adlandırılır. AH, 16-bitlik AX register’ının 8-bitlik yüksek(High) seviyeli bölümü ve AL ise 16-bitlik AX register’ının 8-bitlik alçak (Low) seviyeli bölümü olarak adlandırılır. Programlarımızı yazarken 8-bitlik verilerin işlenmesinde bu 8-bitlik register’lardan faydalanırız. Daha sonraki bölümlerde de göreceğimiz gibi data
register’ları bir çok işlemde (döngülerde, interrupt kullanılmasında, matematiksel işlemlerde…) CPU tarafından rezerv edilmişlerdir. Bu durumlarda bizim register içerisindeki değeri değiştirme şansımız yoktur.Programlarımızda BH veya BL register’ının değerinin değişmesi doğrudan BX register’ının değerini değiştirecektir. Aynı durum diğer data register’ları için de geçerlidir. Bir örnek vermek gerekirse: BX register’ımızın değeri A43F olsun. Bu durumda BH=A4 ve BL=3F
olur. Simdi BL’nin değerini 05 olarak değiştirelim. Son durumda BX=A405, BH=A4 ve BL=05 olacaktır. (Yukarıdaki şekil incelenirse verilen örnek daha kolay anlaşılacaktır)
Pointer ve Index Register’ları
Pointer ve index register’ları bellek içerisindeki herhangi bir noktaya erişmek için kullanılır. Bu iş için erişilmek istenen noktanın offset ve segment adresleri gerekli register’lara atanarak işlem gerçekleştirilir.
Segment Register’ları
Segment register’ları (CS, DS, SS ve ES) , programımız bilgisayarın belleğine yüklendiği zaman bellek içerisinde oluşturulan bölümlerin (Segment) başlangıç adreslerini tutarlar. Yani bu register’lara bir çeşit yer göstergeci denebilir. CS, programımızın çalıştırılabilir kodlarını barındıran (Code Segment) bellek bölgesinin başlangıç adresini tutar. Yani CS ile gösterilen yerde makine dili kodlarımız vardır. DS, programımız içerisindeki değişkenlerin saklandığı bölümdür. SS, bellekte programımız için ayrılan stack bölümünün başlangıç adresini tutar. Stack, ileride göreceğimiz PUSH ve POP komutları ile belleğe değer atılması ve alınması için, programların ve fonksiyonların sonlandırıldıktan sonra nereye gideceklerini belirten adres bilgisini tutmak için ve program ve fonksiyonlara gönderilen parametreleri saklamak
için kullanılır. UNIX tabanlı sistemlerde kesme (interrupt) kullanımı için gerekli parametrelerin belirtilmesi için de stack kullanılır. ES (Extra segment) daha çok dizgi işlemleri için kullanılır.
Instruction Pointer
Instruction Pointer register’ı işlemci tarafından işlenecek bir sonraki komutun bellekteki adresini saklar. Bu register üzerinde programcı tarafından herhangi bir işlem yapılamaz. Her komut işletildikten sonra CPU otomatik kullanılan komuta göre gerekli değeri bu register’a atar.
Flag Register
Flag Register diğer register’lardan daha farklı bir durumdadır. Diğer resigterların 16-bit halinde bir bütün olarak ele alınmalarından farklı olarak flag register’ın her biti CPU için ayrı bir değere sahiptir (8086 işlemci tarafından sadece 9 tanesi kullanılmaktadır). Bu bitlerin özel olarak isimlendirilmeleri aşağıda verilmiştir.
O : Overflow flag
D : Direction flag
I : Interrupt flag
T : Trace flag
S : Sign flag
Z : Zero flag
A : Auxilary Carry flag
P : Parity flag
C : Carry flag

Bilgisayar ikilik sayı sistemini kullandığına göre bu register’lar içerisindeki değer herhangi bir anda ya 1 yada 0’dır. Bir bitin 1 olma durumuna “Set”, 0 olma durumuna ise “Reset” denir. İşlemci birçok komutu icra ederken bu bitlerin durumlarından faydalanır.
Carry Biti
İşlemci tarafından yapılan herhangi bir işlem sırasında alıcı alana yerleştirilen sayının alıcı alana sığmamasından doğan olaya “carry”(taşma) denir. CPU bir işlem sonucunda taşma ile karşılaşırsa carry flagın değeri 1 yapılar.
Parity Biti
Bir işlem sonucunda word’un düşük seviyeli baytı iki ile tam bölünüyorsa bu bite 1 aksi taktirde 0 atanır. İşlemin yüksek seviyeli baytındaki sayının iki ile bölünüp bölünmemesi bu flag için önemli değildir.
Zero Biti
Yapılan herhangi bir işlem sonucu sıfır ise bu flag set edilir.
Sign Biti
İşaretli sayılarda bayt (8 bit) için sayının 7. ve word (16 bit) için sayının 15. biti işaret biti olarak adlandırılır. Yapılan bir işlem sonucunda alıcı alan içersindeki işaret biti sign flag içerisine kopyalanır. Yani sign bitinin değeri 0 ise elde edilen sonuç pozitif, 1 ise elde edilen sonuç negatif kabul edilir.
Trace Biti
CPU’nun sadece bir komut çalıştırıp beklemesi için kullanılır. DEBUG’ın kullandığı “Trace” işlemi bu flagın set edilmesi ile gerçekleştirilir.
Interrupt Biti
CPU’nun çeşitli aygıtlardan gelen kesme isteklerini dikkate alıp almayacağını bildirir. 0 olması durumunda istekler dikkate alınmayacaktır.
Overflow Biti
İşaretli sayılar üzerindeki taşmayı kontrol etmek için kullanılır. Hatırlarsanız işaretsiz sayılar  için carry flagı kullanılmıştır. Fakat durum işaretli sayılar için biraz daha farklıdır. İşaretli sayılarda meydana gelecek bir taşma bayt veya wordun işaret bitini etkileyeceği için pozitif  (işaret biti 0) olan bir işaretli sayının taşma sonucu negatif (işaret biti 1) gibi algılanması
mümkündür. Bu durumda overflow flagı set edilir ve işlem sonucunun yanlış algılanması
engellenir.