Bölüm 1: 8086 Mimarisi

Mikroişlemciler
8086'ya genel bakışSistem yollarıBIU ve EU Önden getirme kuyruğuGetir–çöz–yürütYazmaç kümesi Bayrak yazmacıKesimli bellekFiziksel adres hesabı
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Genel özellikler

8086'nın veri/adres yolu genişliğini, adresleyebildiği bellek miktarını ve x86 ailesindeki yerini açıklamak.

İç yapı

BIU ve EU birimlerinin görevlerini, önden getirme kuyruğunu ve boru hattı fikrini anlatmak.

Yazmaçlar

14 yazmacı gruplarına ayırmak; genel amaçlı, işaretçi/indis, kesim yazmaçlarını ve bayrakları tanımak.

Adres hesabı

kesim × 10h + bağıl konum ile 20 bitlik fiziksel adresi elle ve adım adım hesaplamak.

Genel Bakış

8086'ya Genel Bakış

  • Intel'in 1978'de tanıttığı 16 bitlik mikroişlemci; x86 ailesinin ilk üyesi.
  • Yazmaçları, ALU'su ve veri yolu 16 bittir; aynı anda 16 bitlik veri işler.
  • 20 bitlik adres yolu → 220 = 1 048 576 bayt = 1 MB bellek.
  • 16 bitlik veri yolu: işlemci, bellek ve G/Ç aygıtları arasında tek seferde 2 bayt taşır.
  • CISC (karmaşık komut kümesi) mimarisi: değişken uzunlukta (1–6 bayt) komutlar, bellekte işlem yapabilen komutlar.
  • Kişisel bilgisayarların temelini oluşturan komut kümesi bugün hâlâ geriye dönük uyumlulukla yaşıyor.
16 bitveri yolu
20 bitadres yolu
1 MBbellek
40 pinDIP paket
5–10 MHzsaat
~29 000transistör
+5 Vtek besleme
HMOSteknoloji

Düzeltme: kaynak sunumdaki “8-bit/16-bit işlemci” ifadesi 8088 için geçerlidir (8 bitlik dış veri yolu); 8086 tamamen 16 bittir.

Genel Bakış

x86 Ailesinde 8086

İşlemciYılİç / dış veri yoluAdres yoluBellekNot
8086197816 / 16 bit20 bit1 MB6 baytlık önden getirme kuyruğu
8088197916 / 8 bit20 bit1 MB4 baytlık kuyruk; IBM PC (1981)
80186198216 / 16 bit20 bit1 MBtümleşik çevre birimleri
80286198216 / 16 bit24 bit16 MBkorumalı mod
80386198532 / 32 bit32 bit4 GB32 bit x86 (IA-32)
Sonraki tüm x86 işlemciler açılışta gerçek modda (real mode) 8086 gibi davranır. Bu derste emu8086 ile yazacağımız programlar da 8086 gerçek modunda çalışır.

Genel Bakış

Neden 20 Bit Adres?

16 bit adres2¹⁶ = 65 536 bayt = 64 KB (0000h–FFFFh)20 bit adres2²⁰ = 1 048 576 bayt = 1 MB (00000h–FFFFFh)Ama 8086'nın yazmaçları 16 bit → tek yazmaç en çok 64 KB'yi gösterebilir.Çözüm: iki 16 bitlik değer → kesim (segment) × 16 + bağıl konum (offset) = 20 bit.
n bit adres2n farklı bayt adreslenir. 1 KB = 210, 1 MB = 220 bayt.
Veri yolu ≠ adres yoluVeri yolu 16 bit (bir seferde ne kadar veri), adres yolu 20 bit (ne kadar bellek).
Hex gösterim20 bit = 5 onaltılık hane: en düşük adres 00000h, en yüksek FFFFFh.

Genel Bakış

Bellek Yapısı: İşlemci Tek Başına Değil

Mikroişlemci (8086)
  • CPU'nun tüm işlevlerini tek bir entegre devrede toplar.
  • İçinde RAM veya ROM yoktur; yalnızca yazmaçları vardır.
  • Ara ve nihai sonuçlar yazmaçlarda tutulur.
  • Bellek ve G/Ç'ye sistem yolu (system bus) üzerinden erişir.
  • Çalışmak için dışarıdan bellek, saat üreteci, tampon/kilit devreleri gerekir.
Mikrodenetleyici (ör. 8051, AVR)
  • CPU + program belleği (ROM/Flash) + RAM + zamanlayıcı + G/Ç portları tek yongada.
  • Tek başına bir sistem gibi çalışabilir.
  • Gömülü uygulamalar: çamaşır makinesi, kumanda, sensör düğümü.
  • Daha düşük işlem gücü, düşük maliyet ve güç tüketimi.
8086 tabanlı bir bilgisayar = 8086 + 8284A saat üreteci + adres kilitleri + veri yolu alıcı-vericileri + bellek + G/Ç birimleri. Bu donanımı Bölüm 2'de pinler üzerinden inceleyeceğiz.

Genel Bakış

Sistem Yolları

