80×86 Assembly Dersleri 2 – Segment (Kesim) Yapısı

80×86 Assembly Dersleri

Segment (Kesim) Yapısı

80×86 Assembly Dersleri ilk serisindeki görselde değindiğimiz gibi, 8086 işlemcisinde 20 adres bacağı olmasına rağmen en büyük yazmacı 16 bittir. Tek bir yazmaç üzerindeki değer 64KB’lık bir alanı adresleyebilmektedir. Bu bilgiye dayanarak 20 adres bacağıyla adresleyebilmesi için 1MB’lık bellekten yararlanabilmek için kesimli erişim tekniği (segmented memory management) ileri sürülmüştür. 80×86 familyasında ana bellekteki her biri çift adresten başlamak üzere 64KB’lık kesimlere (segment) ayrılmıştır. Temel olarak 4 adet kesim çeşidinden bahsetmek mümkündür.

Herhangi kesime erişmek için o alanın kesim yazmacını kullanmak gerekir. Bu kesim yazmaçları CS (Code Segment), SS (Stack Segment), DS (Data Segment) ve ES (Extra Segment) olarak adlandırılır. Kesim içerisindeki verilere erişmek için ise kesim içi işaretçiler kullanılır. Kesim içi işaretçiler göreli konum (Segment:Offset) adıyla anılan, kesimin başlangıcından olan uzaklığı belirleyen değerleri tutarlar.

Kesim değerlerini; sokağınızdaki evleri belirlemek için.
Kesim içi değerlerini; sokağınızdaki evlerin kapı numaraları olarak düşünebilirsiniz.

Code Segment – Kod Kesimi – CS

Yazdığınız uygulamayı oluşturan programın (yani derlenmiş kodların) bellek üzerine yerleşmiş olması gerekiyor ki, uygulamanız çalışabilsin. Buna göre istenilen komutların bulunduğu bellek alanına; kod kesimi (code segment) (CS) denir. Kod kesiminin başlangıç adresi CS yazmacı ile belirlenmektedir. Bu alan içerisinde hangi komutun işleneceğini gösteren işaretçi IP (Instruction Pointer) dır. Çalıştırılması istenilen komutun yerini CS:IP çifti belirler. IP yazmacındaki değer, işletilen komutu takiben bir sonraki komutun başlangıç adresini gösterecek şekilde otomatik olarak değişir. CS ve IP yazmaçlarının değerlerinin program içerisinde değiştirilmesi sonucu çalışma akışı değişeceğinden hataya, kimi durumlarda da sistemin kilitlenmesine sebep olabilir. Bu durumda yazılan program içinde procedure çağrılması (CALL) veya koşullu (Jxx) ya da koşulsuz (JMP) dallanma ve çevrim (LOOP) komutlari ile program içindeki akış kontrol edilebilir hale gelir.

 

Stack Segment – Yığın Kesimi – SS

Yığın kısaca, son giren ilk çıkar (LIFO) kuralına göre çalışan bellek alanıdır. Bu kesimin başlangıç adresi SS yazmacı ile belirlenmektedir. Bu kesim, işletim sistemine dönebilmek için gerekli dönüş parametrelerinin saklanması ve programın çalışması sırasında kullanılan PUSH komutlarının sonucu oluşan geçici veri saklama ihtiyacını karşılamak için ayrılmıştır. Bu kesim içine konulacak verinin nereye yerleştireceğini (PUSH) ya da nereden alınacağını (POP) belirleyen işaretçi SP (Stack Pointer) dır. SP yazmacı, 8086 familyasında yığın kesiminin en üstündeki dolu yeri gösterir ve büyük adresten küçük adrese doğru ilerler. Örneğin; PUSH komutu ile yığına 2 byte (word) veri yerleştirildiğinde SP yazmacının değeri kendiliğinden 2 byte (word) azalacaktır. Ya da tam tersi işlem POP komutuyla yığından 2 byte (word) veri alındığında ise SP yazmacı kendiliğinden 2 byte (word) artacaktır.
8086 familyasında PUSH ve POP komutları ile yığına tek seferde sadece bir word (2 byte) veri yerleştirilebilir veya alınabilir.

SP yazmacının değerini PUSH veya POP komutlarının dışındaki bir yol ile değiştirilmesi LIFO kuralını engelleyeceğinden bir takım problemlere neden olur. Eğer yığın (stack) kesimi içerisinde, yığın içi dizilişi engellemeden yığının herhangi bir yerindeki veriye erişmek isteniyorsa bunun için BP (Base Pointer) yazmacı kullanılmalıdır. BP yazmacıyla yığın kesimi içerisinden herhangi bir değere erişerek bir kopyasını almak mümkündür. BP yazmacı kullanıldığında kesinlikle yığın kesiminden veri alınmasına veya veri eklenmesine ya da yığın kesiminden bulunan herhangi bir verinin kaydırılıp değiştirilmesi anlamına gelmez.
Kod kesiminde (Code segment) yer alan ve programın akışını değiştirme özelliği bulunan bazı komutlar (CALL, INT gibi) yığın kesimine bazı özel değerleri saklamak içinde kullanabilir. Bu özel değerler kullanılan bu bazı komutlar ile yığına veri eklenmeden önce bayraklarda (Flags) bulunan değerlerdir. Yığına yerleştirilen bu değerleryine program içerisinde yer alan (RET veya IRET) komutları yardımıyla geri alınırlar.

LIFO: Last In First Out

 

Data Segment – Veri Kesimi – DS

Kod kesiminde (Code segment) programların komut topluluğu yer aldığı gibi, programların üzerinde işlem yapacağı veri de bellekteki veri kesiminde (data segment) bulunur. Veri kesiminde; kullanıcı tarafından tanımlanmış giriş değerleri ile programın çalışması sonucunda üreteceği sonuç değerleri yer alacaktır. Veri kesiminin başlangıç adresi DS yazmacı ile belirlenir, kesim içi adreslemelerde ise SI, DI ve bazı durumlarda BX yazmaçlarından yararlanılmaktadır.

Extra Segment – Ek Kesimi – ES

Kullanıcının işleyeceği veri kesiminin kapasitesinden fazla veya aynı anda iki farklı veri kesimine erişim söz konusu olduğunda ek kesimden yararlanılmaktadır. Ek kesim (Extra segment) özellikle yükeleme ve string ifadelerin gerçekleşmesi sırasında devreye girmektedir. Ek kesimin başlangıç adresi ES yazmacı ile belirlenir, kesim içi adreslemelerde ise DI, SI ve bazı durumlarda BX yazmaçlarından yararlanılmaktadır.

Leave a Reply

Your email address will not be published. Required fields are marked *