Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 21

2.

Sistem Organizasyonu
80X86 assembly dilinde program yazmak, bilgisayarın donanım yapısını ve Von Neuman mimarisini
anlamayı gerektirir. Bu mimari, merkezi işlem birimi, bellek ve giriş-çıkış birimleri olmak üzere üç
temel parçaya dayanır ve bu birimlerin birbirleriyle veri yolu üzerinden iletişim kurduğu bir yapıdır.
Programlama sırasında, bilgisayar bileşenlerinin nasıl etkileşime girdiğini ve veri, adres ve kontrol
yollarının işlevlerini bilmek önemlidir. Zamanla, bilgisayarın temel parçaları gelişmiş ve farklı
ihtiyaçları karşılamak üzere yeni yol tipleri oluşturulmuştur.
Önemli Noktalar:
- ** Von Neuman Mimarisi: ** Merkezi işlem birimi, bellek ve giriş-çıkış birimlerinden oluşur,
bu birimler veri yolu üzerinden iletişim kurar.
- ** Birimler Arası İletişim: ** Veri, adres ve kontrol yolları, bilgisayarın farklı bölümleri
arasında veri aktarımını sağlar.
- ** Programlama ve Kontrol: ** Donanımın yapısını ve işletim sistemleriyle olan etkileşimini
anlamak, etkili programlama için kritiktir.
- ** Yol Tipleri ve Gelişim: ** Bilgisayarın evrimi, veri genişliği, dönüş hızı ve aygıt yönetimi
gibi özelliklere sahip farklı yol tiplerinin geliştirilmesine yol açmıştır.

2.1 FSB Hızı


FSB (Ön Taraf Veriyolu), işlemci ile ana kart arasındaki iletişimi sağlayan bir yapıdır ve hızı 66 –
1600 Mhz arasında değişebilir. İşlemcilerin GHz düzeyinde hızlarına göre FSB'nin yavaş kalması
darboğazlara yol açabilir. Bu durum, verinin işlemciye mümkün olan en yakın yerde bulunarak ve
işlemcilerdeki ön bellek birimleri (cache memory) aracılığıyla çözülebilir. Ön belleğe alınan veri ve
komutlar sayesinde işlemci, ana belleğe nazaran daha hızlı erişim sağlayarak performansı artırır ve
darboğazı azaltır.
Önemli Noktalar:
- **FSB Hızları:** İşlemci ile ana kart arasında 66 – 1600 Mhz arasında değişir.
- **Darboğaz Sorunu:** İşlemci hızlarının FSB hızlarına göre yüksek olması nedeniyle yaşanır.
- **Verim Artışı Yöntemi:** Verinin işlemciye yakın tutulması ve ön bellek kullanımı ile
çözülür.
- **Ön Bellek (Cache Memory):** İşlemcinin daha hızlı veri işlemesini sağlayan birimdir.
- **Veri Boru Hatları (Pipeline):** Ana bellekten ön belleğe veri taşıyan yapıdır.

2.2. Bellek Bağlantı Yolları


Bellek birimlerinin anakartla bağlantısı bellek bağlantı yuvaları ile sağlanır. Bu bellek birimleri, veri
genişlikleri, boyutları, hızları ve bacak dizilişleri gibi çeşitli özelliklere göre üretilmiştir. Başlangıçta,
DIP yapısındaki bütünleşik devreler teker teker anakart üzerine yerleştirilirken, zamanla SIMM ve
DIMM gibi modüller halinde baskılı devre üzerine monte edilmeye başlanmıştır. SIMM'ler 8 ya da 32
bit, DIMM'ler ise 64 bit veri aktarımı yapabilir. Bu modüller arasındaki farklılıklar, bacak sayıları ve
çentiklerin konumu ile belirginleştirilmiştir.

Önemli Noktalar:
- **Bellek Bağlantı Yuvaları:** Anakart ile bellek birimleri arasındaki bağlantıyı sağlar.
- **DIP, SIMM ve DIMM Modülleri:** Bellek birimlerinin evrimi ve çeşitlenmesi, veri
aktarım kapasiteleri ile belirlenir.
- **Veri Genişliği ve Hız:** Bellek modüllerinin performansını etkileyen ana faktörler.
- **Bacak Dizilişi ve Çentik Konumu:** Modüller arasındaki farklılıkları ve uyumluluğu
belirleyen özellikler.

2.3. Giriş/Çıkış Yolları


Bilgisayarın dış dünya ile iletişim kurabilmesi için giriş/çıkış birimleri ve bağlantı ara yüzleri
kullanılmaktadır. Bu bağlantı yolları farklı hızlarda çalışır ve fiziksel bağlantı şekilleri değişkenlik
gösterir. Yüksek hızlı yollar, bilgisayarın grafik, ikincil bellek gibi çeşitli çevre birimleriyle
etkileşimini sağlarken, düşük hızlı yollar genellikle veri miktarının az olduğu durumlar için kullanılır
ve çoğunlukla paralel veya seri bağlantılardan oluşur.
Önemli Noktalar:
- **Giriş/Çıkış Birimleri ve Ara Yüzleri: ** Bilgisayarın dış dünya ile iletişim kurmasını sağlar.
- **Farklı Hızlardaki Yollar: ** Yüksek ve düşük hızlı yollar, çeşitli çevre birimleriyle iletişimi
destekler.
- **Yüksek Hızlı Bağlantılar: ** AGP, PCI, PCIe gibi ara yüzler grafik ve ikincil bellek gibi
birimler için kullanılır.
- **Düşük Hızlı Bağlantılar: ** Az veri taşınan durumlar için paralel ve seri bağlantılar tercih
edilir.

3. 80X86 İşlemci Ailesi


Yarı iletken teknolojisindeki ilerlemeler, hesaplama kapasitesi daha yüksek işlemcilerin üretilmesini
sağlamıştır. İlk olarak elektronik hesap makineleri için geliştirilen işlemciler, zamanla bilgisayarların
vazgeçilmez bir parçası haline gelmiştir. İşlemciler, üzerinde işleyebildikleri veri büyüklüğüne göre 8,
16, 32 ve 64 bit olmak üzere sınıflandırılır. AMD ve Intel, 64 bitlik işlemci teknolojisinde öncü
firmalardır, Intel’in Core serisi gibi işlemciler ise 80X86 mimarisine 64 bit komut setleri ekleyerek bu
kategoride yer alır.
Önemli Noktalar:
- **Yarı İletken Teknolojisi:** Hesaplama kapasitesi yüksek işlemcilerin geliştirilmesini sağlar.
- **İşlemci Gelişimi:** Elektronik hesap makinelerinden bilgisayarlara kadar uzanır.
- **Bit Değerlendirilmesi:** İşlemciler, işleyebildikleri veri büyüklüğüne göre 8, 16, 32 ve 64
bit olarak sınıflandırılır.
- **64 Bit Teknoloji:** AMD ve Intel, 64 bit işlemci teknolojisinde öncüdür.
- **80X86 Mimarisi:** Intel’in Core serisi gibi işlemciler, 80X86 mimarisine 64 bit komut
setleri eklenerek geliştirilmiştir.

3.1. Bellek Kullanımı ve Büyüklüğü


İşlemcilerin erişebileceği bellek miktarı, adres yolunun bit sayısıyla belirlenir ve bu belleğe fiziksel
bellek denir. İlk bilgisayarlar 16 bit adres yoluna sahip olup, 65,536 byte'a erişebilirken, bellek
birimlerinin maliyeti nedeniyle genellikle 4KB ile 16KB arası bellekler kullanılmıştır. 1980'lerle
birlikte bellek miktarı artmış, CP/M işletim sistemi bu sınırlı kapasiteyi yönetmiş, sonrasında
geliştirilen kesimli bellek modeli daha fazla belleğin adreslenmesine olanak sağlamıştır. 8088 işlemcisi
ile başlayan bu süreç, DOS işletim sistemiyle devam etmiş ve bellek kullanımı daha da genişlemiştir.
Önemli Noktalar:
- **Fiziksel Bellek:** İşlemcinin adresleyebileceği bellek miktarı.
- **Bellek Kapasitesi:** İlk bilgisayarlarda 65,536 byte'a kadar, 1980'lerden itibaren artış
göstermiş.
- **CP/M ve DOS:** Sınırlı bellek kapasitesini yöneten işletim sistemleri.
- **Kesimli Bellek Modeli:** Daha fazla belleğin adreslenmesine olanak sağlar, yığıt alanının
kontrolsüz büyümesini önler.
- **Bellek Kullanımındaki Gelişmeler:** İşlemci ve bellek teknolojisinin evrimi, bellek
miktarının ve kullanımının artmasına neden olmuştur.

3.1.1. Genişletilmiş (Expanded) Bellek