8086CPUBellekRAM / ROMG/Ç aygıtlarıklavye, ekran, portAdres yolu (20 bit) — tek yönlü: CPU → dışVeri yolu (16 bit) — çift yönlüKontrol yolu — RD', WR', M/IO', INTR, READY …Her yolun “genişliği” = içindeki paralel hat (bit) sayısı
YolNe taşır?8086'da
Adresokunacak/yazılacak bellek konumu veya G/Ç port numarası20 bit → 1 MB bellek; G/Ç için 16 bit → 64 K port
Veriişlemci ile bellek/G/Ç arasındaki komut ve veri baytları16 bit, tek seferde bir kelime (2 bayt)
Kontrolokuma, yazma, kesme istekleri, durum bilgisiRD', WR', M/IO', ALE, INTR, READY …

Düzeltme: kaynakta adres yolu “16 bit, 64 KB” yazıyordu; 8086'nın adres yolu 20 bittir ve 1 MB adresler.

İç Yapı

İki Temel Birim: BIU ve EU

Veri Yolu Arayüz Birimi (BIU · Bus Interface Unit)
  • Dış dünyayla tüm iletişimi yürütür: komutları bellekten getirir (fetch).
  • İşlenenleri bellekten okur, sonuçları belleğe/G/Ç'ye yazar.
  • Kesim yazmaçları + IP ile 20 bitlik fiziksel adresi üretir.
  • 6 baytlık önden getirme kuyruğunu doldurur.
Yürütme Birimi (EU · Execution Unit)
  • Kuyruktan sıradaki komut baytını alır, çözer (decode) ve yürütür.
  • ALU ile aritmetik ve mantıksal işlemleri yapar.
  • Genel amaçlı yazmaçları ve bayrakları günceller.
  • Bellekte bir işlenen gerekiyorsa BIU'dan ister; dış yollara doğrudan bağlı değildir.
İki birim paralel çalışır: EU bir komutu yürütürken BIU sonraki komut baytlarını getirir. Bu, 8086'nın basit boru hattıdır (pipelining).

Düzeltme: kaynakta “BIU komutları getirir ve çözer” deniyordu; çözme (decode) EU'nun işidir.

İç Yapı

8086 Blok Diyagramı

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)
Sol: EUgenel yazmaçlar, ALU, bayraklar, denetim sistemi
Sağ: BIUkesim yazmaçları, IP, adres toplayıcı, kuyruk, yol denetimi
KöprüEU, kuyruktan 8 bitlik Q yoluyla komut baytı alır

İç Yapı

8086 Mimarisinin İşleyişi

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

Genel görünüm. Bir komutun yolculuğunu adım adım izleyelim: ADD AX, BX.

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

1. BIU, getirilecek komutun fiziksel adresini hesaplar: CS × 10h + IP (adres toplayıcı).

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

2. 20 bitlik adres dış adres yoluna konur; yol denetim mantığı bir bellek okuma döngüsü başlatır.

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

3. Gelen komut baytları 6 baytlık FIFO kuyruğa yazılır; IP getirilen bayt sayısı kadar ilerler.

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

4. Sıra komuta gelince EU, Q yolu üzerinden işlem kodunu (opcode) alır; denetim sistemi komutu çözer.

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

5. Denetim sinyalleriyle AX ve BX ALU veri yolundan geçici yazmaçlara, oradan ALU'ya gelir; toplama yapılır.

Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

6. Sonuç AX'e yazılır, bayraklar (CF, ZF, SF, OF, PF, AF) güncellenir. Bu sırada BIU sonraki baytları getirmeyi sürdürür.

İç Yapı

Veri Yolu Arayüz Birimi (BIU)

  • Harici bellek ve G/Ç aygıtlarına sistem yolu üzerinden arayüz sağlar.
  • Kesim yazmacı + bağıl konumdan 20 bitlik fiziksel adres üretir (adres toplayıcı).
  • Bellekten komutları getirir ve kuyruğa yazar.
  • EU'nun istediği işlenenleri bellekten/G/Ç'den okur, sonuçları yazar.
  • 6 baytlık önden getirme kuyruğunu (instruction queue) yönetir → boru hattını mümkün kılar.
BIU'nun içindekiler
  • Kesim yazmaçları: CS, DS, SS, ES
  • Komut işaretçisi: IP
  • Adres toplayıcı (Σ)
  • 6 baytlık komut kuyruğu
  • Yol denetim mantığı

İç Yapı

Önden Getirme Kuyruğu

  • 6 baytlık bir FIFO (ilk giren ilk çıkar) kuyruk: komut baytları getirildiği sırayla tüketilir.
  • EU bir komutu yürütürken BIU sonraki komut baytlarını önceden getirir → boru hattı.
  • Kuyrukta en az 2 bayt boş yer açıldığında BIU sıradaki kelimeyi (2 bayt) getirmeye başlar.
  • Bir dallanma (JMP, CALL, RET, koşullu atlama, kesme) yürütülünce kuyruk temizlenir; önceden getirilen baytlar artık yanlış yoldadır.
  • 8086 komutları 1–6 bayt uzunluğundadır (önekler hariç); kuyruk en uzun komutu tümüyle tutabilir.
KazançEU çoğu zaman beklemeden kuyruktan komut alır; bellek erişim süresi gizlenir.
KayıpDallanmada kuyruk boşaltılır, yeniden dolana kadar EU bekler.
8088 farkı8 bitlik dış yol nedeniyle 4 baytlık kuyruk; 1 bayt boşalınca getirir.

İç Yapı

Boru Hattı (Pipelining)

G = getir (fetch, BIU), Y = çöz + yürüt (EU). Her kutu 2 zaman birimi varsayılmıştır.

