Thursday, March 29, 2007

MİKROİŞLEMİ VE FLAGLAR

İntel 8088 Mikroişlemcisinin DEBUG İle Uygulamaları

1. Giriş
Debug programı, Assembly dili programlarının makine diline, makine dili programlarını assembly diline dönüştüren çift yönlü bir derleyicidir. Debug kısaca makine dili formatlı program dosyalarının, bilgisayar belleğinin, komutların ve verilerin incelenmesi ve düzenlenmesi için kullanılır. Debug ile programların bütününü, bir kısmını veya programı oluşturan komutları tek tek icra ettirebilir, her icranın sebep olduğu etkilileri inceleyebiliriz.Yine bellek içindeki veya program içindeki komut yada verileri değiştirebilir, yeni eklentiler yapabiliriz.

2. İntel 8088 Ailesi
8088 Mikroişlemcisi 8 bit harici ve 16 bit dahili data ve 20 bit adres yoluna sahip bir mikroişlemcidir. Komut seti 92 adet temel komut tipinden oluşur. 92 komut tipinin, adresleme modlarının ve çeşitli tipteki verilerin, çeşitli kombinasyonlar altında bir araya getirilmesi ile 8088 tarafından icra ettirilebilecek binlerce komut elde edilebilir.

Debug programı daha iyi kullanmak ve programlarımızı anlayarak yapabilmek için mikroişlemcimizin register ve flaglerinin kullanım amaçlarını öğrenmeliyiz.

2.1 8088 Mikroişlemcisi Registerleri

8088 Mikroişlemcisinde her biri 16 bit genişliğinde 14 adet register vardır.Registerler mikroişlemci tarafından verilerin geçici süreler ile saklanması ve bu veriler üzerinde işlem yapılması, komut işleme sürecinin hızlandırılması gibi özel amaçlar için kullanılır.

8088 Mikroişlemcisindeki registerleri dört başlık altında toplayabiliriz.

v Segment Registerleri
v Genel Amaçlı Registerler
Ø Data Registerleri
Ø Pointer ve İndex Registerleri
v Instruction Pointer Registeri
v Program Status Word Registeri






2.1.1 Segment Registerleri

8088 Mikroişlemcisi kullanan bilgisayarlar, programları ve dataları segment adı verilen maksimum 64 KB büyüklüğünde iki ayrı bellek alanına yerleştirirler. 8088 mikroişlemcisi aynı anda CODE, DATA, STACK ve EXTRA olmak üzere 4 segmente sahip olabilir. Segment registerleride bu segment alanlarının başlangıç adreslerinin tutulması için kullanılır.

Code segment registeri CS, icra gören programı içeren segmentin adresini gösterir. Data segment registeri DS, geçerli Data segmentinin başlangıç adresini gösterir. Bu segment genel olarak program değişkenleri tarafından kullanılır. Stack segment registeri SS, geçerli stack segmentin başlangıç adresini içerir. Stack segment çeşitli verilerin geçici olarak saklandığı bir bellek bloğudur. Extra segment registeri ES, geçerli extra segmentin başlangıç adresini içerir. Extra segment, genel olarak string operasyonları için kullanılır.

2.1.2 Genel Amaçlı Registerler

2.1.2.1 Data Registerleri
Genellikle aritmetiksel işlemler için kullanılan ve her biri 16 bit uzunluğunda olup, 16 bitlik bir register veya birbirinden bağımsız 8’er bitlik birer register olarak ta kullanılabilen registerlerdir.

Akümülatör olarak adlandırılan AX registeri; çarpma, bölme, giriş, çıkış ve bazı string operasyonlarında word uzunluklu olarak kullanılır. AL registeri byte uzunluklu olup, bazı operasyonların sayaç registeri olarak veya desimal amaçlı aritmetiksel işlemlerde alıcı alan olarak kullanılır. AH registeri byte uzunluklu bölme ve çarpmalarda kullanılır. BX Base registeri, daha çok bellek içindeki verilerin adreslenmesinde kullanılır. CX Count registeri, sayaç registeridir, LOOP komutlarının veya tekrarlı string operasyonlarının sayaç registeri olarak kullanılır. CL registeri, shift ve rotate operasyonlarının sayaç registeri olarak kullanılır. DX Data registeri, word uzunluklu çarpma ve bölme operasyonlarında, giriş çıkış operasyonları için port numarası göndermede kullanılır.