İşlemcilerin doğrudan adresleyemediği bellek ihtiyaçlarını karşılamak için genişletilmiş bellek
çözümleri geliştirilmiştir. İlk olarak 32 MB kapasiteli bellek kartları tasarlanıp, özel tekniklerle erişim
sağlanmıştır. Genişletilmiş bellek, 16 KB'lık pencerelere bölünerek, sıra anahtarlama yöntemi ile 1
MB'a kadar erişilebilir hale getirilmiştir. Bu belleğe erişim için EMM yazılımı kullanılmıştır.
Önemli Noktalar:
- **Genişletilmiş Bellek:** İşlemcilerin doğrudan adresleyemediği, fakat uygulamaların
gereksinim duyduğu bellek.
- **Bellek Kartları:** 32 MB kapasiteli, erişim için özel teknikler gerektiren kartlar.
- **Sıra Anahtarlama Yöntemi:** 16 KB'lık pencereler halinde genişletilmiş belleğe erişimi
sağlar.
- **EMM Yazılımı:** Genişletilmiş bellek yönetimi için geliştirilen yazılım.
3.1.2. Uzatılmış (Extended) Bellek
Uzatılmış bellek, işlemcilerin 1 MB üzerindeki belleği doğrudan adresleyebildiği bölgeyi tanımlar.
80286 ve sonraki model işlemciler için geçerli olan bu kavram, işlemcilerin adres bacaklarının
sayısına bağlı olarak belirlenir. 80286 işlemcisi 1 MB - 16 MB arası, 80386 işlemcisi ise 1 MB - 4 GB
arası belleği adresleyebilir. Uzatılmış bellek, DOS 4.0 ve üzeri işletim sistemlerinde özel aygıt
sürücüleri aracılığıyla kullanılırken, yeni nesil işletim sistemleri korumalı kip düz modeli kullanarak
bu belleğe erişir. İşlemcinin bu erişim tekniğini desteklemesi için gerekli tasarım değişiklikleri
yapılmıştır.

Önemli Noktalar:
- **Uzatılmış Bellek:** 1 MB üzeri belleğin işlemciler tarafından doğrudan adreslenebildiği
bölge.
- **Adresleyebilme Kapasitesi:** İşlemcinin adres bacaklarının sayısı ile orantılıdır.
- **Kullanım ve Yönetim:** DOS 4.0 ve üstü işletim sistemlerinde özel aygıt sürücüleri ile;
yeni nesil işletim sistemlerinde korumalı kip düz modeli ile yönetilir.
- **Tasarım Değişiklikleri:** İşlemcinin uzatılmış bellek alanına erişimini desteklemek için
gerekli.
3.2. 80x86 İşlemcisinin İç Yapısı
3.3. Kesim (Segment) Yapısı
8086 işlemcisinin 20 adres bacağına karşın, en büyük yazmacı 16 bit olup, bu yüzden doğrudan 64
KB'den fazla belleği adresleyemez. Bu sınırlılığı aşmak için kesimli bellek yönetim tekniği
geliştirilmiştir. 80X86 işlemci ailesi, ana belleği 64 KB'lık kesimlere ayırarak ve kesim yazmaçları ile
işaretçiler kullanarak belleğin tümünü kullanabilir. Bu yapı, belleğe erişimde esneklik sağlar ve
programlama açısından önemli bir avantaj sunar.
Önemli Noktalar:
- **20 Adres Bacakları:** 8086 işlemcisinin sahip olduğu, ancak 1 MB'lık belleğe tam erişim
sağlayamama sorunu.
- **Kesimli Bellek Yönetimi:** 64 KB üzeri belleği adreslemek için geliştirilen yöntem.
- **Ana Belleğin Bölünmesi:** Belleğin 64 KB'lık kesimlere ayrılması.
- **Kesim Yazmaçları:** CS, SS, DS, ve ES; bellek kesimlerine erişim sağlayan yazmaçlar.
- **Kesim İçi İşaretçiler:** Bellek kesimleri içindeki göreli konumları belirleyen değerler.

3.3.1. Kod (Code) Kesimi


Bir bilgisayarın uygulamayı çalıştırabilmesi için, programın derlenmiş kodunun belleğe yerleştirilmesi
gerekir. Bu kodlar kod kesiminde saklanır ve CS yazmacı kod kesiminin başlangıç adresini, IP
yazmacı ise işlenmekte olan komutun adresini belirtir. IP, bir komut işlendikten sonra otomatik olarak
bir sonraki komutun adresini gösterecek şekilde güncellenir. CS ve IP yazmaçları aracılığıyla
programın akışı yönlendirilir; ancak bu değerlerin gelişigüzel değiştirilmesi sistem hatalarına yol
açabilir. Program içindeki dallanma, döngü komutları ve kesmeler, program akışının kontrollü şekilde
değişmesini sağlar.
Önemli Noktalar:
- **Kod Kesimi:** Programın derlenmiş kodlarının saklandığı bellek alanı.
- **CS Yazmacı:** Kod kesiminin başlangıç adresini belirtir.
- **IP (Instruction Pointer):** Şu an işlenen komutun adresini gösterir ve her komut işlendikten
sonra bir sonraki adresi göstermek üzere güncellenir.
- **Program Akış Kontrolü:** CS ve IP aracılığıyla sağlanır, ancak yanlış değişiklikler hata ya
da kilitlenmelere neden olabilir.
- **Dallanma ve Kesmeler:** Programın kontrollü akışını sağlayan yapılar, doğru
kullanıldığında sistemde problem yaratmaz.

3.3.2. Yığıt (Stack) Kesimi


Yığıt kesimi, LIFO (Last In First Out) prensibine göre çalışan bir bellek alanıdır ve SS yazmacı ile
başlangıç adresi belirlenir. Bu kesim, dönüş parametrelerinin saklanması ve geçici veri saklama
ihtiyacı için kullanılır. SP (stack pointer) yazmacı, yığındaki en üstteki dolu veya boş yeri gösterir ve
PUSH veya POP komutları ile yığın üzerinde veri işlemleri yapılır. BP (Base Pointer) yazmacı, yığıt
içindeki belirli verilere erişmek için kullanılır. CALL ve INT gibi komutlar, yığıtı özel değerleri
saklamak için kullanır ve bu değerler, program akışını yönlendirmek için önemlidir.
- Önemli Noktalar:
- **Yığıt Kesimi:** Son giren ilk çıkar prensibine göre çalışır.
- **SS ve SP Yazmaçları:** Yığıt kesiminin başlangıcını ve en üstteki veri konumunu belirtir.
- **PUSH ve POP Komutları:** Yığıta veri ekleme veya yığıttan veri çekme işlemleri.
- **BP Yazmacı:** Yığıt içindeki belirli bir veriye doğrudan erişim sağlar.
- **CALL ve INT Komutları:** Programın akışını değiştiren komutlar, yığıt üzerinde özel
değerler saklar.

3.3.3. Veri (Data) Kesimi


Veri kesimi, programın üzerinde işlem yapacağı giriş ve çıkış değerlerinin saklandığı bellek alanıdır.
Programcı, bu kesimde veri tiplerine (byte, word vb.) göre gerekli tanımlamaları yapar. Veri kesiminin
başlangıç adresi DS yazmacıyla, iç adreslemesi ise SI, DI ve BX yazmaçları kullanılarak
gerçekleştirilir.

Önemli Noktalar:
- **Veri Kesimi:** Programın işleyeceği giriş ve çıkış değerlerinin bulunduğu bellek bölümü.
- **Tanımlamalar:** Veri tipine bağlı olarak programcı tarafından yapılır.
- **Başlangıç Adresi:** DS yazmacı ile belirlenir.
- **İç Adresleme:** SI, DI, ve BX yazmaçları kullanılarak yapılır.

3.3.4. Ek (Extra) Kesim


Ek kesim, veri kesiminin (DS) kapasitesinin yetersiz kaldığı veya iki farklı veri kesimine eş zamanlı
erişim gerektiğinde kullanılır. Özellikle yükleme ve dizgi hareketleri gibi komutlar sırasında önem
kazanır. Ek kesimin başlangıç adresi ES yazmacı ile, iç adresleme ise DI, SI ve BX yazmaçları
kullanılarak yapılır.
Önemli Noktalar:
- **Ek Kesim Kullanımı:** DS'nin yetersiz kaldığı veya çift veri kesimine erişim gerektiğinde
devreye girer.
- **Kullanım Alanları:** Yükleme ve dizgi hareketleri gibi işlemler için kullanılır.
- **Başlangıç Adresi:** ES yazmacı ile belirlenir.
- **İç Adresleme:** DI, SI, ve BX yazmaçları ile gerçekleştirilir.

3.4. Yazmaçlar (Registers)