zaman →BIUEUG1Y1G2Y2G3Y3Sıralı (boru hattı yok): 3 komut = 12 zaman birimi

Boru hattı olmasaydı: önce getir (G), sonra yürüt (Y); BIU ve EU sırayla boş bekler.

zaman →BIUEUG1G2G3G4G5Y1Y2Y3Y4Y5Boru hattı: 3 komut = 8 birim; sonraki her komut yalnızca +2 birim

8086: EU Y1'i yürütürken BIU G2'yi getirir. İki birim aynı anda çalışır; verim yaklaşık iki katına çıkar.

zaman →BIUEUG1G2G3G4G5Y1Y2Y3G4, G5 çöpeG hedefY3 = JMP → kuyruk temizlenirEU, hedef adresten yeni bayt gelene kadar bekler

Dallanma: Y3 bir JMP ise önceden getirilen G4, G5 geçersizdir. Kuyruk boşaltılır; hedef adresten yeniden getirilir.

İç Yapı

Kuyruk Adım Adım

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış soldaEUEU şu an:— (bekliyor)IP (sonraki komut) = 0100hB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

Başlangıç (veya dallanma sonrası): kuyruk boş, EU bekler. CS:IP = CS:0100h.

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış soldaB8341201D841EUEU şu an:MOV AX,1234h çözülüyorIP (sonraki komut) = 0100hB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

BIU kelime kelime getirir (B8 34, 12 01, D8 41); kuyruk dolar. EU ilk bayt gelir gelmez çözmeye başlar.

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış solda01D841EUEU şu an:MOV AX,1234hIP (sonraki komut) = 0103hB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

EU 3 baytlık MOV AX,1234h'yi kuyruktan çekti. Kuyrukta 3 boş yer var (≥ 2).

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış solda01D841EB05EUEU şu an:MOV AX,1234hIP (sonraki komut) = 0103hB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

EU yürütürken BIU sonraki kelimeyi (EB 05) getirir. Bekleme yok.

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış solda41EB059090EUEU şu an:ADD AX,BXIP (sonraki komut) = 0105hB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

EU 01 D8'i (ADD AX,BX) aldı; BIU 90 90'ı getirdi.

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış soldaEB0590909090EUEU şu an:INC CXIP (sonraki komut) = 0106hB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

EU 41'i (INC CX) aldı; BIU iki NOP baytı daha getirdi, kuyruk dolu.

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış soldaEUEU şu an:JMP SHORT 010DhIP (sonraki komut) = 010DhB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

EU EB 05'i yürütür: IP = 0108h + 5 = 010Dh. Kuyruktaki 90'lar geçersiz → kuyruk temizlenir.

Bellek (CS:adres → bayt)B80100340101120102010103D80104410105EB010605010790010890010990010A90010B90010CB0010DKuyruk (6 bayt, FIFO) — çıkış soldaB0EUEU şu an:— (bekliyor)IP (sonraki komut) = 010DhB8 34 12 = MOV AX,1234h · 01 D8 = ADD AX,BX · 41 = INC CX · EB 05 = JMP SHORT 010Dh · 90 = NOP · B0 … = MOV AL,…

BIU 010Dh'den yeniden getirmeye başlar (tek adres olduğundan önce 1 bayt). EU, bayt gelene kadar bekler.

İç Yapı

Önden Getirme ve Çözümleme İşlevleri

Önden getirme (prefetch) işlevi
  • Komutları bellekten getirip bir tamponda (kuyruk) saklar.
  • Bir program sayacı sonraki getirilecek baytın adresini tutar (8086'da bu iş IP ve BIU içi sayaçla yapılır).
  • EU, komutları bellek yerine tampondan alır → bellek erişim süresi gizlenir.
  • Birim zamanda daha fazla komut yürütülür.
Çözümleme (decode) işlevi
  • Makine kodunu, denetim sinyallerine/mikro işlemlere çevirir.
  • Önden getirme ile paralel çalışır.
  • Koşullu atlama, CALL, RET gibi karmaşık komutları çözer.
  • Yazmaçtan yazmaca, bellekten yazmaca aktarımları yönlendirir.
8086'da bu işlevler ayrı birimler değildir: önden getirme BIU'da, çözme EU'nun denetim sisteminde (mikrokod ROM'u ile) yapılır. Ayrı “prefetch unit” ve “decode unit” 80286 ve sonrasında ortaya çıkar.

İç Yapı

Yürütme Birimi (EU)

EU'nun başlıca bileşenleri:

  • Genel amaçlı yazmaçlar
  • Aritmetik mantık birimi (ALU)
  • Özel amaçlı yazmaçlar (SP, BP, SI, DI)
  • Komut yazmacı ve komut çözücü
  • Bayrak (durum) yazmacı
  • Denetim sistemi
Yürütme Birimi (EU)Veri Yolu Arayüz Birimi (BIU)AHALAXBHBLBXCHCLCXDHDLDXSPBPSIDIGenelyazmaçlarİşaretçi /indisALU veri yolu (16 bit)Geçici yazmaçlarALUBayrak yazmacıEU denetimsistemiAdres toplayıcıΣCSDSSSESIPİç iletişim yazmaçlarıAdres yolu (20 bit)Yoldenetimmantığı16dış yollar ⇅123456Komut kuyruğu (6 bayt)Q yolu (8 bit)

İç Yapı

