Bölüm 2: 8086 Mimarisi

Mikroişlemciler
8086'ya genel bakışSistem yollarıBIU ve EU Önden getirme kuyruğuGetir–çöz–yürütYazmaç kümesi Kesim yazmaçları ve IPKesimli 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; kesim yazmaçlarının ve IP'nin görevini açıklamak.

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

8 bitlik dış veri yolu kullanan kardeşi 8088'den farklı olarak 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).
Onaltılık gösterim20 bit = 5 onaltılık basamak: 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 tümleşik 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.
8284Asaat üreteciCLK8086yalnız yazmaçlaradres kilitleri (8282)alıcı-vericiler (8286)sistem yoluRAM/ROMG/Ç
8086 tabanlı bir bilgisayar = 8086 + 8284A saat üreteci + adres kilitleri + veri yolu alıcı-vericileri + bellek + G/Ç birimleri.

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 sözcük (2 bayt)
Kontrolokuma, yazma, kesme istekleri, durum bilgisiRD', WR', M/IO', ALE, INTR, READY …

Genel Bakış · Kodu adım adım çalıştır

Kod İzleme: Yollar Üzerinde Bellek ve G/Ç

org 100h
mov ax, 1000h
mov ds, ax
mov bx, 0200h
mov al, [bx]     ; bellek oku
out 50h, al      ; G/Ç yaz
in al, 51h       ; G/Ç oku
mov [bx+1], al   ; bellek yaz
ret
8086AL00hDS1000hBellek10200h: 5Ah10201h: ??G/Çport 50h: ??port 51h: 3Chadresverikontrolveri erişimi yok

Veri kesimi DS = 1000h (taban 10000h). Bellekte 10200h adresinde 5Ah, 51h numaralı G/Ç portunda 3Ch bulunuyor (örnek değerler).

8086AL00hDS1000hBellek10200h: 5Ah10201h: ??G/Çport 50h: ??port 51h: 3Chadresverikontrolveri erişimi yok

BX = 0200h. Yalnız komut getirme; veri için yol kullanılmadı.

8086AL5AhDS1000hBellek10200h: 5Ah10201h: ??G/Çport 50h: ??port 51h: 3Chadresverikontrol10200h5Ah ← bellektenM/IO'=1 RD'=0 WR'=1

Bellek okuma: adres yolunda 20 bitlik 10200h, M/IO' = 1, RD' = 0. Bellek 5Ah'yi veri yoluna koyar → AL = 5Ah.

8086AL5AhDS1000hBellek10200h: 5Ah10201h: ??G/Çport 50h: 5Ahport 51h: 3Chadresverikontrol0050h (G/Ç)5Ah → dışarıM/IO'=0 RD'=1 WR'=0

G/Ç yazma: adres yolunda yalnız port numarası (0050h, 16 bit), M/IO' = 0, WR' = 0; veri yolunda AL = 5Ah. Bellek bu döngüyü yok sayar.

8086AL3ChDS1000hBellek10200h: 5Ah10201h: ??G/Çport 50h: 5Ahport 51h: 3Chadresverikontrol0051h (G/Ç)3Ch ← aygıttanM/IO'=0 RD'=0 WR'=1

G/Ç okuma: port 0051h, M/IO' = 0, RD' = 0. Aygıt 3Ch'yi veri yoluna koyar → AL = 3Ch.

8086AL3ChDS1000hBellek10200h: 5Ah10201h: 3ChG/Çport 50h: 5Ahport 51h: 3Chadresverikontrol10201h3Ch → dışarıM/IO'=1 RD'=1 WR'=0

Bellek yazma: EA = BX + 1 = 0201h → FA = 10201h, M/IO' = 1, WR' = 0, veri 3Ch. Aynı adres ve veri yolları hem bellek hem G/Ç için kullanılır; ayrımı M/IO' yapar.

İç Yapı

İki Temel Birim: BIU ve EU

Yol 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.
sistem yoluBIUadres üretir · getirirkuyrukEUçözer · ALU · yazmaçlar
İ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).

İç Yapı

8086 Blok Diyagramı

Yürütme Birimi (EU)Yol 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, kontrol sistemi
Sağ: BIUkesim yazmaçları, IP, adres toplayıcı, kuyruk, yol kontrolü
KöprüEU, kuyruktan 8 bitlik Q yoluyla komut baytı alır

İç Yapı

8086 Mimarisinin İşleyişi

Yürütme Birimi (EU)Yol 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)Yol 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)Yol 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 kontrol mantığı bir bellek okuma döngüsü başlatır.