2.1.2.2 Pointer ve İndex Registerleri
Pointer ve İndex registerleri, Data registerleri gibi aritmetiksel işlemler için kullanılabilmelerinin yanısıra asıl kullanım amaçları, çeşitli bellek bölgelerindeki verilere ulaşabilmek için, adres gösterici olarak kullanılmalarıdır.

Bellek içerisindeki bir bölgenin adresini gösterebilmek için, iki ayrı adres değeri kullanılır. İlk değer, işaret edilen bölgeyi içinde barındıran segmentin adresidir. Bu noktada segment registerlerinden yararlanılır. Bölgenin segment içerisindeki yerini gösteren ikinci adres değeri ise offset adres olarak adlandırılır. Offset adreslerinin gösterilmesi için, pointer ve index registerleri kullanılır.


Erişilmek İstenen Bölge
Segment Adres Registeri
Offset Adres Registeri
CODE
CS
IP
DATA
DS
BX, SI veya DI
STACK
SS
SP veya BP
EXTRA
ES
BP

2.1.3 İnstruction Pointer Registeri

Komut göstergeci olarak adlandırılan IP registeri, mikroişlemcinin icra edeceği bir sonraki komutun offset adresini gösterir. IP registeri, özel anaçlı bir register olması nedeniyle programcı tarafından direkt olarak kullanılamaz. Ancak, bu registerin değerini, stack üzerindeki bilgiler ile dolaylı olarak değiştirmek mümkündür.


2.1.4 Program Status Word Registeri
Program Status Word registeri PSW, 8088 mikroişlemcisinin özel bir registeridir ve Flag registeri olarak ta adlandırılır. Flag registeri bir bütün olarak değerlendirilemez. Flag registeri, bit bit dikkate alınır ve her bit kendi başına özel bir anlama sahiptir.







O : Overflow (Taşma) Flag D : Direction (Yön) Flag
I : İnterrupt (Kesme) Flag T : Trap Flag
S : Sign (İşaret) Flag Z : Zero (Sıfır) Flag
A : Auxilary Carry (Yardımcı Elde) Flag P : Parity (Eşlik) Flag
C : Carry (Elde) Flag


2.1.4.1 Carry Flag ( Elde Bayrağı )
Yandaki toplama işleminde her basamağın toplamında bir elde olmakta ve işlem sağa doğru gitmektedir. İşlemin sonucunda en sonda yine elde olmakta ve bu elde değeride carry flagte MSB biti olarak tutulmaktadır. Aritmetiksel işlemlerde dikkat edilmesi gereken en önemli nokta, işlem sonucunun alıcı alana sığıp sığmamasıdır. Carry Flagin çalışmasını kısaca açıklayalım.
Çıkarma işleminde de aynı mantık ile yapılmakta ve bu sefer carry değerleri borrow adını almaktadır.

2.1.4.2 Sign Flag ( İşaret Bayrağı )
8 bitlik bir bellek bölgesinde işaretli bir sayı bulunuyorsa bu sayının ilk 7 biti sayının sayısal büyüklüğünü 8. bit sayının işaretini gösterir. 8. bit yani MSB biti, sign biti olarak ta ifade edilebilir. 8. bit 0 ise sayı pozitiftir ve 1 ise sayı negatiftir.

Mikroişlemci bu 8. biti Sign flagnin içine kopyalar ve bir operasyon sonrasında sign flagnin değerine bakarak operasyon sonrasında elde edilen değerin işareti öğrenilebilir.