Aritmetik Mantık Birimi (ALU)

  • 8 ve 16 bitlik aritmetik ve mantık işlemlerini yapar.
  • Aritmetik: toplama, çıkarma, çarpma, bölme, artırma/azaltma, karşılaştırma.
  • Mantık: AND, OR, XOR, NOT, kaydırma ve döndürme.
  • Her işlemden sonra sonuca göre bayrakları günceller.
KomutİşlemBoyut
ADD AX, BXAX ← AX + BX16 bit
SUB AL, 5AL ← AL − 58 bit
MUL BLAX ← AL × BL8 → 16
DIV CXAX ← DX:AX ÷ CX, DX ← kalan32 → 16
AND AL, 0FhAL'nin üst 4 bitini sıfırla8 bit
XOR AX, AXAX ← 0 (ZF = 1)16 bit

İç Yapı

Komut Yazmacı, Çözücü ve Denetim

Komut yazmacı

EU, kuyruktan işletilecek komutu alır; işlem kodu (opcode) çözülürken geçici olarak burada tutulur. Programcı bu yazmaca erişemez.

Komut çözücü

İşlem kodunu çözer: hangi işlem, hangi işlenenler, hangi adresleme modu? Gerekli bilgiyi denetim devresine gönderir.

Denetim birimi

Komut ve verinin işlemci içindeki akışını yönetir; getir–çöz–yürüt döngüsünü sıralar, diğer bileşenleri koordine eder.

Denetim biriminin görevleri: komutları getirmek (BIU ile), çözmek, yürütmek, işlemcinin durumunu (yazmaçlar, bayraklar) güncellemek ve her komut sonunda kesme isteklerini (INTR, NMI) denetlemek. Hata durumları (ör. sıfıra bölme) özel kesmelerle ele alınır.

Düzeltme: kaynaktaki “güç yönetimi” 8086'da yoktur; güç yönetimi özellikleri çok sonraki işlemcilerle (ör. 386SL) gelmiştir. 8086'nın denetim birimi mikrokod tabanlıdır.

İç Yapı

Komut Uzunlukları

8086 komutları değişken uzunluktadır: işlem kodu + (varsa) adresleme baytı + yer değiştirme + anlık veri.

KomutMakine kodu (hex)BaytAçıklama
INC CX411yalnızca işlem kodu
MOV AX, BX8B C32işlem kodu + ModR/M baytı
ADD AL, 7Ch04 7C2AL'ye özel kısa kod + 8 bit anlık
MOV BX, 4050hBB 50 403işlem kodu + 16 bit anlık (küçük uçlu)
MOV WORD PTR [BX+1234h], 5678hC7 87 34 12 78 566ModR/M + 16 bit yer değiştirme + 16 bit anlık
Anlık değerler belleğe küçük uçlu (little-endian) yazılır: 4050h → önce 50, sonra 40.

Düzeltme: kaynakta MOV AX,BX “1 baytlık komut” deniyordu; yazmaçtan yazmaca MOV 2 bayttır (8B C3 ya da eşdeğeri 89 D8).

Yazmaçlar

Yazmaç Kümesi

Genel amaçlı (veri) yazmaçlarıAXAHALbirikeçBXBHBLtabanCXCHCLsayaçDXDHDLveri15 8 7 0İşaretçi ve indisSPyığın işaretçisiBPtaban işaretçisiSIkaynak indisDIhedef indisKesim (segment)CSkodDSveriSSyığınESekÖzelIPkomut işaretçisiFLAGSbayraklar4 + 4 + 4 + 2 = 14 adet 16 bitlik yazmaç
  • Genel amaçlı: veri saklar, aritmetik/mantık işlemlerine katılır; her biri 8 bitlik iki yarıya bölünebilir.
  • Kesim yazmaçları: bellekteki dört etkin kesimin başlangıcını gösterir. Özel: IP sonraki komutu, FLAGS son işlemin sonucunu gösterir.

Yazmaçlar

Dahili Yazmaçlar ve Kelime Boyu

  • 8086, 16 bitlik bir tamsayı (skaler, vektörel olmayan) işlemcidir; kayan noktalı işlemler için ayrı bir yardımcı işlemci (8087) kullanılır.
  • 40 pinli, çift sıralı paket (DIP, dual in-line package) olarak üretilmiştir.
  • Yonga içindeki yazmaçların boyutu, işlemcinin aynı anda üzerinde çalışabileceği veri miktarını (kelime boyu) gösterir → 16 bit.
  • Programcıya 14 adet 16 bitlik yazmaç sunar.
  • Yazmaçlar, işlemcinin içindeki en hızlı depolama alanıdır: bellek erişimi için yol döngüsü (≥ 4 saat) gerekir, yazmaç erişimi gerekmez.
8 bit0 … 255 (FFh)
16 bit0 … 65 535 (FFFFh)
32 bit (DX:AX)0 … 4 294 967 295

Yazmaçlar

Genel Amaçlı Yazmaçlar

YazmaçYarılarÖzel kullanımı
AX birikeç (accumulator)AH · ALAritmetik işlenen ve sonuç; MUL/DIV, IN/OUT, dizgi komutları AX/AL'yi kullanır. Birçok komutun AX için daha kısa kodu vardır.
BX taban (base)BH · BLDolaylı adreslemede bağıl konumu (offset) tutar: MOV AL, [BX].
CX sayaç (count)CH · CLLOOP ve REP için döngü sayacı; kaydırma/döndürmede sayı CL'de.
DX veri (data)DH · DLAX ile birlikte 32 bitlik değer (DX:AX) – MUL sonucu, DIV böleni; IN/OUT'ta port adresi.
Yarılar bağımsız 8 bitlik yazmaçlardır ama aynı bitleri paylaşır: AL'yi değiştirmek AX'i de değiştirir. AH = bit 15–8 (high), AL = bit 7–0 (low).