Yürütme Birimi (EU)Yol 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)Yol 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; kontrol sistemi komutu çözer.

Yürütme Birimi (EU)Yol 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. Kontrol sinyalleriyle AX ve BX ALU veri yolundan geçici yazmaçlara, oradan ALU'ya gelir; toplama yapılır.

Yürütme Birimi (EU)Yol 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ı

Yol 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 kontrol 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ı önden getirir → boru hattı.
  • Kuyrukta en az 2 bayt boş yer açıldığında BIU sıradaki sözcüğü (2 bayt) getirmeye başlar.
  • Bir dallanma (JMP, CALL, RET, koşullu atlama, kesme) yürütülünce kuyruk temizlenir; önden 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.
BIUbellekten getiriryazB81342123014D8566 baytlık FIFO (ilk giren ilk çıkar)alEUçözer ve yürütürkuyruk sonukuyruk başı
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 önden 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 sözcük sözcük 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 sözcüğü (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, kontrol 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 kontrol 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ı
  • Kontrol sistemi
Yürütme Birimi (EU)Yol 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ı · Kodu adım adım çalıştır

Kod İzleme: ALU Ne Yapar?

org 100h
mov ax, 0010h
mov bx, 0030h
add ax, bx      ; AX ← AX + BX
sub al, 5       ; AL ← AL − 5
mov bl, 4
mul bl          ; AX ← AL × BL
mov dx, 0
mov cx, 3
div cx          ; AX ← DX:AX ÷ CX
and al, 0Fh     ; üst 4 biti sil
xor ax, ax      ; AX ← 0
ret
AX0010hBX0030hALU(kullanılmaz)bayraklarCF0ZF0SF0OF0AX = 0010hDX = 0000hBX = 0030hCX = 0000h

İşlenenler yazmaçlara yüklenir: AX = 0010h, BX = 0030h. MOV, ALU'yu kullanmaz; bayraklar değişmez.

AX0010hBX0030hALU+AX = 0040hbayraklarCF0ZF0SF0OF0AX = 0040hDX = 0000hBX = 0030hCX = 0000h

add ax, bx: ALU 16 bitlik toplama yapar → AX = 0040h. Elde yok (CF = 0), sonuç sıfır değil (ZF = 0).

AL40hsabit05hALU−AL = 3BhbayraklarCF0ZF0SF0OF0AX = 003BhDX = 0000hBX = 0030hCX = 0000h

sub al, 5: 8 bitlik çıkarma; yalnız AL değişir → AL = 3Bh (AX = 003Bh). Ödünç gerekmedi: CF = 0.

AL3BhBL04hALU×AX = 00EChbayraklarCF0ZF?SF?OF0AX = 00EChDX = 0000hBX = 0004hCX = 0000h

BL = 4. mul bl: 8 bitlik işlenenlerin çarpımı 16 bittir: 3Bh × 04h = 00ECh → AX. AH = 0 olduğundan CF = OF = 0; SF ve ZF tanımsız (?).

DX:AX000000EChCX0003hALU÷bayraklarCF0ZF?SF?OF0AX = 00EChDX = 0000hBX = 0004hCX = 0003h

Bölmeye hazırlık: bölünen 32 bitlik DX:AX çiftidir, DX = 0 yapılır; bölen CX = 3.

DX:AX000000EChCX0003hALU÷AX · DX = 004Eh · 0002hbayraklarCF?ZF?SF?OF?AX = 004EhDX = 0002hBX = 0004hCX = 0003h

div cx: 236 ÷ 3 = 78 kalan 2 → bölüm AX = 004Eh, kalan DX = 0002h. DIV sonrası bayraklar tanımsızdır.

AL4Ehmaske0FhALUANDAL = 0EhbayraklarCF0ZF0SF0OF0AX = 000EhDX = 0002hBX = 0004hCX = 0003h

and al, 0Fh: 0100 1110 AND 0000 1111 = 0000 1110 → AL = 0Eh. Üst 4 bit silindi; AND, CF = OF = 0 yapar.

AX000EhAX000EhALUXORAX = 0000hbayraklarCF0ZF1SF0OF0AX = 0000hDX = 0002hBX = 0004hCX = 0003h

xor ax, ax: her bit kendisiyle XOR'lanınca 0 olur → AX = 0000h, ZF = 1. mov ax, 0'dan kısa (2 bayt) bir sıfırlama yoludur.

İç Yapı

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

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 kontrol devresine gönderir.

Kontrol 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.

Kontrol 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.

Güç yönetimi 8086'da yoktur; bu özellikler çok sonraki işlemcilerle (ör. 386SL) gelmiştir. 8086'nın kontrol 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 (little-endian)
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 little-endian düzende (düşük bayt önce) yazılır: 4050h → önce 50, sonra 40.

Yazmaçtan yazmaca MOV 2 bayttır (8B C3 ya da eşdeğeri 89 D8).

İç Yapı · Kodu adım adım çalıştır

Kod İzleme: Baytlar ve IP

org 100h
inc cx
mov bx, 4050h
mov ax, bx
add al, 7Ch
mov word ptr [bx+1234h], 5678h
ret
kod kesimi (CS:0100h–010Eh)41BB50408BC3047CC78734127856C3IPINC CX1 bayt · işlem koduIP: 0100h → 0101h

Program 0100h'de. inc cx yalnız işlem kodundan oluşur: 41 (1 bayt) → IP = 0101h. CX = 1.

kod kesimi (CS:0100h–010Eh)41BB50408BC3047CC78734127856C3IPMOV BX,4050h3 bayt · işlem kodu + 16 bit anlıkIP: 0101h → 0104h

BB 50 40: BB = “BX'e 16 bitlik sabit”; sabit little-endian yazılır (önce 50, sonra 40). 3 bayt → IP = 0104h.

kod kesimi (CS:0100h–010Eh)41BB50408BC3047CC78734127856C3IPMOV AX,BX2 bayt · işlem kodu + ModR/MIP: 0104h → 0106h

8B C3: 8B = MOV r16, r/m16; ModR/M C3 = 11 000 011 → mod 11 (yazmaç), reg AX, r/m BX. 2 bayt → IP = 0106h.

kod kesimi (CS:0100h–010Eh)41BB50408BC3047CC78734127856C3IPADD AL,7Ch2 bayt · AL kısa kodu + 8 bit anlıkIP: 0106h → 0108h

04 7C: AL'ye özel kısa kod + 8 bitlik sabit. AL = 50h + 7Ch = CCh, AX = 40CCh. IP = 0108h.

kod kesimi (CS:0100h–010Eh)41BB50408BC3047CC78734127856C3IPMOV WORD PTR [BX+1234h],5678h6 bayt · kod + ModR/M + yer değ. + anlıkIP: 0108h → 010EhDS:5284h7856veri: 5678h

6 bayt: C7 + ModR/M 87 (mod 10: 16 bit yer değiştirme, r/m BX) + 34 12 + 78 56. EA = 4050h + 1234h = 5284h; oraya 5678h yazılır. IP = 010Eh.

kod kesimi (CS:0100h–010Eh)41BB50408BC3047CC78734127856C3IPRET1 bayt · işlem koduIP: 010Eh → 0000hDS:5284h7856veri: 5678h

C3 = RET (1 bayt); IP yığından alınan 0000h olur (COM programı DOS'a döner). Altı komut 15 bayt tuttu: uzunluk 1 ile 6 bayt arasında.

Yazmaçlar

Yazmaç Kümesi

Genel amaçlı (veri) yazmaçlarıAXAHALakümülatörBXBHBLtabanCXCHCLsayaç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 Sözcük 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ı (sözcük 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

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.

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 + bağıl konum

kesim (16 bit)2000h× 10hkesim tabanı20000hΣbağıl konum 0010hfiziksel adres (20 bit)20010hA19–A0

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 onaltılık basamak = 16 bit).

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

× 10h = onaltılık 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 basamak boş = 0).

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

Basamakları 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.

1 MB / 64 KB = 16 yalnızca bir hesaptı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 bağıl konum 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:Bağıl Konum

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

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

Kod İzleme: 1 MB Sınırında Adres Başa Sarar

org 100h
mov ax, 0
mov ds, ax
mov byte ptr [0500h], 77h
mov ax, 0FFFFh
mov ds, ax
mov bl, [0510h]    ; FFFF:0510
ret
DS0000hBL00hfiziksel 00500h00h

DS = 0000h: kesim belleğin en başında. Kesim yazmacına sabit yazılamadığı için değer AX'ten geçer.

DS0000hBL00hfiziksel 00500h77h0000h × 10h + 0500h= 00500h

mov byte ptr [0500h], 77h: 0000:0500 → fiziksel 00500h adresine 77h yazıldı.

DSFFFFhBL00hfiziksel 00500h77h

DS = FFFFh: kesim FFFF0h'den, 1 MB'ın son 16 baytından başlar.

DSFFFFhBL77hfiziksel 00500h77hFFFF0h + 0510h = 100500h21. bit atılır → 00500hbaşa sardı

mov bl, [0510h]: toplam 21 bit olur; 8086'nın 20 adres hattı yalnızca 00500h'yi taşır. Aynı bayt okundu: BL = 77h.

DSFFFFhBL77hfiziksel 00500h77h

RET. FFFF:0010'dan FFFF:FFFF'e kadarki adresler belleğin başındaki 00000h–0FFEFh bölgesine düşer.

80286 ve sonrasında 21. adres hattı (A20) açıksa FFFF:0510 gerçekten 100500h'ye ulaşır; 8086 için yazılmış bazı eski programlar başa sarmaya güvendiği için bu hat kapatılabilir.

Kesimli Bellek

Varsayılan Kesimler

Erişim türüKesimBağıl konum 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: Aynı Bağıl Konum, Üç Kesim

org 100h
mov ax, 2000h
mov ds, ax
mov ax, 3000h
mov es, ax
mov bx, 0010h
mov bp, 0010h
mov byte ptr [bx], 11h    ; DS
mov byte ptr [bp], 22h    ; SS
mov byte ptr es:[bx], 33h ; ES
mov al, [bx]              ; DS
mov ah, [bp]              ; SS
ret
kesim yazmaçlarıDS = 2000hES = 0700hSS = 0700hBX = 0000h · BP = 0000hES kesimi (henüz yok)30010h??DS kesimi20010h??SS kesimi07010h??

Kesim yazmacına sabit yüklenemez; AX üzerinden DS = 2000h yapılır. COM programında SS = CS = 0700h kalır.

kesim yazmaçlarıDS = 2000hES = 3000hSS = 0700hBX = 0000h · BP = 0000hES kesimi30010h??DS kesimi20010h??SS kesimi07010h??

Aynı yolla ES = 3000h. Artık üç farklı kesim tabanı var: 07000h (SS), 20000h (DS), 30000h (ES).

kesim yazmaçlarıDS = 2000hES = 3000hSS = 0700hBX = 0010h · BP = 0010hES kesimi30010h??DS kesimi20010h??SS kesimi07010h??

BX ve BP aynı bağıl konumu tutar: 0010h. Hangi bayta erişileceğini bağıl konum değil, kullanılan kesim belirleyecek.

DS × 10h + BX20000h+ 0010h20010hyaz 11hES kesimi30010h??DS kesimi20010h11hSS kesimi07010h??

[bx] varsayılan olarak DS kullanır: 2000h × 10h + 0010h = 20010h ← 11h.

SS × 10h + BP07000h+ 0010h07010hyaz 22hES kesimi30010h??DS kesimi20010h11hSS kesimi07010h22h

[bp] varsayılan olarak SS kullanır: 0700h × 10h + 0010h = 07010h ← 22h. Aynı bağıl konum, başka bayt.

ES × 10h + BX30000h+ 0010h30010hyaz 33hES kesimi30010h33hDS kesimi20010h11hSS kesimi07010h22h

es: kesim öneki DS yerine ES'yi seçtirir (+1 bayt, 26h): 30000h + 0010h = 30010h ← 33h.

DS × 10h + BX20000h+ 0010h20010hoku → ALES kesimi30010h33hDS kesimi20010h11hSS kesimi07010h22h

mov al, [bx] yine DS:0010h'yi okur → AL = 11h (ES:0010h'deki 33h değil).