Yazmaçlar, işlemcide veri saklama ve işleme için tasarlanmış hızlı devrelerdir. Farklı türdeki
özelliklere sahip olan yazmaçlar, byte, word, double word veya quad word olarak işlemin
gereksinimine göre kullanılabilir. Bellek hiyerarşisinin en üstünde yer aldıkları için en hızlı bellek
birimleridir ve görevlerine göre veri, işaret, sıra, kesim ve bayrak yazmaçları olarak sınıflandırılırlar.
Önemli Noktalar:
- **Hızlı Veri Saklama ve İşleme:** Yazmaçlar, işlemci içinde hızlı veri işleme ve saklama
sağlar.
- **Çeşitli Kullanım:** Byte, word, double word veya quad word formunda kullanılabilir.
- **Bellek Hiyerarşisi:** Yazmaçlar, bellek hiyerarşisinde en üstte yer alır ve en hızlı erişime
sahiptir.
- **Sınıflandırma:** Veri, işaret, sıra, kesim ve bayrak yazmaçları olmak üzere görevlerine
göre sınıflandırılırlar.
3.4.1. Veri Grubu Yazmaçları
Veri grubu yazmaçları byte (8bit) veya word (2 byte – 16 bit) olarak kullanılabilirler. Yazmaçların
hangi şekilde kullanılacağı gereksinimlere bağlı olarak değişir. 80386/486 işlemciler 32 bit olup
double word yazmaçlara sahiptir. Bu yazmaçlar duruma göre 32, 16 veya 8 bit olarak kullanılır. 8 bit
işlemlerde AL, AH, BL, BH, CL, CH, DL ve DH olarak, 16 bit işlemlerde AX,
BX, CX, DX olarak, 32 bit işlemlerde EAX, EBX, ECX, EDX olarak isimlendirilirler. Ayrıca
80386/486 işlemcilerde farklı amaçlar için kullanılan yazmaçlarda bulunur.
3.4.1.1. AX: Accumulator
Giriş/çıkış (I/O) işlemlerinde, aritmetik ve dizgi (string) işlemlerinde kullanılır. 16 bit tek parça AX
olarak kullanılabildiği gibi 8 bit iki parça AL ve AH olarak da kullanılabilir. Bazı komutlarda AX
(AH15 ve AL16) olarak gizli işlenen (operand) durumundadır. İşlenen olarak yazmaçları kullanan bazı
komutlar, işlenen olarak AX yazmacının kullanılması durumunda daha az yer kaplayacak ve daha hızlı
çalışacak şekilde iyileştirilmiştir. Gerek çok çeşitli işlemlerde işlenen olması gerek ise kullanıldığı
işlemlerin daha iyi sonuç vermesi nedeniyle AX yazmacı en çok kullanılan yazmaçtır.

3.4.1.2. BX: Base Register


Genel amaçlı hesaplamalarda ve dizi şeklindeki veri yapılarına erişmek için indis olarak da
kullanılmaktadır. BX olarak 16 bit tek parça, BH ve BL olarak 8 bit iki parça kullanılabilir.
3.4.1.3. CX: Count Register
Çevrim sayılarını belirtmek üzere kullanılır. Kaydırma (shift) ve döndürme (rotating) işlemlerinde
tekrar sayısını belirtir. CX olarak 16 bit tek parça, CH ve CL olarak 8 bit iki parça olarak kullanılabilir.

3.4.1.4. DX: Data Register


Giriş/çıkış işlemlerinde, çarpma gibi büyük sayıların oluşabileceği (AX ile birlikte, AX:DX ikilisi
olarak) bölme gibi bölüm ve kalan şeklindeki iki ayrı onucun oluştuğu işlemlerde (AX bölüm ve DX
kalan değerini saklayacak şekilde) kullanılır. DX olarak 16 bit tek parça, DH ve DL olarak 8 bit iki
parça olarak kullanılabilir.

3.4.2. İşaret Grubu Yazmaçları


Tanımlı oldukları kesim içindeki göreli konum değerlerini göstermek amacıyla kullanılırlar. Genellikle
kullanılan komutların sonunda otomatik olarak değer değiştirirler. Bu nedenle işaret grubuna dahil
olan yazmaçların (BP hariç) değerlerinin kullanıcı tarafından değiştirilmesi alışıldık bir durum
değildir. IP yazmacının değerinde değişiklik olması doğrudan çalıştırılacak komutu, SP yazmacının
değerindeki değişiklik ise yığıt üzerinde yapılacak olan işlemi etkileyeceği için kullanıcı tarafından
bilinçsizce değiştirilmesi beklenmeyen durumların oluşmasına, programın kontrolden çıkmasına veya
sistemin kilitlenmesine neden olabilir.

3.4.2.1. SP: Stack Pointer


SP yazmacı yığıt üzerinde yapılan işlemlerde, verinin nereye yerleştirileceğini veya nereden
alınacağını belirtir. Yığıta erişim PUSH (verinin yığıta yerleştirilmesi) ve POP (verinin yığıttan
alınması) komutları yardımı ile yapılmakta ve bu komutların sonucunda SP yazmacının değeri sırayla
azaltılmakta ve arttırılmaktadır. 8086 işlemcisinde word büyüklüğünde veri ile işlem yapıldığında SP
değeri iki artar veya azalır.

3.4.2.2. BP: Base Pointer


Yığıttan istenilen verilere erişimin kolaylaştırılması için kullanılmaktadır. SP yazmacı gibi yığıt
üzerinde kullanılmaktadır. Değeri ise kullanıcı tarafından belirlenebilmektedir. Böylelikle kullanıcı
yığıttaki istediği veriye BP kullanarak erişebilir. Bu özelliği nedeni ile farklı programlar arasında
yığıttaki verilen kullanılması ile yapılan parametre değişimleri kolaylıkla gerçekleştirilebilir.
3.4.2.3. IP: Instruction Pointer
IP yazmacı işlemcinin o anda çalıştıracağı komutun kod kesimindeki yerini belirtmek için kullanılır. IP
yazmacının değeri işletilen komutun uzunluğuna bağlı olarak değişir. Ayrıca programın içerisindeki
farklı noktalara ulaşmak için kullanılan koşullu ve koşulsuz dallanma (JXX/JMP), alt program
çağırma (CALL) ve kesme (INT) gibi komutlara bağlı olarak da IP yazmacının değeri değişebilir.
3.4.3. Sıra Grubu Yazmaçları
İşaret grubu yazmaçlarından SP ve BP yazmaçları yığıt kesimi, IP yazmacı ise kod kesimi içerisinde
kullanılmaktadır. Benzer şekilde sıra grubu yazmaçları da veri kesimi içerisinde18 kullanılır. İşaret
grubu yazmaçlarından farklı olarak değerleri kullanıcı tarafından belirlenir.
3.4.3.1. SI: Source Index
SI yazmacı, veri kesiminde tanımlanmış veriye ulaşmak için göreli konum değeri olarak kullanılır.
Dizgi işlemlerinde ise kaynak noktasının göreli konumunu belirtir.
3.4.3.2. DI: Destination Index
DI, SI yazmacına benzer olarak veri kesiminde tanımlanmış veriye ulaşmak için kullanılabilir. Eğer
varsa ek kesim içerisindeki veriye de erişmek için kullanılmaktadır. Dizgi işlemlerinde ek kesim
içindeki varış noktasının göreli konumunu göstermekten sorumludur.
3.4.4. Kesim Grubu Yazmaçları
Kesim grubu yazmaçları, bellekteki tanımlı kesimlerin başlangıç adreslerini belirlemek için kullanılan
16 bit'lik yazmaçlardır. Bir verinin bellekteki yeri, kesim ve göreli konum değerleriyle tanımlanır,
burada göreli konum, kesim başlangıcına göre verinin yerini belirten değerdir. 8086/8088 işlemcilerde
bu yazmaçlar (IP, SP, BP, SI, DI) 16 bit olduğundan maksimum kesim büyüklüğü 64 KB'dir. 80386
gibi işlemcilerde ise 32 bit'lik yazmaçlarla 4 GB'a kadar kesim büyüklüğüne ulaşılabilir; ancak bu
büyüklükler korumalı kipte kullanılır. Hem 8086/8088 hem de 80386 ve üstü modellerde kesim
organizasyonu benzerdir.

Kesim Göreli Konum Önemli Noktalar:

