Bölüm 1: 8086 Mimarisi
Giriş
Öğrenme Çıktıları
8086'nın veri/adres yolu genişliğini, adresleyebildiği bellek miktarını ve x86 ailesindeki yerini açıklamak.
BIU ve EU birimlerinin görevlerini, önden getirme kuyruğunu ve boru hattı fikrini anlatmak.
14 yazmacı gruplarına ayırmak; genel amaçlı, işaretçi/indis, kesim yazmaçlarını ve bayrakları tanımak.
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.
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
| İşlemci | Yıl | İç / dış veri yolu | Adres yolu | Bellek | Not |
|---|---|---|---|---|---|
| 8086 | 1978 | 16 / 16 bit | 20 bit | 1 MB | 6 baytlık önden getirme kuyruğu |
| 8088 | 1979 | 16 / 8 bit | 20 bit | 1 MB | 4 baytlık kuyruk; IBM PC (1981) |
| 80186 | 1982 | 16 / 16 bit | 20 bit | 1 MB | tümleşik çevre birimleri |
| 80286 | 1982 | 16 / 16 bit | 24 bit | 16 MB | korumalı mod |
| 80386 | 1985 | 32 / 32 bit | 32 bit | 4 GB | 32 bit x86 (IA-32) |
Genel Bakış
Neden 20 Bit Adres?
00000h, en yüksek FFFFFh.Genel Bakış
Bellek Yapısı: İşlemci Tek Başına Değil
- 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.
- 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.
Genel Bakış
Sistem Yolları
| Yol | Ne taşır? | 8086'da |
|---|---|---|
| Adres | okunacak/yazılacak bellek konumu veya G/Ç port numarası | 20 bit → 1 MB bellek; G/Ç için 16 bit → 64 K port |
| Veri | işlemci ile bellek/G/Ç arasındaki komut ve veri baytları | 16 bit, tek seferde bir kelime (2 bayt) |
| Kontrol | okuma, yazma, kesme istekleri, durum bilgisi | RD', 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
- 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.
- 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.
Düzeltme: kaynakta “BIU komutları getirir ve çözer” deniyordu; çözme (decode) EU'nun işidir.
İç Yapı
8086 Blok Diyagramı
İç Yapı
8086 Mimarisinin İşleyişi
Genel görünüm. Bir komutun yolculuğunu adım adım izleyelim: ADD AX, BX.
1. BIU, getirilecek komutun fiziksel adresini hesaplar: CS × 10h + IP (adres toplayıcı).
2. 20 bitlik adres dış adres yoluna konur; yol denetim mantığı bir bellek okuma döngüsü başlatır.
3. Gelen komut baytları 6 baytlık FIFO kuyruğa yazılır; IP getirilen bayt sayısı kadar ilerler.
4. Sıra komuta gelince EU, Q yolu üzerinden işlem kodunu (opcode) alır; denetim sistemi komutu çözer.
5. Denetim sinyalleriyle AX ve BX ALU veri yolundan geçici yazmaçlara, oradan ALU'ya gelir; toplama yapılır.
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.
- 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.
İç Yapı
Boru Hattı (Pipelining)
G = getir (fetch, BIU), Y = çöz + yürüt (EU). Her kutu 2 zaman birimi varsayılmıştır.
Boru hattı olmasaydı: önce getir (G), sonra yürüt (Y); BIU ve EU sırayla boş bekler.
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.
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
Başlangıç (veya dallanma sonrası): kuyruk boş, EU bekler. CS:IP = CS:0100h.
BIU kelime kelime getirir (B8 34, 12 01, D8 41); kuyruk dolar. EU ilk bayt gelir gelmez çözmeye başlar.
EU 3 baytlık MOV AX,1234h'yi kuyruktan çekti. Kuyrukta 3 boş yer var (≥ 2).
EU yürütürken BIU sonraki kelimeyi (EB 05) getirir. Bekleme yok.
EU 01 D8'i (ADD AX,BX) aldı; BIU 90 90'ı getirdi.
EU 41'i (INC CX) aldı; BIU iki NOP baytı daha getirdi, kuyruk dolu.
EU EB 05'i yürütür: IP = 0108h + 5 = 010Dh. Kuyruktaki 90'lar geçersiz → kuyruk temizlenir.
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
- 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.
- 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.
İç 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
İç 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 | İşlem | Boyut |
|---|---|---|
ADD AX, BX | AX ← AX + BX | 16 bit |
SUB AL, 5 | AL ← AL − 5 | 8 bit |
MUL BL | AX ← AL × BL | 8 → 16 |
DIV CX | AX ← DX:AX ÷ CX, DX ← kalan | 32 → 16 |
AND AL, 0Fh | AL'nin üst 4 bitini sıfırla | 8 bit |
XOR AX, AX | AX ← 0 (ZF = 1) | 16 bit |
İç Yapı
Komut Yazmacı, Çözücü ve Denetim
EU, kuyruktan işletilecek komutu alır; işlem kodu (opcode) çözülürken geçici olarak burada tutulur. Programcı bu yazmaca erişemez.
İşlem kodunu çözer: hangi işlem, hangi işlenenler, hangi adresleme modu? Gerekli bilgiyi denetim devresine gönderir.
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.
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.
| Komut | Makine kodu (hex) | Bayt | Açıklama |
|---|---|---|---|
INC CX | 41 | 1 | yalnızca işlem kodu |
MOV AX, BX | 8B C3 | 2 | işlem kodu + ModR/M baytı |
ADD AL, 7Ch | 04 7C | 2 | AL'ye özel kısa kod + 8 bit anlık |
MOV BX, 4050h | BB 50 40 | 3 | işlem kodu + 16 bit anlık (küçük uçlu) |
MOV WORD PTR [BX+1234h], 5678h | C7 87 34 12 78 56 | 6 | ModR/M + 16 bit yer değiştirme + 16 bit anlık |
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 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.
Yazmaçlar
Genel Amaçlı Yazmaçlar
| Yazmaç | Yarılar | Özel kullanımı |
|---|---|---|
| AX birikeç (accumulator) | AH · AL | Aritmetik 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 · BL | Dolaylı adreslemede bağıl konumu (offset) tutar: MOV AL, [BX]. |
| CX sayaç (count) | CH · CL | LOOP ve REP için döngü sayacı; kaydırma/döndürmede sayı CL'de. |
| DX veri (data) | DH · DL | AX ile birlikte 32 bitlik değer (DX:AX) – MUL sonucu, DIV böleni; IN/OUT'ta port adresi. |
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 baytALolur. - Bitlere tıklayarak tek tek değiştir.
AL'ye 1 ekle düğmesi yalnız alt baytı değiştirir:AL = FFhiken 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örev | Varsayılan kesim |
|---|---|---|
| SP yığın işaretçisi | Yığının üstünü (top) gösterir; PUSH, POP, CALL, RET, INT, IRET otomatik günceller. | SS |
| BP taban işaretçisi | Yığının içindeki rastgele konumlara erişir (ör. prosedür parametreleri [BP+4]). | SS |
| SI kaynak indis | Dizi/dizgi işlemlerinde kaynak konumu. | DS |
| DI hedef indis | Dizi/dizgi işlemlerinde hedef konumu; dizgi komutlarında (MOVSB, STOSB) ES:DI. | DS (dizgide ES) |
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 Segment | Programın kodu; CS:IP ile sonraki komut |
| DS Data Segment | Değişkenler ve veriler |
| SS Stack Segment | Yığın; SS:SP, SS:BP |
| ES Extra Segment | Ek veri; dizgi hedefi ES:DI |
- Kesim yazmacına anlık değer doğrudan yüklenemez:
MOV DS, 2000hgeçersiz; önceMOV AX, 2000h, sonraMOV 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, DSgeç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.
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)
16 bitlik yazmacın yalnızca 9 biti kullanılır. MOV komutları bayrakları değiştirmez.
Yazmaçlar
Durum Bayrakları
| Bayrak | Bit | 1 olur, eğer… | Örnek (8 bit) |
|---|---|---|---|
| CF taşıma (carry) | 0 | işaretsiz işlemde en üst bitten elde/ödünç çıktıysa | FFh + 01h = 00h → CF=1 |
| PF eşlik (parity) | 2 | sonucun alt baytındaki 1 sayısı çiftse | 03h (2 adet 1) → PF=1 |
| AF yardımcı (auxiliary) | 4 | bit 3'ten bit 4'e elde/ödünç olduysa (BCD için) | 0Fh + 01h → AF=1 |
| ZF sıfır (zero) | 6 | sonuç sıfırsa | 05h − 05h → ZF=1 |
| SF işaret (sign) | 7 | sonucun en üst biti 1 ise (negatif) | 80h → SF=1 |
| OF taşma (overflow) | 11 | işaretli sonuç sığmadıysa | 7Fh + 01h = 80h → OF=1 |
7Fh + 01h: işaretsiz 127+1=128 doğru (CF=0), işaretli +127+1 = −128 yanlış (OF=1).Yazmaçlar
Kontrol Bayrakları
| Bayrak | Görev | Ayarlama |
|---|---|---|
| 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 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
Bellek 1 MB: 00000h–FFFFFh. Bir kesim yazmacı ve bir bağıl konumdan 20 bitlik adres üreteceğiz.
Kesim yazmacı 1000h (16 bit).
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ı).
Bağıl konum F000h. En büyük bağıl konum FFFFh olduğundan kesim 10000h–1FFFFh aralığını (64 KB) kapsar.
Toplayıcı: 10000h + F000h = 1F000h. Bu 20 bitlik değer adres yoluna çıkar.
Kesimli Bellek
Adım Adım: CS:IP → Fiziksel Adres
CS = 4321h (4 hex hane = 16 bit).
× 10h = hex olarak sağa bir 0 eklemek (4 bit sola kaydırma): 43210h.
IP = 1000h sağa hizalanarak altına yazılır (en soldaki hane boş = 0).
Haneleri sağdan toplarız: 0+0, 1+0, 2+0, 3+1, 4+0 → 44210h. Elde oluşmadı.
CS = F000h, IP = FFF0h (8086'nın sıfırlama sonrası ilk komutunun adresi BIOS'ta).
F000h × 10h = F0000h.
IP = FFF0h sağa hizalanır.
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
- 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:offsetyazı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 adres | Hesap | Fiziksel adres |
|---|---|---|
1234h:0005h | 12340h + 0005h | 12345h |
1000h:2345h | 10000h + 2345h | 12345h |
1200h:0345h | 12000h + 0345h | 12345h |
0234h:FFF5h | 02340h + FFF5h | 12335h (dikkat: farklı!) |
FFFFh:0010h | FFFF0h + 0010h = 100000h | 00000h (8086'da 20 bite sarar) |
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ü | Kesim | Offset kaynağı | Değiştirilebilir mi? |
|---|---|---|---|
| Komut getirme | CS | IP | hayır |
| Yığın işlemleri (PUSH, POP, CALL, RET) | SS | SP | hayır |
BP ile adresleme [BP+…] | SS | etkin adres | evet: DS:[BP] |
Genel veri [BX], [SI], [DI], [1234h] | DS | etkin adres | evet: ES:[BX] |
| Dizgi kaynağı (MOVSB, LODSB) | DS | SI | evet |
| Dizgi hedefi (MOVSB, STOSB) | ES | DI | hayı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.
Özet
Özet
16 bit veri yolu ve yazmaçlar, 20 bit adres yolu → 1 MB. CISC, değişken uzunlukta komutlar.
BIU getirir ve adres üretir; EU çözer ve yürütür. 6 baytlık FIFO kuyruk ile ikisi paralel çalışır.
AX, BX, CX, DX · SP, BP, SI, DI · CS, DS, SS, ES · IP, FLAGS.
Durum: CF, PF, AF, ZF, SF, OF. Kontrol: TF, IF, DF.
FA = kesim × 10h + offset. Kesim ≤ 64 KB, paragraf sınırında başlar, kesimler çakışabilir.
IP'ye yeni değer yükler ve önden getirme kuyruğunu temizler.
Özet
Alıştırmalar
- CS =
2F00h, IP =01A4hise sonraki komutun fiziksel adresi nedir? 3A2C5hfiziksel adresini normalleştirilmişkesim:offsetbiçiminde yazın; DS =3000hise offset ne olmalıdır?- AX =
80FFhikenADD AL, 1sonrası AX, CF, ZF, SF, OF ne olur? MOV DS, 1000hneden derlenmez? Doğru yazımı verin.- Kuyrukta 6 bayt varken EU bir
JMPyürütürse kuyruğa ne olur? Neden? - 8086 bir komutu getirirken aynı anda başka komutu yürütebilir mi? Hangi birimler sayesinde?
İpuçları / cevaplar
- 2F000h + 01A4h = 2F1A4h.
3A2Ch:0005h; DS = 3000h ise offset = 3A2C5h − 30000h = A2C5h.- AL: FFh + 1 = 00h → AX = 8000h; CF=1, ZF=1, SF=0, OF=0 (−1 + 1 = 0 doğru).
- Kesim yazmacına anlık değer yüklenemez:
MOV AX, 1000h+MOV DS, AX. - Kuyruk temizlenir; önceden getirilen baytlar atlamanın hedefinden değil, sıradaki adreslerden gelmiştir.
- 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.