SS × 10h + BP07000h+ 0010h07010hoku → AHES kesimi30010h33hDS kesimi20010h11hSS kesimi07010h22h

mov ah, [bp] SS:0010h'yi okur → AH = 22h. Sonuç AX = 2211h: üç erişim, aynı bağıl konum, üç farklı fiziksel adres.

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

Kod İzleme: Kesim:Bağıl Konum 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

Ö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.

Kesim yazmaçları

CS, DS, SS, ES dört etkin kesimin tabanını gösterir; kesim yazmacına anlık değer yüklenemez.

Adres hesabı

FA = kesim × 10h + bağıl konum. 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 bağıl konum ne olmalıdır?
  3. MOV DS, 1000h neden derlenmez? Doğru yazımı verin.
  4. Kuyrukta 6 bayt varken EU bir JMP yürütürse kuyruğa ne olur? Neden?
  5. 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 bağıl konum = 3A2C5h − 30000h = A2C5h.
  3. Kesim yazmacına anlık değer yüklenemez: MOV AX, 1000h + MOV DS, AX.
  4. Kuyruk temizlenir; önden getirilen baytlar atlamanın hedefinden değil, sıradaki adreslerden gelmiştir.
  5. 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 2: 8086 Mimarisi
Sonraki bölüm: Bölüm 2: 8086 Yazmaçlar · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.