Komut adresleme CS IP -
**Kesim Grubu Yazmaçları:** Bellek
Yığıt adresleme SS SP, BP kesimlerinin başlangıç adreslerini belirler.
Veri adresleme DS SI, DI, BX - **Göreli Konum Değeri:** Kesim
Veri adresleme ES DI, SI, BX içindeki verinin yerini gösterir.
- **Kesim Büyüklüğü:** 8086/8088
işlemcilerde 64 KB, 80386 ve üstü işlemcilerde 4 GB'a kadar çıkabilir.
- **Kesim Organizasyonu:** 8086/8088 ve 80386 üstü modellerde benzer, ancak büyük
kesimler korumalı kipte kullanılır.
3.5. Bayraklar
İşlemciler, PSW (Programme Status Word) adı verilen özel bir yazmaç kullanarak işlem sonuçlarını
bayraklar aracılığıyla takip eder. Bu bayraklar, işlemcide gerçekleştirilen işlemlerin sonuçlarını bir bit
büyüklüğünde değerlerle ifade eder. 8086 işlemcisi, bu tip durumları belirtmek için 9 adet bayrağa
sahiptir ve bu bayraklar 0 veya 1 değerlerini alabilir.
Önemli Noktalar:
- **PSW (Programme Status Word)**: İşlemlerin sonucunu belirten özel değerleri tutan
yazmaç.
- **Bayraklar**: İşlem sonuçlarını ifade eden, 0 veya 1 değerini alan bir bit büyüklüğünde
değerler.
- **Bayrakların Sayısı**: 8086 işlemcide toplam 9 adet bayrak bulunmaktadır.
- **Değerlerin Anlamı**: 1 değeri bayrağın set edildiğini (birleme), 0 değeri ise clear (silme)
veya reset (sıfırlama) edildiğini gösterir.
3.5.1. CF: Carry Flag
8'li ve 16'lı işlemlerde oluşan elde/ödünç durumunu kullanıcıya belirtmek için CF bayrağının değeri 1
yapılır.
3.5.2. PF: Parity Flag
İşlem sonucunda çift eşlik (even parity) var ise (yani 1'lerin sayısı çift ise) durumu kullanıcıya
belirtmek için PF bayrağının değeri 1 yapılır. Eğer bit dizilişindeki 1'lerin sayısı tek ise (odd parity) PF
bayrağının değeri 0 yapılır.
3.5.3. AF: Auxilary Flag
8'li işlemlerde düşük anlamalı 4'lüden (nibble) yüksek anlamlı 4'lüye elde/ödünç, 16'lı işlemlerde
düşük anlamlı 8'liden yüksek anlamlı 8'liye elde/ödünç aktarımı durumun kullanıcıya belirtmek için
AF bayrağının değeri 1 yapılır.
3.5.4. ZF: Zero Flag
İşlem sonucunun sıfır çıkması durumunu (eşitlik olmasını) kullanıcıya belirtmek içi ZF bayrağının
değeri 1 yapılır.
3.5.5. SF: Sign Flag
İşlem sonucunda sayının negatif olduğunu (en anlamlı bit 1 ise) kullanıcıya belirtmek için SF bayrağın
değeri 1 yapılır.
3.5.6. TF: Trap Flag
Adım bayrağı olarak adlandırılır. TF bayrağının değeri 1 alması durumunda komut yürütüldükten
sonra bir kesme üretilir. Durumun kullanıcı tarafından izlenmesine olanak verir. (single step mode)
3.5.7. IF: Interrupt Flag
IF, maskelenebilir kesme (maskable interrupt) isteklerinin izinli olup olmadığını belirlemek için
kullanılır. IF bayrağının değerinin sıfır olması durumunda INT komutu kullanılarak üretilen her türlü
maskelenebilir kesme devre dışı kalır.
3.5.8. DF: Direction Flag
Dizgi işlemlerinde işlemin yüksek adresli bellekten başlayarak düşük adresli belleğe doğru
yürütülebilmesi için DF bayrağının değeri 1 yapılır. Aksi halde işlem düşük bellek adreslerinden
başlayarak yüksek bellek adreslerine doğru gerçekleştirilecektir.
3.5.9. OF: Overflow Flag
Aritmetik taşma olması durumunu kullanıcıya belirtmek için OF bayrağının değeri 1 yapılır. Aritmetik
taşma işaretli sayılar ile yapılan işlemlerde elde edilen işaretli sonucun tanımlı alana sığmaması
(taşması) durumunu belirtmektedir.
3.6. 16/32 Bitlik İşlemciler Arasındaki Farklılıklar
16 ve 32 bit işlemciler arasındaki farklar, çalışma kipleri ve işlemci mimarilerindeki detaylara
dayanmaktadır. 32 bit işlemciler, gerçek ve korumalı olmak üzere iki farklı çalışma kipi sunar ve
özellikle korumalı kipte, genişletilmiş yazmaç setleriyle birlikte daha kapsamlı bir işlevsellik sağlar.
16 bit işlemciler ise sınırlı yazmaç setiyle daha basit işlemler için tasarlanmıştır.
Önemli Noktalar:
- **Çalışma Kipleri**: 16 bitlik işlemciler yalnızca temel işlemleri desteklerken, 32 bitlik
işlemciler gerçek ve korumalı olmak üzere iki farklı kipi destekler.
- **Yazmaçlar**: 32 bit işlemciler, gerçek kipte 16 bitlik yazmaçlar kullanırken, korumalı kipte
ek yazmaçlar ve bayraklar (EAX, EBX, vs.) ile daha gelişmiş işlemler gerçekleştirilebilir.
- **Genişletilmiş Yazmaç Seti**: 32 bitlik korumalı kipte, yazmaçların isimlerinin başına "E"
harfi eklenmiş genişletilmiş yazmaç seti kullanılır.
- **Kod Uyumluluğu**: Hem 8 hem de 16 bitlik işlemler, önceki işlemcilerle tamamen kod
uyumlu olarak çalışır.
- **Kesim Yazmaçları**: GS ve FS yazmaçlarının eklenmesiyle kesim yazmaç sayısı altıya
çıkar.
- **Bayraklar**: 16 bitlik işlemcilerdeki bayraklara, korumalı kipte çalışma sırasında ihtiyaç
duyulan ek bayraklar (AC, VM, RF, vs.) eklenmiştir.
3.7. 64 Bit İşlemci Yazmaçları
64 bit işlemciler, 16 adet genel amaçlı yazmaç içerir ve bu yazmaçlar 32 bit ve 64 bit işlenenlerle
uyumlu şekilde çalışır. 32 bit işlenenler için EAX, EBX gibi yazmaçlara ek olarak R8D-R15D
şeklinde 8 ek yazmaç, 64 bit işlenenler için ise RAX, RBX gibi yazmaçlar kullanılır. Yazmaç
adlandırmalarında belirli bir hiyerarşi bulunur; R ön eki eklenerek 64 bite, E ön ekiyle 32 bite, hiçbir
ön ek olmadan 16 bite ve sonuna L eklenerek 8 bite erişilir. Yeni eklenen R8-R15 yazmaçları da
benzer şekilde farklı boyutlarda verilere erişim sağlar. Ancak, byte yazmaçlarına erişimde bazı
sınırlamalar mevcuttur ve bu sınırlamalar REX ön ekiyle aşılmaktadır.
Önemli Noktalar:
- **Genel Amaçlı Yazmaçlar:** 16 adet, 32 ve 64 bit işlenenlerle uyumlu.
- **Ek Yazmaçlar:** R8D-R15D, 32 bit işlenenler için eklenmiştir.
- **Yazmaç Hiyerarşisi:** R, E ön ekleri ve H, L son ekleriyle farklı bit boyutlarına erişim.
- **Byte Yazmaçlarına Erişim Sınırlaması:** AH, BH gibi yazmaçlar ile yeni byte yazmaçları
aynı anda kullanılamaz, REX ön eki bu sınırlamayı aşar.

3.8. Belleğe Erişim


İşlemcilerin belleğe erişim yetenekleri adres bacaklarının sayısına bağlıdır; örneğin, 8086 işlemcisi 1
MB belleği adresleyebilir. İşlemciler veriye çift adreslerden erişirken, daha küçük bit işlemciler
(örneğin, 8088) ve 32 bit işlemcilerde veriye erişim yapısı farklılık gösterir. 32 bit işlemciler,
adreslerin düzenine göre tek veya birden fazla erişimle veri alabilir. Ayrıca, derleyiciler ve EFLAG ile
CR0 yazmaçları, belleğe erişimi optimize eder. İşletim sisteminin çalışma kipine göre de belleğe
erişim şekli değişir; korumalı kipte yetkisiz erişimler engellenirken, gerçek kipte her türlü bellek
erişimi mümkündür, bu da sistemin güvenliğini azaltabilir.
- Önemli Noktalar:
- **Adres Bacakları ve Bellek Erişimi:** İşlemcilerin bellek adresleme kapasitesi adres
bacaklarının sayısına bağlıdır.
- **Veriye Erişim Yapısı:** İşlemcilerin bit yapısına göre veriye erişimde farklılıklar gösterir.
- **Optimizasyon Araçları:** Derleyiciler ve belirli yazmaçlar, belleğe erişim sürecini optimize
eder.
- **Çalışma Kipleri ve Bellek Erişimi:** Korumalı kip, yetkisiz erişimlere karşı koruma
sağlarken, gerçek kip sınırsız erişime izin verir.

Gerçek Kip 16 Bit Korumalı Kip 32 bit korumalı kip


Kesim Büyüklüğü 16 bit, 64 KB (sabit) 16 bit, 1 – 64 KB 20 bit, 1 KB – 1 MB veya 4
KB – 4 GB
Kesim Taban Adresi 20 bit (1 MB) 24 bit (16 MB) descriptor 32 bit (4 GB) descriptor
16; kesim yazmacı tablosundan tablosunda
Kesim Koruması Yok Var Var
Kesim Yazmacı Kesim taban adresi/16 Selectors Selectors
3.8.1. Gerçek Kipte Fiziksel Adres Hesabı
Gerçek kipte, 80x86 işlemci ailesi belleği 64 KB'lık kesimlere bölerek yönetir. Bu kesimler, kesim
yazmaçları ve kesim içi işaretçiler aracılığıyla adreslenir. Kesim yazmacı ve işaret yazmacı
değerlerinin birleştirilmesiyle 20 bit'lik fiziksel adres oluşturulur, bu da bellekteki verinin yerini
belirler. Örneğin, CS:IP ikilisiyle belirlenen fiziksel adres, kesim yazmacı değerinin 16 ile çarpılması
(veya 4 bit sola kaydırılması) ve işaret yazmacı değeriyle toplanması sonucu hesaplanır. Farklı kesim
ve işaret yazmacı değerleriyle aynı fiziksel adrese erişim mümkündür.
Önemli Noktalar:
- **64 KB'lık Kesimler:** Belleğin, kesim yazmaçları aracılığıyla 64 KB'lık parçalara
bölünmesi.
- **20 Bit'lik Fiziksel Adres:** Kesim yazmacı ve işaret yazmacı değerlerinin kombinasyonu
ile elde edilir.
- **Fiziksel Adres Hesabı:** Kesim yazmacı değerinin 16 ile çarpılması ve işaret yazmacı
değeriyle toplanmasıyla yapılır.
- **Farklı Yollarla Erişim:** Aynı fiziksel adrese, farklı kesim ve işaret yazmacı değerleriyle
erişilebilir.

3.8.2. Korumalı Kipte Fiziksel Adres Hesabı


32 bit işlemcilerde ortaya atılan korumalı kip kavramı ile fiziksel adresleme de bazı değişiklikler
olmuştur. Gerçek kipten farklı olarak korumalı kipte kesimler bellekte sabit yerde bulunmak
durumunda olmadığı gibi bellekte dahi olmayabilir. Korumalı kip kendi içerisinde 16 bit'lik ve 32
bit'lik olmak üzere iki ayrı şekilde incelenir.
3.8.2.1. 16 bit Korumalı Kip
Korumalı kip ile birlikte sanal bellek (virtual memory) olarak adlandırılan bir teknik kullanılmaktadır.
Bu teknik uyarınca programın kullanmakta olduğu kod ve veri bellekte tutulmalı, diğer kod ve veri
blokları kendilerine gereksinim duyulana kadar geçici olarak disk üzerinde bulundurulmalıdır.
Böylelikle kesimler kendilerine gereksinim duyulduğunda kadar disk üzerinden belleğe alınmakta ve
kendisine gereksinim kalmadığında belleğin başka işlemlerde kullanılabilmesi için tekrar disk birimine
geri götürülmektedir.26 Korumalı kipte her kesim, Descriptor Table adı verilen alanda bulunan bir
kayıta referans verecek şekilde değer almaktadır. Bu kayıt sisteminin o kesim hakkında sahip olması
gereken:
• Bellekte bulunup bulunmadığı,
• Bellekte bulunuyor ise adresinin ne olduğu ve erişim için bazı haklara ilişkin bilgileri
içermektedir. Burada fiziksel adres, Desriptor Table'da kesim yazmacının sahip olduğu değer ile
belirlenen 32 bit büyüklüğündeki sayı ile göreli konum değerinin toplanması ile elde edilmektedir.
3.8.2.2. 32 bit Korumalı Kip
Gerçek ve 16 bit korumalı kipten farklı olarak göreli konum değerleri 32 bit'lik yazmaçlar ile ifade
edildiğinden ötürü kesim büyüklükleri 4 GB olabilmektedir. Ayrıca kesimler 4 KB büyüklüğünde
sayfa adı verilen daha küçük parçalara ayrılabilmektedir., bu sayede sanal bellek tekniği kesimler
yerine sayfaları bellek ile disk arasında aktarmaktadır. Bu diğer bir deyişle bir anda bir kesimin sadece
bazı parçalarının bellekte olabileceği anlamına gelmektedir.
Örnek: Korumalı kipte 1000H:1F00H kesim ve göreli konum ikilisinin belirlediği byte'ın fiziksel
adresi nedir?
Çözüm: Örneğimizde kesimi belirleyen adres GDT adı verilen alan içerisindeki 32 bit'lik değere
ulaşmak için bir işaretçi olarak kullanılmaktadır. Kesim değeri ile erişilen 32 bitlik değerin göreli
konum değeri ile toplanması sonucunda korumalı kipte fiziksel adres değeri elde edilmektedir
31 0

1004H 22220000H
1000H 33330000H
0FFCH 44440000H

GDT

33330000H+ 1F00H=33331F0H

3.8.2.3. Sanal (Virtual) 8086 Kip


Sanal 8086 kipi, gerçek kip programlarının korumalı kip kontrolü altında çalıştırılması durumunu
ifade eder. Genel olarak DOS için yazılmış gerçek kip programlarının Microsoft Windows, OS/2,
DOSEMU kullanılan Linux/UNIX işletim sistemlerinde çalıştırılması durumunda kullanılır.
3.9. Çalışma Kipleri Arasındaki Farklar
Gerçek Kip Korumalı Kip
1. 16 bit'lik kesim yazmaçları sayesinde belleğe 64 KB 1. Bellek koruması vardır. İzinsiz olarak işlemlerin
büyüklüğünde bloklar halinde erişime izin verir. birbirlerinin bellek alanlarına girmesini engeller. Ve çoklu
Adreslenebilen toplam hafıza 1 MB ile sınırlıdır. görev yapısında çalışır.
2. Aynı bilgisayar üzerinde bir program bir diğerinin 2. Donanım olarak, programların çalışma sıralarını
kullandığı bellek alanına erişebilir ve bu alan üzerinde değiştirme ve birini durdurup diğerini çalıştırma özelliğine
değişiklik yaparak onun çalışmasını engelleyebilir. sahiptir.
Bu nedenle çoklu görev (multitasking) desteklenmez. (preemptive multitasking)
3. Yazılım ile BIOS kodlarına veya donanıma doğrudan 3. Korumalı kipte çalışan işlemci yazmaçları 32 bit olarak
erişmek olanaklıdır. kullanılır. Gerçek kipteki yazmaçlara korumalı kipte yeni
yazmaçlar eklenir.
4. Günümüz işletim sistemleri işlemciyi açılış sırasında
korumalı kipe geçirip çalıştırırlar.

3.10. İşlemcinin Komutları Adım Adım Çalıştırması


80x86 aile işlemcileri komutları tek bir saat darbesinde (clock cycle) işleyemezler. Komutun işlenmesi
için izlenen ara adımalar şu şekilde özetlenebilir:
1. Komutu belirleyen byte'ın bellek üzerindeki kod alanından alınması (instruction fetch)
2. IP yazmacının bir sonraki byte'ı gösterecek şekilde değiştirilmesi
3. Alınan komutun ne komutu olduğunun ve ne tür parametreler ile çalışacağının belirlenmesi
(instruction decode)
4. Gerekli olması durumunda kullanılacak olan parametrelerin bellek alanından alınması
(operand fetch)
5. IP yazmacının alınan parametre sayısı ve tiplerine bağlı olarak gerekiyor ise bir sonraki
komutu gösterecek şekilde değiştirilmesi
6. Parametreler kullanılarak işlemin gerçekleştirilmesi (execute)
7. Elde edilen sonucun gerekli yere yerleştirilmesi (store)
80x86 ailesinin eski ve yeni işlemcileri hemen hemen aynı olan komut kümesini, adresleme tekniğini
ve aynı işlem sırasını kullanmalarına rağmen yeni kuşak işlemciler daha yüksek hızlarda
çalışmaktadır. Bu performans artışının ardında komutların önceden alınarak bir kuyruğa yerleştirilmesi
(pre-fetch queue), ön bellek kullanımı ve ardışık düzende (pipeline) çalışma yatmaktadır.8086
işlemcisi bu özelliklerinden hiçbirinden yararlanmaz iken 32/64 bit işlemcilerde bu özelliklerin hepsi
hatta fazlası bulunmaktadır.

4. Geliştirme Araçları ve İlk Program “merhaba.asm”


İlk assembly programını yazmadan önce Assembly dilinin yapısı ve komutları hakkında bilgi verelim.
80x86 işlemci ailesi, karmaşık komut kümeli bilgisayar mimarisine (CISC) uygun olarak
tasarlanmıştır. Her bir komut birbirinden farklı büyüklüklerde bellek tüketir. Assembly dilinde komut
satırı genel olarak aşağıdaki gibi yazılır:
{Etiket:} Mnemonic {işlenen1}, {işlenen2} {;Yorum bölümü}
Assembly dili programlamasında, her satırda etiket kullanımı zorunlu değildir ama kullanılıyorsa
yanında ":" kullanılmalıdır. Anımsatıcılar işlemi belirten sembolik kodlardır ve birden fazla işlenen
kullanılıyorsa aralarında "," olmalıdır. İşlenenlerden ilki hedef, ikincisi kaynak olarak adlandırılır.
Yorumlar “;” ile başlar. Assembly derleyicisi, sembolik komutları işleyerek makine koduna çevirir.
İşlemcinin mimarisine bağlı olarak, anımsatıcıların işleyeceği işlenen sayısı değişebilir ve işlemler
sağdan sola doğru yapılır. Yorum satırları, programın anlaşılmasını kolaylaştırır ve derleyiciler
tarafından işlenmez. NASM ve GDB gibi araçlar grafik arayüze sahip değildir, komut satırından
çalışır. Program yazmak için "geany" gibi renklendirme özelliği olan editörler kullanılabilir.
İşlenen1←işlenen1 / işlem / işlenen2

Önemli Noktalar:
- **Etiket ve Anımsatıcı Kullanımı:** Etiketler ":" ile, işlemler "," ile ayrılır.
- **İşlenenler:** İlk işlenen hedef, ikinci işlenen kaynaktır.
- **Yorumlar:** “;” ile başlar, derleyiciler tarafından işlenmez.
- **Derleyici İşlevi:** Sembolik komutları makine koduna çevirir.
- **Anımsatıcıların İşleyeceği İşlenen Sayısı:** İşlemcinin mimarisine bağlı olarak değişir.
- **Geliştirme Araçları:** NASM ve GDB, komut satırı üzerinden çalışır.
- **Metin Editörleri:** "geany" gibi renklendirme özelliği olan editörler tercih edilebilir.

Makefile'ı anlamak için dosyanın sondan başa doğru okunması gerekir çünkü makefile, üretilecek
programın bağımlılıklarını ters ağaç yapısı şeklinde sıralar. Örneğin, "merhaba" çalıştırılabilir
dosyasını oluşturmak için öncelikle "merhaba.o" nesne dosyasına ihtiyaç duyulur ve bu nesne dosyası
"merhaba.asm" kaynak dosyasından derlenir. Derleme ve bağlama işlemi için gerekli komutlar ve
seçenekler her dosya için belirtilmiştir. Assembly dilinde yazılan programın derlenmesi için NASM
derleyicisi kullanılmakta ve NASM'e çeşitli seçenekler ile parametreler tanımlanarak
çalıştırılmaktadır.
NASM derleyicisi, "-f" seçeneğiyle elf64 dosya formatında derleme yapar; "-g" ve "-F dwarf"
seçenekleri hata ayıklama bilgilerinin nesne dosyasına eklenmesini sağlar. Bu terimler, J.J.R.
Tolkien'in eserlerindeki "Elf" ve "Dwarf" karakterlerinden esinlenmiştir. Ayrıca, "-l" seçeneğiyle
derleme işleminden sonra oluşan nesne dosyasının detaylarını gösteren bir liste dosyası (.lst)
oluşturulur. Assembly kodunun nesne koduna dönüştürülmesi sonrası, bağlayıcı ve derleme işlemleri
gcc ile tamamlanır.
GCC derleyicisi, Assembly diliyle yazılan programların C standart kütüphane fonksiyonlarına
erişimini sağlar, böylece assembly kodunda hazır kütüphaneler kullanılarak program kodu küçültülür.
"-o" seçeneği, oluşturulacak programın adını belirtirken, "-no-pie" seçeneği, Position Independent
Executable formatında oluşturulmayacağı anlamına gelir. "#", yorum satırlarını belirten bir işarettir.
Programın inşası için "make" komutu kullanılır ve işlem tamamlandığında gerekli dosyalar
oluşturulmuş olur. Program, "./merhaba" komutu ile çalıştırılabilir.

4.1. NASM ve Assembly Dili ile Yazılan Bir Programın Yapısı


Bazı Assembler programları Assembly dili ile yazılacak olan programların yapısını önceden
belirlenmiş bir şablona göre yazılmasını gerektirmektedir. NASM’da bunlardan birisidir. NASM ile
yazılan programlar birçok farklı işletim siteminde kullanılan dosya formatlarında derlenebilmektedir.
Bu nedenle de programın yazılma şekli yapısal olarak belirli bir işletim sistemine özgü olarak değil,
doğrudan NASM ile yazılmasını ve okunmasını kolaylaştıracak şekilde hazırlanmaktadır. Böylelikle
standartlaştırılmış bir yazım formatı ile bir program sadece derleme seçeneklerini değiştirilerek farklı
platformlarda çalıştırılabilir.
Yazılan program içerisinde üç adet ana bölüm bulunmaktadır.
1. section.data 2. section.bss 3. section.text
4.1.1. section.data
Bu bölümde program çalıştırıldığında bellekte hazır bulunması istenen değişkenler tanımlanır. Bu
değişkenler programın çalıştırılması ile bellekte belirtilen tipteki veri için belirlenmiş bir alana sahip
olarak bellekte bulunur. Bu bölümde tanımlanan değişkenler aşağıda belirtilen yapıya göre
tanımlanırlar
değişken_adı veri_tipi verinin_değeri
Değişken adları bir harf ile başlayabilir. Değişken adı içerisinde sayılar, harfler ve özel karakterler
kullanılabilir. Veri tipi bölümü ise değişken için ayrılması gereken bellek alnının büyüklüğünü belirtir.

Tipi Büyüklüğü Adı Yukarıdaki program içerisinde msj adlı değişken byte
db 8 bit Byte büyüklüğündeki bir veri olarak tanımlanmıştır.
dw 16 bit Word
dd 32 bit Double word msj db "merhaba, dunya",0
dg 64 bit Quadword

Aslında değişken bir bir byte büyüklüğündeki bir veriyi belirtmemektedir. Tersine, 13 karakter
uzunluğundaki bir dizgeyi belirtmektedir. Dizgenin okunması için bellekte “m” harfinin bulunduğu ilk
bellek adresinden itibaren “null terminator” yani “0” kadar olan bellek adreslerinin veriyi barındırdığı
belirtilmektedir. Buradaki sıfır ASCII karakter tablosundaki sayısal sıfır değildir.
ASCII tablosunun ilk elemanıdır. Komut satırından “man ascii” yazıldığında ASCII tablosuna
erişebilirsiniz. Yapılan tanımlama ile her seferinde bir byte veri okunacak ve null terminator
gelindiğinde ise okuma işlemi sona erecektir. Bu nedenle dizgeler için ayrı bir veri tipi tanımlanmasına
gerek yoktur.
Bu bölümde aynı zamanda program içerisinde kullanılacak olan ve değeri sabit kalacak olan
değişkenler yani sabitler tanımlanabilir. Örneğin bir aritmetik işlemde Pi sayısının kullanılacağını
düşünelim. Sabit değer olan Pi sayısı program içerisinde “section .data” bölümünde aşağıdaki gibi
tanımlanabilir.
pi equ 3.1416
4.1.2. section.bss
Bu bölümün adındaki bss ise Block Started by Symbol kısaltmasıdır. Bu tanımlamanın geçmişi 1950’li
yıllara dayanmaktadır. IBM 704 sistemi için Assembly dili geliştirildiğinde program içerisinde
tanımlanan ama değer ataması yapılmadığı sürece aktif olarak bellekte yer almayacak olan
değişkenleri tanımlayan kod bloğu olarak tasarlanmıştır. Burada yer alan değişkenler ancak bir değer
atanırsa işletim sisteminden bellek ayrılması istenmekte ve ayrılan bellek alanına değişkene atanmış
olan değeri yazılmaktadır. Bu bölümde tanımlanacak olan bir değişken aşağıdaki gibi yazılmalıdır.
değişken_adı veri_tipi sayı

Tipi Büyüklüğü Adı Buna göre word büyüklüğünde yirmi adet değişken
resb 8 bit Byte alabilecek ve adı “dizi1” olan bir dizi tanımlamak istersek
resw 16 bit Word aşağıdaki gibi belirtilmesi gereklidir.
resd 32 bit Double word
resg 64 bit Quadword dizi1 resw 20
4.1.3. section .text
Bu bölüm program kodunun yazıldığı bölümdür. Bölüm içerisindeki tüm komutlar bir asıl bölümden
başlamak durumunda olduğu için aşağıdaki şekilde tanımlanarak başlar.
global main
main:
Assembly diline ait olan kodların başladığı bölüm “main” adlı satırdan sonra başlamaktadır.
Bölümün başında belirtildiği gibi aslında bu bir etikettir. Burada etiketin sonunda “:” kullanılmasını
bir alışkanlık haline getirmeniz yararınızadır. Etiket tanımlayıp ardından”:” koyulmaz ise Assembler
programı burada işlemi kesecek ve hata mesajı döndürecektir.
Şimdi merhaba.asm programını satır-satır inceleyelim. Bu programda Assembly dilinin bellek
komutlarından “mov” kullanılmaktadır. Bu komut bir bellek alnında bir yazmaca veya bir yazmaçtan
bir bellek alanına veya ki yazmaç arasında veri aktarımı yapılması için kullanılır.
1. mov rax, 1 ile akümülatöre “1” ataması yapıldığında yazma sistem çağrısı aktif kılınmaktadır.
2. mov rdi, 1 ile “destinatoin index” atanan “1” sistem çağrısı ile standart çıktıya yazdırma işlemi
yapılacağı belirtilmiş olmaktadır.
3. mov rsi, msj ile msj adlı değişkenin bellekte bulunduğu adres bilgisi atanmaktadır.
4. mov rdx, 13 ile, mesajın uzunluğu belirtilmektedir. İlk karakterden başlayarak “byte
cinsinden” okunması gereken dizgenin karakter cinsinden büyüklüğü belirtilmektedir. Null
terminatör okunmasına veya hatta yazdırılmasına gerek olmadığı için büyüklüğünü belirtmek
yeterlidir.
5. syscall ile işletim sisteminin sistem çağrıları kullanılarak msj adlı değişkende barındırılan
dizge ekrana yani komut satırına yazdırılacaktır.
6. mov rax, 60 60 numaralı sistem çağrısı çağrılmaktadır. Bu sistem çağrısı programın
sonlandırılacağını belirtir.
7. mov rdi, 0 “0” çıkış kodu rdi yazmacına yüklenmekte ve ardından da sistem çağrısı ile
program sonlandırılmaktadır.
Böylece program sonlandırıldığında herhangi bir hata kodu veya mesajı döndürülmeden program akışı
sonlandırılmış olacaktır.
Sistem çağrıları, programların işletim sistemi tarafından belirli işlevleri yerine getirmesi için kullanılır
ve her işletim sistemi farklı sistem çağrılarına sahiptir. Programların 32 bit veya 64 bit mimarilere göre
yazılması, kullanılan sistem çağrılarının farklılık göstermesine neden olur. NASM ile oluşturulan bir
dosyanın içeriği, program kodunun nesne dosyasına dönüştürülmüş halini ve bellekteki konumlarını,
kullanılan yazmaçlar ile birlikte detaylandırır. Assembly ve makine dili arasındaki temel farklar,
okunabilirlik ve programlama dilinin nesil ayrımı üzerinedir.
Önemli Noktalar:
- **Sistem Çağrıları**: İşletim sistemi tarafından yerine getirilmesi için özel işlevler.
- **32 Bit ve 64 Bit Farkı**: Programlama mimarisi farklılıkları, sistem çağrılarını etkiler.
- **NASM Dosyası**: Program kodunun nesne dosyasına dönüştürülmüş halinin detayları.
- **Bellekteki Adresler ve Yazmaçlar**: Kodun bellekteki konumu ve kullanılan yazmaçlar.
- **Assembly ve Makine Dili**: Anımsatıcı komutlarla okunabilirlik ve nesil farklılıkları.

[5. Bölüm, 6. Bölüm, 7. Bölüm ve 8.1’e kadar (36-61) PDF’ten okunacak.]


8.1. Dallanma Komutları
Dallanma komutları, program akışını değiştiren komutlardır. IP yazmacının değeri bu komutların
çalıştırılmasını ile değişmektedir. Dallanma komutları koşullu ve koşulsuz olmak üzere iki ayrı gruba
ayrılır.
8.1.1. Koşullu Dallanma Komutları
Koşullu dallanma komutları, program akışını belirli koşullara göre yönlendiren talimatlar dizisidir. Bu
komutlar, özellikle bir karşılaştırma işlemi (CMP) sonrasında, işlem sonuçlarına bağlı olarak farklı
program noktalarına atlama yapmak için kullanılır. Atlama yapılacak mesafe sınırlıdır ve bayrakların
durumuna göre etiketlenmiş noktalara gidilir. Komutlar, işlemlerin sonuçlarını işaretli veya işaretsiz
olarak değerlendirir ve bu değerlendirmeye göre programın yönünü belirler.
Önemli Notlar:
- **CMP Sonrası Kullanım**: Koşullu dallanma, genellikle CMP komutu ile kullanılır ve
programın akışını değiştirir.
- **Sınırlı Atlama Aralığı**: Atlamalar 128 byte geri veya 127 byte ileri olacak şekilde
sınırlıdır.
- **Bayraklara Bağlı Yönlendirme**: Atlama işlemleri, bayrakların durumuna göre belirlenen
etiketlere yapılır.
- **İşaretli ve İşaretsiz Değerlendirmeler**: Komutlar, işaretli veya işaretsiz sayılar üzerinde
yapılan işlemlere göre programın yönünü değiştirir.
- **Sonuçların Farklı İfade Edilmesi**: Örneğin, CMP komutu sonucunda ZF bayrağının
değeri, karşılaştırılan değerlerin eşitliğini veya farklarının sıfıra eşit oluşunu gösterebilir.
- **JE ve JZ Komutları**: Sonuçlara bağlı olarak, AX=BX durumu için JE, (AX-BX) =0
durumu için ise JZ komutunun tercih edilmesi önerilir.
8.1.1.1. Basit Koşullu Dallanma Komutları
Basit koşullu dallanma komutları ZF, SF, OF ve PF bayraklarından birinin durumuna göre dallanma
yapılmasını sağlar.
JZ / JE (jump zero / jump equal)
CMP işleminin sonucunun sıfır (eşitlik) olması durumunda, diğer bir deyişle ZF bayrağının değerinin
1 olması durumunda dallanma gerçekleşir.
JNZ / JNE (jump not zero / jump not equal)
CMP işleminin sonucunun sıfır (eşitlik) olmaması durumunda, diğer bir deyişle ZF bayrağının
değerinin 0 olması durumunda dallanma gerçekleşir.
JS (jump if sign)
CMP işleminin sonucunun negatif olması29 durumunda, diğer bir deyişle SF bayrağının değerinin 1
olması durumunda dallanma gerçekleşir.
JNS (jump no sign)
CMP işleminin sonucunun pozitif olması durumunda, diğer bir deyişle SF bayrağının değerinin 0
olması durumunda dallanma gerçekleşir.
JO (jump if overflow)
CMP işleminin sonucunda aritmetik bir taşma söz konusu ise durumunda, diğer bir deyişle OF
bayrağının değerinin 1 olması durumunda dallanma gerçekleşir.
JNO (jump no overflow)
CMP işleminin sonucunda aritmetik bir taşma olmamış ise, diğer bir deyişle OF bayrağının değerinin
0 olması durumunda dallanma gerçekleşir.
JP / JPE (jump on parity / jump parity even)
CMP işleminin sonucunda çift (even) parity30 oluşmuş ise, diğer bir deyişle PF bayrağının değeri 1
ise dallanma gerçekleşir.
JNP / JPO (jump no parity / jump parity odd)
CMP işleminin sonucunda tek (odd) parity31 oluşmuş ise, diğer bir deyişle PF bayrağının değeri 0 ise
dallanma gerçekleşir.

8.1.1.2. İşaretsiz Sayı İşlemlerine Ait Koşullu Dallanma Komutları


İşaretsiz sayılar karşılaştırılırken bir değerin diğerinin yukarısında (above) veya aşağıda (below)
olmasına bakılır. Basit koşullu dallanma komutları olduğu gibi bir bayrak ile sonuca ulaşanlar olduğu
gibi farklı bayrakların birbirlerine göre durumlarına göre dallanma yapanlarda vardır.
Bu komutlarda bayrakların hangi değerleri aldığını öğrenmek yerine işlemin hangi amaca ulaşmak için
yapıldığını öğrenmek daha doğru olur.
JB / JNAE / JC (jump below / jump not above equal / jump carry (unsigned))
İşaretsiz sayılar ile yapılan CMP işlemlerinde opr1'in opr2'in altında olduğu (üstünde veya eşit
olmadığı/elde olduğu) durumunda, diğer bir deyişle CF bayrağının değeri 1 ise dallanma gerçekleşir.
JA / JNBE (jump below / jump not below equal)
İşaretsiz sayılar ile yapılan CMP işlemlerinde opr1'in opr2'in üstünde olduğu (altında veya eşit
olmadığı/elde olduğu) durumunda, diğer bir deyişle CF bayrağının değeri 0 ve ZF bayrağının değeri 0
ise dallanma gerçekleşir.
JAE / JNB / JNC (jump above equal / jump not below / jump not carry (unsigned))
İşaretsiz sayılar ile yapılan CMP işlemlerinde opr1'in opr2'in üstünde veya eşit olduğu (altında
olmadığı / elde olmadığı) durumunda, diğer bir deyişle CF bayrağının değeri 0 ise dallanma
gerçekleşir.
JBE / JNA (jump below equal / jump not above (unsigned))
İşaretsiz sayılar ile yapılan CMP işlemlerinde opr1'in opr2'in altında veya eşit olduğu (üstünde
olmadığı) durumunda, diğer bir deyişle CF bayrağının değeri 1 veya ZF bayrağının değeri 1 ise
dallanma gerçekleşir.
8.1.1.3. İşaretli Sayı İşlemlerine Ait Koşullu Dallanma Komutları
İşaretli sayılar karşılaştırılırken bir değerin diğerinden büyük (Greater) veya küçük (Less)olmasına
bakılır. Bu komutların işleyişinde bayrakların birbirlerine göre durumlarına göre dallanma yapılır.
JL / JNGE (jump less / jump not greater and equal (signed))
İşaretli sayılar ile yapılan CMP işlemlerinde opr1'in opr2'den küçük olduğu (büyük eşit olmadığı)
durumunda, diğer bir deyişle SF ile OF bayraklarının değerleri farklı ve ZF bayrağının değeri 0 ise
dallanma gerçekleşir.
JNL / JGE (jump not less / jump greater and equal (signed))
İşaretli sayılar ile yapılan CMP işlemlerinde opr1'in opr2'den küçük olmadığı (büyük eşit olduğu)
durumda, diğer bir deyişle SF ile OF bayraklarının değerleri aynı ise dallanma gerçekleşir.
JLE / JNG (jump less equal / jump not greater (signed))
İşaretli sayılar ile yapılan CMP işlemlerinde opr1'in opr2'den küçük eşit olduğu (büyük olmadığı)
durumda, diğer bir deyişle SF ile OF bayraklarının değerleri farklı ve ZF bayrağının değeri 0 ise
dallanma gerçekleşir.
JG / JNLE (jump greater / jump not less equal (signed))
İşaretli sayılar ile yapılan CMP işlemlerinde opr1'in opr2'den büyük olduğu (küçük eşit olmadığı)
durumda, diğer bir deyişle ZF bayrağının değeri 0 ve SF ile OF bayraklarının değerleri aynı ise
dallanma gerçekleşir.
8.1.2. Koşulsuz Dallanma Komutları
Koşullu dallanma komutlarında atlama aralığının 8 bit ile (disp8) sınırlı olduğundan daha önce
söz edilmişti. Bu nedenle koşullu dallanma komutlarının ancak 128 byte geriye ve 127 byte ileriye
ulaşmayı sağlayabildiklerini belirtmiştik. Bu sınırlamadan kurtulmak için koşulsuz dallanma komutları
kullanılabilir. Koşullu dallanma komutları bayrakların değerlerine göre işlem yapmaz, kullanıldıkları
noktadan itibaren program akışını belirlenen noktaya aktarır.
Yüksek seviyeli dillerde kullanılan karşılaştırma işlemleri (If-Then-Else) program akışını iki
ayrı kola bölmektedir. Buna göre programın akışını gerektiği gibi değiştirmek amacıyla koşullu ve
koşulsuz dallanma komutları birbirlerini destekleyecek şekilde kullanılırlar.
JMP (near jump)
Programın gereği olarak bulundukları kesim içinde bir noktaya erişmeleri gerekiyorsa kesim
içi dallanma komutu kullanılır. Buna göre;
JMP disp IP ← IP + dsp
JMP reg IP ← reg
JMP mem IP ← [mem]
şeklindeki kullanımlarda üretilen adres 16 bit değerini aşmadığı için kesim içinde dallanma
söz konusudur. Bu tür dallanmalar kesim içi (intrasegment) olarak değerlendirilir. Diğer bir deyişle
sadece IP yazmacının değeri değişikliğe uğramaktadır.
JMP new_label
new_label isimli etiketin olduğu yere gidecek şekilde IP yazmacının değeri ayarlanacaktır.
JMP ECX
ECX yazmacının gösterdiği adrese dallanma gerçekleşecektir. Ancak kesim
yazmacında bir değişiklik olmadığı için bu dallanma kesim içerisinde kalacaktır.
JMP 0128
Bulunulan kod kesimi içerisinde 0128H adresine atlayacaktır.33
JMP FAR PTR (far jump)
Programın gereği olarak bulundukları kesim dışında bir noktaya erişmeleri gerekiyorsa kesim
dışı dallanma komutu kullanılır. Akış başka bir kesime aktarılır. Buna göre;
JMP FAR PTR etiket
şeklindeki bir kullanım söz konusu ise IP ← OFFSET (label) ve CS ← SEGMENT(label)
değerlerini alacaktır. Bu tür dallanmalar (intersegment) kesimler arası olarak adlandırılır.
JMP FAR PTR new_label
new_label isimli etiketin olduğu kesime dallanma gerçekleşecektir. Ancak bu tür bir
kullanım için etiketi barındıran kodun dallanmayı yapacak kod ile birlikte link edilip tek bir
çalıştırılabilir kod üretilmesi gereklidir.

JMP FAR PTR [0200]

7 0 Bu örnekte verilen 0200H adresinin gösterdiği noktadan önce IP, sonra


0204H 0EEH CS yazmaçları değerlerini alacaktır. Sonuçta IP ← 0BBAAH ve CS ←
0203H 0DDH 0DDCCH değerlerine sahip olur.
0202H 0CCH
0201H 00BBH
0200H 0AAH
Akış diyagramlarında sıkça karşılaşılan If – Then – Else, Null – Else ve Null – Then tipindeki yapılar
koşullu ve koşulsuz dallanma komutlarının bir arada kullanılmasını gerektirmektedir. Bu durumları
aşağıdaki sözde kod ve assembly kodları ile inceleyelim.
If ifadesinin then ve else kollarındaki bağımsız işlemler tamamlandıktan sonra her iki kol ortak bir
noktada birleşmektedir. Sözde kodlamada rahatlıkla yapılan bu işlem assembly dilinde kollardan
birinin sonunda kullanılan koşulsuz dallanma (JMP nextblock) ile yapılır.
Sözde kod: Assembly Kodu:
If AX = 0 Then Do CMP AX, 0
BX = 2 JZ thenblock
Done MOV BX, 1
Else do JMP nextblock
BX = 1 thenblock: MOV BX, 2
Done nextblock: MOV CX, 5
CX = 5
Aşağıdaki sözde kod bloğunda görülen else kolu boştur. (Null – Else) Bu duruma ait olan
assembly kodu aşağıdaki gibi yazılabilir.
Sözde kod: Assembly Kodu:
If AX = 0 Then Do CMP AX, 0
BX = 2 JZ thenblock
Done JMP nextblock
CX = 5 thenblock: MOV BX, 1
nextblock: MOV CX, 5
Yukarıdaki kod bloğu daha az mnemonic kullanılarak her bakımdan daha üstün bir assembly
programı yazılabilir. Koşul ifadesinin tersi olarak JNZ kullanılarak Then kolu içerisinde yer alan işlem
bloğunun üzerinden atlanarak Else kolunda BX = 1 işlemi yapılır ve her iki kol da nextblock isimli
etikette buluşturulur.

Sözde kod: Assembly Kodu:


If AX = 0 Then Do CMP AX, 0
BX = 2 JNZ nextblock
Done MOV BX, 1
CX = 5 nextblock: MOV CX, 5
Bazı programlarda Then kolu boştur. Bu durumda kullanacağımız koşullu dallanma komutu
koşul ifadesi ile özdeş (JZ) olacak ve Else kolunun üzerinden atlanarak nextblock isimli etiketten ortak
işler yürütülecektir.
Sözde kod: Assembly Kodu:
If AX <> 0 Then Do CMP AX, 0
BX = 1 JZ nextblock
Done MOV BX, 1
CX = 5 nextblock: MOV CX, 5

8.2. Döngü Komutları


Döngü komutları, tekrarlanan işlemlerde CX yazmacı kullanılarak işlemin tekrar sayısını azalarak
şekilde belirler. LOOP komutu, CX yazmacının değeri 0 olana kadar işlemi tekrar eder ve her tekrarda
CX yazmacının değeri bir azaltılır. Bu döngüler, özellikle 8086/80286/80386/80486 gibi işlemcilerde
kullanılır ve bayraklar üzerinde değişikliğe neden olmaz. Aşağıda verilen örnekte, 1 ile 5 arasındaki
sayıların toplamı hesaplanırken, toplamın başlangıçta sıfırlanması ve her adımda artırılması işlemleri
Assembly dilinde nasıl gerçekleştirileceği gösterilmiştir.
Önemli Noktalar:
- **CX Yazmacı Kullanımı**: Döngü tekrar sayısını belirler ve değer azalarak ilerler.
- **LOOP Komutu**: CX yazmacı 0 olana kadar döngüyü sürdürür, her tekrarda CX'yi 1 azaltır.
- **İşlemci Uyumluluğu**: 8086, 80286, 80386, ve 80486 işlemcilerde kullanılır.
- **Bayraklar Üzerinde Etkisiz**: LOOP çalışması bayrakları değiştirmez.
- **Pratik Uygulama**: 1'den 5'e kadar sayıların toplamı hesaplama örneği, başlangıçta toplamı
sıfırlama ve adım adım artırma işlemleriyle.

You might also like