Yazmaçlar

Demo: AX = AH : AL

  • 16 bitlik bir değer gir (hex). Üst bayt AH, alt bayt AL olur.
  • Bitlere tıklayarak tek tek değiştir.
  • AL'ye 1 ekle düğmesi yalnız alt baytı değiştirir: AL = FFh iken taşan elde AH'ye geçmez (8 bitlik işlem).

Yazmaçlar

İşaretçi ve İndis Yazmaçları

Belirli bellek konumlarını gösteren bağıl konum (offset) yazmaçlarıdır; bir kesim yazmacıyla birlikte adres oluştururlar.

YazmaçGörevVarsayılan kesim
SP yığın işaretçisiYığının üstünü (top) gösterir; PUSH, POP, CALL, RET, INT, IRET otomatik günceller.SS
BP taban işaretçisiYığının içindeki rastgele konumlara erişir (ör. prosedür parametreleri [BP+4]).SS
SI kaynak indisDizi/dizgi işlemlerinde kaynak konumu.DS
DI hedef indisDizi/dizgi işlemlerinde hedef konumu; dizgi komutlarında (MOVSB, STOSB) ES:DI.DS (dizgide ES)
PUSH, SP'yi 2 azaltıp SS:SP'ye yazar; POP okuyup SP'yi 2 artırır. Yığın bellekte aşağı doğru büyür (Bölüm 8).

Yazmaçlar

Kesim Yazmaçları

  • Kesimler bellekte, kesim yazmaçları işlemcinin içinde bulunur.
  • Her kesim yazmacı bir kesimin başlangıç adresini / 16 tutar (kesim tabanı = yazmaç × 10h).
CS Code SegmentProgramın kodu; CS:IP ile sonraki komut
DS Data SegmentDeğişkenler ve veriler
SS Stack SegmentYığın; SS:SP, SS:BP
ES Extra SegmentEk veri; dizgi hedefi ES:DI
Kurallar
  • Kesim yazmacına anlık değer doğrudan yüklenemez: MOV DS, 2000h geçersiz; önce MOV AX, 2000h, sonra MOV DS, AX.
  • CS, MOV ile değiştirilemez; JMP FAR, CALL FAR, RET FAR, INT, IRET değiştirir.
  • Kesimden kesime doğrudan MOV yoktur (MOV ES, DS geçersiz).

Yazmaçlar

Komut İşaretçisi (IP)

  • 16 bitlik yazmaç (Instruction Pointer).
  • Kod kesiminde bir sonraki komutun bağıl konumunu tutar.
  • Her komut baytı getirildikçe ilerler; komut uzunluğu kadar artmış olur.
  • Dallanma komutları (JMP, Jcc, CALL, RET, LOOP, INT) IP'ye yeni bir değer yükler.
  • Programcı IP'yi doğrudan okuyamaz/yazamaz (MOV IP, … yoktur).
  • Sonraki komutun fiziksel adresi: CS × 10h + IP.
Örnek

CS = 4321h, IP = 1000h

  43210h   ; CS × 10h
+ 01000h   ; IP
--------
  44210h

Sonraki komut 44210h fiziksel adresindedir. Bir sonraki slaytta adım adım.

Yazmaçlar

Bayrak Yazmacı (FLAGS)

—15—14—13—12OF11DF10IF9TF8SF7ZF6—5AF4—3PF2—1CF0durum bayrağı (6)kontrol bayrağı (3)kullanılmaz (7 bit)
Durum bayraklarıHer aritmetik/mantık işleminden sonra sonuca göre otomatik güncellenir: CF, PF, AF, ZF, SF, OF. Koşullu atlamalar (JZ, JC, JS …) bunlara bakar.
Kontrol bayraklarıİşlemcinin davranışını yönlendirmek için programcı tarafından ayarlanır: TF, IF, DF.

16 bitlik yazmacın yalnızca 9 biti kullanılır. MOV komutları bayrakları değiştirmez.

Yazmaçlar

Durum Bayrakları

BayrakBit1 olur, eğer…Örnek (8 bit)
CF taşıma (carry)0işaretsiz işlemde en üst bitten elde/ödünç çıktıysaFFh + 01h = 00h → CF=1
PF eşlik (parity)2sonucun alt baytındaki 1 sayısı çiftse03h (2 adet 1) → PF=1
AF yardımcı (auxiliary)4bit 3'ten bit 4'e elde/ödünç olduysa (BCD için)0Fh + 01h → AF=1
ZF sıfır (zero)6sonuç sıfırsa05h − 05h → ZF=1
SF işaret (sign)7sonucun en üst biti 1 ise (negatif)80h → SF=1
OF taşma (overflow)11işaretli sonuç sığmadıysa7Fh + 01h = 80h → OF=1
CF işaretsiz, OF işaretli sayılar için taşmayı bildirir. 7Fh + 01h: işaretsiz 127+1=128 doğru (CF=0), işaretli +127+1 = −128 yanlış (OF=1).