2.1.4.3 Overflow Flag ( Taşma Bayrağı )
Bir byte veya bir word uzunluğundaki bir işaretsiz sayı, içerisindeki bütün bitlerini sayısal büyüklüğü için kullanırken, işaretli sayılar ise MSB bitlerini işaret biti olarak kullandıklarından sayısal büyüklük için bir
Yandaki toplama işleminde, toplanan sayılar işaretli sayı kabul edilirse bu sayıların 8. biti 0 olduğundan sayılar pozitiftir ve toplama işlemi sonucunda ise elde edilen sayının 8. biti 1 olduğundan sonuçbytelık işaretli sayı 7 bitini kullanır. Kısaca bir bytelık işaretsiz sayı 8 bitten oluşurken, işaretli sayı ise 7 bitten oluşmaktadır.
negatif çıkmaktadır ve işlem hatalı olmuştur. Böyle bir işlem Overflow flagnin set edilmesine sebep olacaktır. İşaret biti 0 olduğu durumda da Overflow flag reset durumunu alacaktır

2.1.4.4 Auxiliary Carry Flag ( Yardımcı Elde Bayrağı )
Auxiliary carry flag, bir operasyon sırasında sonucun aktarılacağı alıcı alanın düşük seviyeli 4 bitini kontrol eder. Bu bitler üzerinden soldaki bit pozisyonuna ( 5. bite) bit taşma meydana gelirse auxiliary carry flag set edilir.
Yandaki toplama işleminde düşük seviyeli 4 bit üzerinden bir taşma meydana gelmiştir. Bu işlemin sonucunda da Auxiliary flag set edilir.
Bu flag, desimal operandlı komutların sonuçlarını desimal amaçlı düzenlemek için kullanılır. İşlem sonucunun düzenini anlamak için bu flag kullanılır.


2.1.4.5 Zero Flag ( Sıfır Bayrağı )
Zero flag, bir işlem sonucunun 0’a eşit olup olmadığını test etmek için kullanılır.Bir işlem sonucunda, alıcı alana aktarılan sonuç değeri 0’a eşitse Zero flag set edilir. Sonuç değeri 0’dan farklı isse Zero flag reset edilir.

2.1.4.6 Parity Flag ( Eşlik Bayrağı )
Parity flag, bir operasyon sonucunun düşük seviyeli byte’ı içindeki 1 değerlikli bitlerinin sayısı çift ise set edilir, tek ise reset edilir. Bu flag genellikle haberleşme işleminde gönderilen byte’ların hata kontrolü için kullanılır.

2.1.4.7 Direction Flag ( Yön Bayrağı )
Direction flag, stringlerin veya bir bellek bloğu içeriğinin bir noktadan başka bir noktaya transferini sağlayan ya da string bilgiler üzerinde kıyaslama yapan string komutlarında kullanılır. Direction flagnin değeri, stringi oluşturan elemanlar üzerindeki işlemin yönünü gösterir.Direction flagnin değeri 0 iken, işleme tabii tutulacak string elemanlarının yerini gösteren index registerlerinin değerleri birer birer artar, tersi durumda ise bu registerlerin değerleri birer birer azalır.


2.1.4.8 İnterrupt Flag ( Kesme Bayrağı )

Mikroişlemci, bilgisayar sistemi içinde yer alan giriş/çıkış ve iletişim aygıtlarını sürekli olarak kontrol eder. Bir program icra edilirken, çevre aygıtlardan bir istek gelirse o an icra edilen programda bulunulan komut satırının adresi Stack’e atılarak icra edilen program yarım bırakılıp, çevre aygıtlarının işlemi yapılır ve bu işlem bittiğinde işlemci Stack’ten kaldığı yerin adresini alarak normal çalışmasına geri döner.

Çevre aygıtlardan bir istek geldiğinde interrupt bayrağı set edilir ve mikroişlemcide bu bayrağı dikkate alarak çevre aygıtlarının işlemini yapar. İnterrupt bayrağını kontrol ederek çevre aygıtlardan gelen kesme işlemlerine müdahale edebiliriz.

2.1.4.9 Trap Flag

Bu bayrak yalnızca Debug programı içindeki T komutunun icrası için kullanılır. Mikroişlemci, bir programı icra ettirirken, programı oluşturan komutları tek tek ele alır ve bir komutun icrası bitiğinde, beklemeksizin bir sonraki komuta geçer. Oysa bir programı Debugta çalıştırdığımızda her komutun etkisini tek tek görmek isteriz. Bunun için T komutu trap flagni set ederek, mikroişlemcinin bir tek komutu icra ettirmesini ve bir sonraki komuta geçmemesini sağlar.