Yazmaçlar

Kontrol Bayrakları

BayrakGörevAyarlama
TF tuzak (trap)1 iken her komuttan sonra tip 1 kesme → adım adım yürütme (hata ayıklayıcılar).Doğrudan komutu yok; PUSHF/POPF ile yığın üzerinden
IF kesme (interrupt)1 iken INTR pininden gelen maskelenebilir kesmeler kabul edilir. NMI'yi etkilemez.STI (1), CLI (0)
DF yön (direction)Dizgi komutlarında SI/DI'nin yönü: 0 → artar, 1 → azalır.CLD (0), STD (1)
CLC, STC, CMC komutları da vardır, ancak bunlar bir kontrol bayrağını değil CF durum bayrağını temizler/kurar/tersler (ör. çok baytlı toplama öncesi).

Düzeltme: kaynakta CLC/STC kontrol bayrağı komutları arasında sayılıyordu; TF için de doğrudan bir komut olmadığı eklendi.

Yazmaçlar · Kodu adım adım çalıştır

Kod İzleme: Bayraklar ve IP

COM programı CS:0100h'den başlar. Varsayım: yazmaçlar ve bayraklar 0.

AX ← 1234h (AH=12h, AL=34h). Komut 3 bayt → IP 3 artar. MOV bayrakları değiştirmez.

BX ← 4050h. Bellekte BB 50 40: anlık değer küçük uçlu.

1234h + 4050h = 5284h. Elde yok (CF=0), bit 15 = 0 (SF=0). Alt bayt 84h = 1000 0100b → iki adet 1 → PF=1.

CX ← FFFFh. Bayraklar aynı kalır.

FFFFh + 1 = 0000h → ZF=1, AF=1. Dikkat: INC, CF'yi değiştirmez (CF=0 kaldı).

AL: 84h + 7Ch = 100h → AL=00h, CF=1, ZF=1. 8 bitlik işlem: elde AH'ye geçmez, AX=5200h. İşaretli: −124 + 124 = 0 → OF=0.

AH: 52h − 53h = FFh → ödünç alındı (CF=1), SF=1. İşaretli: 82 − 83 = −1 doğru → OF=0. FFh'de sekiz adet 1 → PF=1.

RET: COM programı DOS'a döner. IP'nin komut uzunluklarına göre 0100h → 0111h ilerlediğine dikkat.

org 100h
mov ax, 1234h     ; B8 34 12
mov bx, 4050h     ; BB 50 40
add ax, bx        ; 01 D8
mov cx, 0FFFFh    ; B9 FF FF
inc cx            ; 41
add al, 7Ch       ; 04 7C
sub ah, 53h       ; 80 EC 53
ret               ; C3

Kesimli Bellek

Kesimli Bellek Mimarisi

  • 8086 belleği kesimli (segmented) olarak adresler.
  • Her bellek adresi iki 16 bitlik parçayla verilir: kesim : bağıl konum (segment : offset), ör. 2000h:0010h.
  • Kesim yazmacı kesimin başlangıcını gösterir.
  • Bağıl konum, istenen baytın kesimin başından itibaren uzaklığıdır (0000h–FFFFh).
  • İkisi BIU'daki adres toplayıcıda birleştirilerek 20 bitlik fiziksel adres elde edilir.
Mantıksal ve fiziksel adres

Mantıksal adres: programın kullandığı kesim:offset çifti.

Fiziksel adres: adres yoluna çıkan gerçek 20 bitlik adres.

FA = kesim × 10h + offset

Kesimli Bellek

Kesim ve Bağıl Konum

1 MB bellekFFFFFh00000h10000h1FFFFhKesim yazmacı1000h

Bellek 1 MB: 00000h–FFFFFh. Bir kesim yazmacı ve bir bağıl konumdan 20 bitlik adres üreteceğiz.

1 MB bellekFFFFFh00000h10000h1FFFFhKesim yazmacı1000h

Kesim yazmacı 1000h (16 bit).

1 MB bellekFFFFFh00000h10000h1FFFFh64 KB kesimKesim yazmacı1000h× 10h (<< 4)10000htaban

Kesim değeri 4 bit sola kaydırılır (× 10h): 1000h → 10000h. Kesim tabanı her zaman 16'nın katıdır (paragraf sınırı).

1 MB bellekFFFFFh00000h10000h1FFFFh64 KB kesimKesim yazmacı1000h× 10h (<< 4)10000htabanBağıl konumF000h

Bağıl konum F000h. En büyük bağıl konum FFFFh olduğundan kesim 10000h–1FFFFh aralığını (64 KB) kapsar.

1 MB bellekFFFFFh00000h10000h1FFFFh64 KB kesimKesim yazmacı1000h× 10h (<< 4)10000htabanBağıl konumF000h+1F000h10000h + F000h = 1F000h

Toplayıcı: 10000h + F000h = 1F000h. Bu 20 bitlik değer adres yoluna çıkar.

Kesimli Bellek

Adım Adım: CS:IP → Fiziksel Adres

Örnek 1: CS = 4321h, IP = 1000h4321CS (16 bit)

CS = 4321h (4 hex hane = 16 bit).

Örnek 1: CS = 4321h, IP = 1000h43210CS × 10h← sağa bir 0 eklendi

× 10h = hex olarak sağa bir 0 eklemek (4 bit sola kaydırma): 43210h.

Örnek 1: CS = 4321h, IP = 1000h43210CS × 10h1000+ IP

IP = 1000h sağa hizalanarak altına yazılır (en soldaki hane boş = 0).

Örnek 1: CS = 4321h, IP = 1000h43210CS × 10h1000+ IP44210= fiziksel43210h + 1000h = 44210h

Haneleri sağdan toplarız: 0+0, 1+0, 2+0, 3+1, 4+0 → 44210h. Elde oluşmadı.

Örnek 2: CS = F000h, IP = FFF0hF000CS (16 bit)

CS = F000h, IP = FFF0h (8086'nın sıfırlama sonrası ilk komutunun adresi BIOS'ta).

Örnek 2: CS = F000h, IP = FFF0hF0000CS × 10h← sağa bir 0 eklendi

F000h × 10h = F0000h.

Örnek 2: CS = F000h, IP = FFF0hF0000CS × 10hFFF0+ IP

IP = FFF0h sağa hizalanır.

Örnek 2: CS = F000h, IP = FFF0hF0000CS × 10hFFF0+ IPFFFF0= fizikselF0000h + FFF0h = FFFF0h

F0000h + FFF0h = FFFF0h: 1 MB'ın son 16 baytı. Reset sonrası işlemci ilk komutu buradan alır.

Kesimli Bellek

Demo: Fiziksel Adres Hesaplayıcı

:

Kesim tabanı ve 64 KB'lık kesim aralığı haritada gösterilir. Toplam 1 MB'ı aşarsa 8086 adresi 20 bite kırpar (sarma).

Kesimli Bellek

Bellek Kesimleme

00000h40000h80000hC0000hFFFFFh1 MB = 16 × 64 KBCS=1000h10000h–1FFFFhDS=2000h20000h–2FFFFhES=2800h28000h–37FFFhSS=3000h30000h–3FFFFhES kesimi DS ve SS ile çakışıyor: kesimler üst üste binebilir.
  • 20 bitlik adres yolu 1 MB'ı adresler; bir kesim en fazla 64 KB'tır (16 bitlik offset).
  • Herhangi bir anda yalnızca 4 kesim etkindir (CS, DS, SS, ES) → aynı anda en çok 256 KB doğrudan erişilir. Başka bölgeye erişmek için kesim yazmacı değiştirilir.
  • Kesimler sabit 16 parça değildir: her paragraf (16 bayt) sınırında başlayabilir, çakışabilir veya ayrık olabilir.

Düzeltme: kaynaktaki “belleği 16 adet 64 KB'lık kesime böler” ifadesi yalnızca 1 MB / 64 KB = 16 hesabını anlatır; 8086'da kesim başlangıçları sabit değildir (65 536 olası başlangıç).

Kesimli Bellek

Neden Kesimleme?

Artıları

  • 16 bitlik yazmaçlarla 20 bitlik (1 MB) bellek adreslenir.
  • Kod, veri ve yığın birbirinden ayrılır; program düzeni netleşir.
  • Yeniden konumlanabilirlik: yalnızca kesim yazmaçları değiştirilerek program bellekte başka yere yüklenebilir.
  • Komutlar kısa kalır: çoğu adres 16 bitlik offset ile yazılır.

Eksileri

  • Tek bir dizi/yapı 64 KB'ı aşamaz (aşarsa kesim değiştirmek gerekir).
  • Aynı fiziksel adresin birçok kesim:offset yazımı vardır → işaretçi karşılaştırması zorlaşır.
  • Kesimler arasında koruma yoktur: hatalı bir yazma başka kesimi bozabilir.
  • Adres hesabı programcı için ek zihinsel yük.

Kesimli Bellek

Aynı Adres, Farklı Kesim:Offset

Mantıksal adresHesapFiziksel adres
1234h:0005h12340h + 0005h12345h
1000h:2345h10000h + 2345h12345h
1200h:0345h12000h + 0345h12345h
0234h:FFF5h02340h + FFF5h12335h (dikkat: farklı!)
FFFFh:0010hFFFF0h + 0010h = 100000h00000h (8086'da 20 bite sarar)
Normalleştirme: offset'i 0–Fh arasına indirmek için kesim = FA'nın ilk 4 hanesi, offset = son hane. 12345h → 1234h:0005h. Bir fiziksel adresin en fazla 4096 farklı yazımı vardır.

Sarma (wrap-around): 8086'da A20 hattı yoktur; 1 MB'ı aşan toplam 00000h'ye döner. 80286+ işlemcilerde bu davranış “A20 kapısı” ile taklit edilir.

Kesimli Bellek

Varsayılan Kesimler

Erişim türüKesimOffset kaynağıDeğiştirilebilir mi?
Komut getirmeCSIPhayır
Yığın işlemleri (PUSH, POP, CALL, RET)SSSPhayır
BP ile adresleme [BP+…]SSetkin adresevet: DS:[BP]
Genel veri [BX], [SI], [DI], [1234h]DSetkin adresevet: ES:[BX]
Dizgi kaynağı (MOVSB, LODSB)DSSIevet
Dizgi hedefi (MOVSB, STOSB)ESDIhayır
Varsayılan kesimi değiştirmek için kesim öneki (segment override) kullanılır: MOV AL, ES:[BX] → fiziksel adres = ES × 10h + BX. Önek komuta 1 bayt ekler (26h).

Kesimli Bellek · Kodu adım adım çalıştır

Kod İzleme: Kesim:Offset ile Erişim

AX ← 2000h. Kesim yazmacına anlık değer yüklenemediği için önce AX'e yüklenir.

DS ← AX = 2000h. Veri kesimi artık 20000h–2FFFFh.

BX ← 0010h (bağıl konum).

FA = 2000h×10h + 0010h = 20010h. Oraya 41h ('A') yazılır.

AX ← 2001h.

DS ← 2001h: kesim tabanı 16 bayt (bir paragraf) ileri kaydı → 20010h–3000Fh.

BX ← 0000h.

FA = 20010h + 0000h = 20010h → AL = 41h. 2000h:0010h ile 2001h:0000h aynı bayt!

SI ← FFFFh: en büyük bağıl konum.

FA = 20010h + FFFFh = 3000Fh: bu kesimin son baytı. AH bu bayttaki değeri alır.

mov ax, 2000h
mov ds, ax          ; DS = 2000h
mov bx, 0010h
mov byte ptr [bx], 41h
mov ax, 2001h
mov ds, ax          ; +16 bayt
mov bx, 0000h
mov al, [bx]        ; aynı bayt
mov si, 0FFFFh
mov ah, [si]        ; son bayt

Donanım

8086 Pin Diyagramı

  • 40 pinli DIP paket; pin 1 ve 20 toprak (GND), pin 40 besleme (+5 V).
  • AD0–AD15: adres ve veri aynı pinlerden zaman paylaşımlı (çoklanmış) geçer.
  • A16–A19: adresin üst 4 biti, durum bitleriyle çoklanır → toplam 20 bit adres.
  • Pin 24–31'in işlevi MN/MX' pinine göre değişir (parantez içindekiler minimum mod).
  • ' işareti (diyagramda üst çizgi) sinyalin aktif düşük olduğunu gösterir.
  • Ayrıntılar: Bölüm 2 – 8086 Pinler.
maks. mod(min.)8086CPU1GND2AD143AD134AD125AD116AD107AD98AD89AD710AD611AD512AD413AD314AD215AD116AD017NMI18INTR19CLK20GND21RESET22READY23TEST'24QS1(INTA')25QS0(ALE)26S0'(DEN')27S1'(DT/R')28S2'(M/IO')29LOCK'(WR')30RQ'/GT1'(HLDA)31RQ'/GT0'(HOLD)32RD'33MN/MX'34BHE'/S735A19/S636A18/S537A17/S438A16/S339AD1540VCC

Özet

Özet

Genel

16 bit veri yolu ve yazmaçlar, 20 bit adres yolu → 1 MB. CISC, değişken uzunlukta komutlar.

BIU + EU

BIU getirir ve adres üretir; EU çözer ve yürütür. 6 baytlık FIFO kuyruk ile ikisi paralel çalışır.

14 yazmaç

AX, BX, CX, DX · SP, BP, SI, DI · CS, DS, SS, ES · IP, FLAGS.

Bayraklar

Durum: CF, PF, AF, ZF, SF, OF. Kontrol: TF, IF, DF.

Adres hesabı

FA = kesim × 10h + offset. Kesim ≤ 64 KB, paragraf sınırında başlar, kesimler çakışabilir.

Dallanma

IP'ye yeni değer yükler ve önden getirme kuyruğunu temizler.

Özet

Alıştırmalar

  1. CS = 2F00h, IP = 01A4h ise sonraki komutun fiziksel adresi nedir?
  2. 3A2C5h fiziksel adresini normalleştirilmiş kesim:offset biçiminde yazın; DS = 3000h ise offset ne olmalıdır?
  3. AX = 80FFh iken ADD AL, 1 sonrası AX, CF, ZF, SF, OF ne olur?
  4. MOV DS, 1000h neden derlenmez? Doğru yazımı verin.
  5. Kuyrukta 6 bayt varken EU bir JMP yürütürse kuyruğa ne olur? Neden?
  6. 8086 bir komutu getirirken aynı anda başka komutu yürütebilir mi? Hangi birimler sayesinde?
İpuçları / cevaplar
  1. 2F000h + 01A4h = 2F1A4h.
  2. 3A2Ch:0005h; DS = 3000h ise offset = 3A2C5h − 30000h = A2C5h.
  3. AL: FFh + 1 = 00h → AX = 8000h; CF=1, ZF=1, SF=0, OF=0 (−1 + 1 = 0 doğru).
  4. Kesim yazmacına anlık değer yüklenemez: MOV AX, 1000h + MOV DS, AX.
  5. Kuyruk temizlenir; önceden getirilen baytlar atlamanın hedefinden değil, sıradaki adreslerden gelmiştir.
  6. Evet: BIU getirir, EU yürütür (boru hattı).

Özet

Kaynaklar

  • Intel, 8086 16-Bit HMOS Microprocessor veri sayfası (231455).
  • Intel, The 8086 Family User's Manual, 1979.
  • B. B. Brey, The Intel Microprocessors, 8. baskı, Pearson, 2009.
  • M. A. Mazidi, J. G. Mazidi, D. Causey, The x86 PC: Assembly Language, Design, and Interfacing, 5. baskı, Pearson, 2010.
  • emu8086 belgeleri ve komut kümesi başvurusu.

Son

Bölüm 1: 8086 Mimarisi
Sonraki bölüm: Bölüm 1: Programlama Dilleri
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.