Bölüm 2: 8086 Yazmaçlar

Mikroişlemciler
Yazmaç kümesiAX · BX · CX · DXSP · BP · SI · DIKesim yazmaçları ve IPBayrak yazmacıDurum ve kontrol bayraklarıAdresleme modlarıEtkin ve fiziksel adres
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Yazmaç kümesi

8086'nın 14 yazmacını gruplarına göre sayabilmek ve 8/16 bitlik kullanımını açıklamak.

Özel görevler

AX, BX, CX, DX, SP, BP, SI, DI yazmaçlarının komutlardaki örtük (implicit) görevlerini bilmek.

Bayraklar

Bir işlemden sonra CF, ZF, SF, OF, PF, AF bayraklarını elle hesaplayabilmek.

Adresleme

Adresleme modlarını tanımak; etkin adres (EA) ve fiziksel adresi hesaplamak.

Yazmaç Kümesi

Yazmaç Nedir?

  • Yazmaç (register): işlemcinin içinde bulunan, çok hızlı, küçük bellek hücresidir.
  • 8086'da yazmaçlar 16 bit genişliğindedir; dört tanesi ayrıca 8 bitlik iki yarıya bölünebilir.
  • Bellek erişimi dış veri yolu üzerinden birkaç saat çevrimi sürer; yazmaç erişimi neredeyse bedavadır.
  • Geçici veriler, adresler, sayaçlar ve işlem sonuçları yazmaçlarda tutulur.
  • Komutların çoğu en az bir işleneni yazmaçta ister: 8086'da bellekten belleğe MOV/ADD yoktur.
CPUAXBX…≈ 1 çevrimBellekveri yolu4+ çevrim
8086'da 14 yazmaç vardır: 4 genel amaçlı veri yazmacı, 4 işaretçi/indis yazmacı, 4 kesim yazmacı, komut işaretçisi (IP) ve bayrak yazmacı.

Yazmaç Kümesi

8086 Yazmaç Kümesi

Genel amaçlı (veri) yazmaçları15870AXAHALakümülatörBXBHBLtabanCXCHCLsayaçDXDHDLveriİşaretçi ve indis yazmaçlarıSPyığın işaretçisiBPtaban işaretçisiSIkaynak indisDIhedef indisKesim (segment) yazmaçlarıCSkodDSveriSSyığınESekstraÖzel yazmaçlarIPkomut işaretçisiFLAGSbayrak yazmacı

Hepsi 16 bittir. Yalnızca AX, BX, CX ve DX ikiye bölünebilir (AH/AL …); SP, BP, SI, DI ve kesim yazmaçlarının 8 bitlik parçası yoktur. Kaynak sunum, AX…DI sekizlisini genel amaçlı yazmaçlar olarak sayar.

Yazmaç Kümesi

Genel Amaçlı Yazmaçlar

Geçici verileri saklamak için kullanılırlar (general purpose registers). Çoğu komutta herhangi biri kullanılabilir; ancak bazı komutlar belirli bir yazmacı örtük olarak kullanır.

YazmaçAd8 bitlik yarılarÖrtük kullanım (örnek)
AXAccumulatorAH, ALMUL, DIV, IN, OUT, LODS/STOS
BXBaseBH, BLbellek adresleme [BX], XLAT
CXCounterCH, CLLOOP, REP, kaydırma sayısı CL
DXDataDH, DLMUL/DIV yüksek yarısı, port adresi
SPStack Pointer—PUSH, POP, CALL, RET
BPBase Pointer—yığın çerçevesi [BP+n]
SISource Index—dize kaynağı DS:SI
DIDestination Index—dize hedefi ES:DI

Yazmaç Kümesi · Kodu adım adım çalıştır

AX = AH : AL — 8 ve 16 Bitlik Kullanım

MOV AX, 1234h   ; AH=12h, AL=34h
MOV AL, 0FFh    ; yalnız alt yarı
ADD AL, 1       ; 8 bitlik toplama
MOV AX, 12FFh
ADD AX, 1       ; 16 bitlik toplama

Bir 8 bitlik yarıya yazmak diğer yarıyı değiştirmez. 8 bitlik işlemin eldesi komşu yarıya geçmez, CF bayrağına gider.

AXAH = 12hAL = 34h0001 00100011 0100150

AX'e 1234h yazılır: yüksek bayt AH = 12h, düşük bayt AL = 34h.

AXAH = 12hAL = FFh0001 00101111 1111150

Yalnızca AL değişir; AH korunur → AX = 12FFh.

AXAH = 12hAL = 00h0001 00100000 0000150

FFh + 1 = 100h, 8 bite sığmaz: AL = 00h, CF = 1, ZF = 1. Elde AH'ye geçmez; AX = 1200h.

AXAH = 12hAL = FFh0001 00101111 1111150

AX yeniden 12FFh yapılır.

AXAH = 13hAL = 00h0001 00110000 0000150

Bu kez işlem 16 bitlik: 12FFh + 1 = 1300h; elde AH'ye geçti, CF = 0.

Genel Amaçlı Yazmaçlar

AX — Akümülatör

  • 16 bit genişliğindedir; AH (yüksek sıra) ve AL (düşük sıra) olarak 8 bitlik iki bölüme ayrılır.
  • 8 bitlik komutlarda AH ve AL ayrı ayrı kullanılabilir.
  • Genellikle aritmetik ve mantıksal komutlarda kullanılır.
  • Bazı komutlar AX/AL'yi örtük kullanır: MUL, DIV, IN/OUT, CBW, DAA, LODSB/STOSB.
  • AX ile çalışan birçok komutun makine kodu bir bayt daha kısadır (ör. ADD AX, imm16).
ADD AX, AX     ; AX = AX + AX
MOV AX, 0005h
ADD AX, AX     ; AX = 000Ah
MOV AH, 4Ch    ; DOS: programı bitir
INT 21h

AX'i kendisiyle toplamak, değeri 2 ile çarpmakla aynıdır.

Genel Amaçlı Yazmaçlar

BX — Taban (Base)

  • 16 bit; BH ve BL olarak 8 bitlik iki yarıya ayrılır.
  • Dolaylı bellek adreslemede bağıl konum (offset) değerini tutabilen tek veri yazmacıdır: [BX], [BX+SI], [BX+4].
  • Dizi ve tablo (matris) işlemlerinde başlangıç adresini tutmak için kullanılır.
  • [AX], [CX], [DX] biçiminde adresleme 8086'da yoktur.
DS kesimi3Ah04FFh25h0500h17h0501h9Ch0502hBL = 25hMOV BL, [0500h]
Düzeltme: MOV BL, [500h] BL'ye 500h sayısını yazmaz; DS:0500h adresindeki baytı okur. Sayıyı yazmak için köşeli parantez kullanılmaz: MOV BX, 0500h.

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

BX ile Dolaylı Erişim

MOV BX, 0500h     ; BX = adres
MOV AL, [BX]      ; AL = [0500h]
MOV DL, [0501h]   ; doğrudan adres
ADD AL, DL        ; AL = 25h + 17h
MOV [BX+2], AL    ; [0502h] = AL
25h0500h17h0501h00h0502h9Ch0503hBX

BX'e 0500h sayısı yazılır; artık BX bir adres (işaretçi) olarak kullanılabilir.

25h0500h17h0501h00h0502h9Ch0503hBX

[BX]: BX'in gösterdiği bayt okunur → AL = 25h.

25h0500h17h0501h00h0502h9Ch0503hBX

Aynı türden erişim adres sabit verilerek de yapılabilir: DL = [0501h] = 17h.

25h0500h17h0501h00h0502h9Ch0503hBX

AL = 25h + 17h = 3Ch.

25h0500h17h0501h3Ch0502h9Ch0503hBX

[BX+2] = 0502h adresine AL yazılır. Bellek değişti, BX değişmedi.

Genel Amaçlı Yazmaçlar

CX — Sayaç (Counter)

  • 16 bit; CH ve CL olarak 8 bitlik iki yarıya ayrılır.
  • Döngü (LOOP), tekrar (REP) ve sayma görevlerinde kullanılır.
  • LOOP etiket: önce CX ← CX − 1, sonra CX ≠ 0 ise etikete atlar. Bayrakları etkilemez.
  • Kaydırma ve döndürme (shift/rotate) komutlarında sayı 1'den büyükse CL'de verilir: SHL AX, CL.
  • JCXZ: CX = 0 ise atla (boş döngüyü korur).
MOV CX, 0005h   ; 5 tur
DONGU:
  ; ... gövde ...
  LOOP DONGU     ; CX--, CX≠0 ise atla
Tuzak: CX = 0 iken döngüye girilirse ilk LOOP CX'i FFFFh yapar ve döngü 65536 kez döner.

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

CX ve LOOP: 5 + 4 + 3 + 2 + 1

MOV CX, 5          ; sayaç
MOV AX, 0          ; toplam
TEKRAR: ADD AX, CX
LOOP TEKRAR        ; CX--, ≠0 ise atla
MOV DX, AX         ; sonuç

Döngü gövdesi CX = 5, 4, 3, 2, 1 değerleriyle çalışır; CX = 0 değeriyle çalışmaz.

CX = 5: döngü 5 kez dönecek.

Toplam AX = 0 ile başlar.

AX = AX + CX → 0 + 5 = 5.

LOOP: CX = 5 → 4; sıfır değil, TEKRAR'a atla.

AX = AX + CX → 5 + 4 = 9.

LOOP: CX = 4 → 3; sıfır değil, TEKRAR'a atla.

AX = AX + CX → 9 + 3 = 12.

LOOP: CX = 3 → 2; sıfır değil, TEKRAR'a atla.

AX = AX + CX → 12 + 2 = 14.

LOOP: CX = 2 → 1; sıfır değil, TEKRAR'a atla.

AX = AX + CX → 14 + 1 = 15.

LOOP: CX = 1 → 0; atlamaz, döngüden çıkılır.

Sonuç DX'e kopyalanır: 5+4+3+2+1 = 15 = 000Fh.

Genel Amaçlı Yazmaçlar

DX — Veri (Data)

  • 16 bit; DH ve DL olarak 8 bitlik iki yarıya ayrılır.
  • 16 bitlik çarpmada sonuç 32 bittir: DX yüksek sırayı, AX düşük sırayı tutar → DX:AX.
  • 16 bitlik bölmede bölünen DX:AX'tir; bölüm AX'e, kalan DX'e yazılır.
  • 255'ten büyük giriş/çıkış port numaraları DX ile verilir: OUT DX, AL.
  • DOS kesmelerinde (INT 21h) dize adresini taşır: LEA DX, mesaj.
MUL BX (16 bit × 16 bit)AX×BXDX (yüksek)AX (düşük)32 bitlik çarpım
Kaynak örneği: MUL BX → DX:AX = AX × BX. 8 bitlik MUL BL ise AX = AL × BL üretir; DX'e dokunmaz.

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

MUL ile DX:AX

MOV AX, 1234h
MOV BX, 0100h
MUL BX          ; DX:AX = AX*BX
MOV AX, 00FFh
MOV BL, 2
MUL BL          ; AX = AL*BL
MOV DX, 03F8h   ; port adresi
OUT DX, AL      ; porta yaz

MUL işaretsiz çarpmadır; işaretli için IMUL kullanılır. MUL sonrası SF, ZF, PF, AF tanımsızdır.

AX = 1234h.

BX = 0100h (256).

1234h × 0100h = 00123400h → DX = 0012h, AX = 3400h. Yüksek yarı sıfır olmadığı için CF = OF = 1.

AX = 00FFh; DX'teki eski sonuç duruyor.

BL = 02h (BX = 0102h, BH değişmedi).

8 bitlik çarpım: FFh × 02h = 01FEh → AX. DX değişmez; AH ≠ 0 olduğundan CF = OF = 1.

DX bu kez port numarası: 03F8h (COM1 seri port).

AL'deki FEh, 03F8h numaralı porta gönderilir. 255'ten büyük port için DX şarttır.

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

SP — Yığın İşaretçisi

  • 16 bitlik Stack Pointer; yığının en üst öğesinin bağıl konumunu (offset) tutar.
  • Adres her zaman yığın kesimine göredir: fiziksel adres SS:SP.
  • Yığın LIFO yapısıdır: PUSH ile eklenir, POP ile çıkarılır; 8086'da öğeler hep 16 bittir.
  • Yığın belleğin aşağısına doğru büyür: PUSH önce SP'yi 2 azaltır, sonra yazar; POP önce okur, sonra SP'yi 2 artırır.
  • Kaynaktaki “yığın boşken SP = FFFEh” bilgisi .COM programları içindir (DOS/emu8086 SP'yi FFFEh yapar); genel kural değildir.
SS kesimiFFF6hFFF8hFFFAhFFFCh2222hFFFEh1111hSPbüyüme yönü

İşaretçi ve İndis Yazmaçları · Kodu adım adım çalıştır

PUSH / POP ile SP

MOV AX, 1111h
MOV BX, 2222h
PUSH AX        ; SP-=2, [SP]=AX
PUSH BX
POP AX         ; AX=[SP], SP+=2
POP BX         ; değerler takas oldu
FFFEh(dip)FFFChFFFAhSP = FFFEh

AX = 1111h. Yığın boş: SP = FFFEh (.COM programı).

FFFEh(dip)FFFChFFFAhSP = FFFEh

BX = 2222h.

FFFEh(dip)FFFCh1111hFFFAhSP = FFFCh

PUSH AX: SP = FFFEh − 2 = FFFCh, sonra [FFFCh] = 1111h.

FFFEh(dip)FFFCh1111hFFFAh2222hSP = FFFAh

PUSH BX: SP = FFFAh, [FFFAh] = 2222h. En üstte 2222h var.

FFFEh(dip)FFFCh1111hFFFAh2222hSP = FFFCh

POP AX: en üstteki 2222h AX'e okunur, SP = FFFCh. Eski hücredeki veri silinmez, sadece geçersiz sayılır.

FFFEh(dip)FFFCh1111hFFFAh2222hSP = FFFEh

POP BX: 1111h BX'e, SP = FFFEh. LIFO sayesinde AX ile BX takas edildi.

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

BP — Taban İşaretçisi

  • 16 bitlik Base Pointer; yığın üzerindeki sabit bir konumu gösterir.
  • BP ile yapılan bellek erişimleri varsayılan olarak SS kesimini kullanır: [BP+4] → SS:BP+4.
  • Yığın üzerinden fonksiyonlara (prosedürlere) geçirilen parametrelere ve yerel değişkenlere erişmek için kullanılır.
  • SP, PUSH/POP ile sürekli değişir; BP ise prosedür boyunca sabit kalır, bu yüzden parametrelerin konumu bellidir.
TOPLA PROC
  PUSH BP
  MOV  BP, SP     ; çerçeve tabanı
  MOV  AX, [BP+4] ; 1. parametre
  POP  BP
  RET  2
TOPLA ENDP

Klasik prosedür girişi: PUSH BP + MOV BP, SP.

İşaretçi ve İndis Yazmaçları · Adım adım

BP ile Parametreye Erişim

FFFEhFFFChFFFAhFFF8hSP

Başlangıç: yığın boş, SP = FFFEh. Çağıran, parametre olarak AX = 0007h'yi geçirecek.

FFFEhFFFCh0007hparametreFFFAhFFF8hSP

PUSH AX: parametre yığına konur; SP = FFFCh.

FFFEhFFFCh0007hparametreFFFAh0105hdönüş adresiFFF8hSP

CALL TOPLA: dönüş adresi (sonraki komutun IP'si, ör. 0105h) yığına konur; SP = FFFAh.

FFFEhFFFCh0007hparametreFFFAh0105hdönüş adresiFFF8h0000heski BPSP

PUSH BP: çağıranın BP değeri saklanır; SP = FFF8h.

FFFEhFFFCh0007hparametreFFFAh0105hdönüş adresiFFF8h0000heski BPSPBP

MOV BP, SP: BP = FFF8h. Bundan sonra SP değişse de BP sabit kalır.

FFFEhFFFCh0007hparametreFFFAh0105hdönüş adresiFFF8h0000heski BPSPBP[BP+4][BP+2][BP]

MOV AX, [BP+4]: FFF8h + 4 = FFFCh → parametre 0007h okunur. [BP+2] dönüş adresidir.

Prosedürler ve CALL/RET ayrıntısı Bölüm 7 ve 8'de; burada BP'nin neden gerektiği gösteriliyor.

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

SI ve DI — İndis Yazmaçları

SI — Source Index (kaynak indis)
  • 16 bit; veri kesiminde (DS) bağıl konumu temsil eder.
  • Okunacak verinin konumunu işaret eder.
  • Dize komutlarında kaynak: MOVSB, CMPSB, LODSB → DS:SI.
  • Örnek: MOV SI, 2000h — SI'yi bir bellek konumuna ayarlar.
DI — Destination Index (hedef indis)
  • 16 bit; dize komutlarında ekstra kesimde (ES) bağıl konumu temsil eder.
  • Yazılacak verinin konumunu işaret eder.
  • Dize komutlarında hedef: MOVSW, STOSB, SCASB → ES:DI.
  • Örnek: MOV DI, 3000h — DI'yi bir bellek konumuna ayarlar.
Dize komutu dışında [SI] ve [DI] sıradan indis olarak DS kesimini kullanır. Her dize adımından sonra SI ve DI, DF bayrağına göre 1 (bayt) ya da 2 (word) artar veya azalır.

İşaretçi ve İndis Yazmaçları · Kodu adım adım çalıştır

SI ve DI ile Dize Kopyalama

CLD              ; DF=0: artan adres
MOV SI, 0200h    ; kaynak
MOV DI, 0300h    ; hedef
MOV CX, 3        ; bayt sayısı
REP MOVSB        ; ES:[DI] ← DS:[SI]
0200h'A''B''C'—kaynak0300h————hedef

CLD: DF = 0 → SI ve DI her adımda artacak.

0200h'A''B''C'—SIkaynak0300h————hedef

SI = 0200h: kopyalanacak “ABC” dizesinin başı.

0200h'A''B''C'—SIkaynak0300h————DIhedef

DI = 0300h: hedef alanın başı.

0200h'A''B''C'—SIkaynak0300h————DIhedef

CX = 3: REP en fazla 3 kez tekrarlar.

0200h'A''B''C'—SIkaynak0300h'A'———DIhedef

1. tur: 'A' kopyalanır; SI = 0201h, DI = 0301h, CX = 2.

0200h'A''B''C'—SIkaynak0300h'A''B'——DIhedef

2. tur: 'B' kopyalanır; SI = 0202h, DI = 0302h, CX = 1.

0200h'A''B''C'—SIkaynak0300h'A''B''C'—DIhedef

3. tur: 'C' kopyalanır; CX = 0 → REP biter.

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

Kesim Yazmaçları ve IP

  • CS (kod), DS (veri), SS (yığın), ES (ekstra): her biri 64 KB'lık bir kesimin başlangıcını tutar.
  • IP (Instruction Pointer): CS içinde çalıştırılacak sonraki komutun bağıl konumu.
  • IP'ye MOV ile yazılamaz; yalnızca JMP, CALL, RET, kesmeler değiştirir.
  • Kesim yazmacına dolaysız değer yüklenemez: MOV DS, AX gerekir.
ÇiftKullanım
CS:IPsonraki komut
SS:SPyığının üstü
SS:BPyığın çerçevesi
DS:BX, DS:SI, DS:DIveri
DS:SI → ES:DIdize komutları
Fiziksel adres (20 bit) = kesim × 16 + bağıl konum. 16 ile çarpmak, onaltılı sayının sonuna bir 0 eklemektir.

İşaretçi ve İndis Yazmaçları · Adım adım

Fiziksel Adres Hesabı

DS = 2000hBX = 0500hMOV AL, [BX]

Komut [BX] ile DS kesimindeki bir bayta erişmek istiyor.

DS = 2000hBX = 0500hMOV AL, [BX]20000hkesim × 16

Kesim değeri 16 ile çarpılır (onaltılıda sonuna 0 eklenir): 2000h → 20000h.

DS = 2000hBX = 0500hMOV AL, [BX]20000hkesim × 16+ 0500hbağıl konum (EA)

Bağıl konum (BX = 0500h) eklenir.

DS = 2000hBX = 0500hMOV AL, [BX]20000hkesim × 16+ 0500hbağıl konum (EA)20500h20 bitlik fiziksel adres

Fiziksel adres = 20500h. Bu 20 bitlik değer adres yoluna (A0–A19) konur.

Farklı kesim:konum çiftleri aynı fiziksel adresi verebilir: 2000h:0500h = 2050h:0000h = 1FF0h:0600h = 20500h.

Bayrak Yazmacı

Bayrak Yazmacı

  • Durum yazmacı (status / FLAGS) olarak da adlandırılır; 16 bitlik yazmacın 9 biti kullanılır.
  • Mikroişlemcinin yürüttüğü son aritmetik/mantık komutunun sonucu hakkında bilgi içerir.
  • Koşullu atlama ve dallanma komutlarının (JZ, JC, JG …) davranışını belirler.
0CF1–2PF3–4AF5–6ZF7SF8TF9IF10DF11OF12–13–14–15–durum bayrağı (sonuçtan etkilenir)kontrol bayrağı (programcı ayarlar)
6 durum bayrağıCF, PF, AF, ZF, SF, OF: işlem sonucuna göre donanım tarafından kurulur (1) ya da temizlenir (0).
3 kontrol bayrağıDF, IF, TF: işlemcinin çalışma biçimini değiştirir; programcı CLD/STD, CLI/STI gibi komutlarla ayarlar.

Bayrak Yazmacı

SF — İşaret Bayrağı

  • Sign Flag, işlem sonucunun negatif mi pozitif mi olduğunu belirtir.
  • Sonucun en önemli biti (MSB) kopyalanır:
  • MSB = 1 → sayı (işaretli yorumda) negatiftir → SF = 1.
  • MSB = 0 → sayı pozitif ya da sıfırdır → SF = 0.
  • 8 bitte MSB bit 7, 16 bitte bit 15'tir.
Sonuç (8 bit)MSBSF
00h … 7Fh00
80h … FFh11
35h = 0011 0101b00
C2h = 1100 0010b11
İşlemci sayının işaretli mi işaretsiz mi olduğunu bilmez; SF yalnızca MSB'nin kopyasıdır. Sonucu işaretli yorumlamak programcının işidir (Bölüm 3: 2'ye tümleyen).

Bayrak Yazmacı

ZF ve PF

ZF — Sıfır Bayrağı (Zero)
  • İşlem sonucunun sıfır olup olmadığını belirtir.
  • Sonuç 0 ise ZF = 1; değilse ZF = 0.
  • CMP AX, BX eşitlikte ZF = 1 yapar → JE/JZ atlar.
  • Örnek: SUB AL, AL → AL = 00h, ZF = 1.
PF — Çiftlik Bayrağı (Parity)
  • Sonucun düşük 8 bitindeki 1'lerin sayısı çift ise PF = 1; tek ise PF = 0.
  • 16 bitlik işlemde de yalnızca düşük bayta bakılır.
  • Örnek: 03h = 0000 0011b → iki 1 → PF = 1.
  • Örnek: 07h = 0000 0111b → üç 1 → PF = 0.
Dikkat: ZF = 1 “sonuç sıfır” demektir; bayrağın değeri ile sonucun değeri ters görünür. PF eskiden seri iletişimde hata denetimi için kullanılırdı.

Bayrak Yazmacı

AF — Yardımcı Taşıma Bayrağı

  • Auxiliary Carry Flag: işlem sırasında bit 3'ten bit 4'e elde (toplamada) ya da borç (çıkarmada) oluşursa AF = 1; aksi hâlde 0.
  • Yani düşük nibble'dan (4 bit) taşma olup olmadığını gösterir.
  • BCD (Binary Coded Decimal, her basamak 0–9) aritmetiğine özgüdür: DAA, DAS, AAA, AAS bu bayrağı kullanır.
0000 100008h+ 0000 100109h0001 000111h↑ bit 3 → bit 4 eldesiAF = 1 → DAA ile 17h (BCD 17)
Düzeltme: Kaynak AF için “programcının doğrudan erişemediği tek bayrak” diyor. Doğrusu: AF'yi test eden koşullu atlama komutu yoktur ve AF'yi doğrudan kuran/silen komut yoktur; yine de LAHF, PUSHF ile okunabilir, SAHF, POPF ile yazılabilir.

Bayrak Yazmacı

CF — Taşıma (Elde) Bayrağı

  • Carry Flag: n bitlik işlemde sonuç n bite sığmazsa (MSB'den elde çıkarsa) CF = 1; aksi hâlde 0.
  • Çıkarmada borç (küçükten büyük çıkarma) olursa da CF = 1 olur.
  • İşaretsiz sayılar için taşma göstergesidir.
  • Kaydırma/döndürme komutlarında dışarı atılan bit CF'ye gider.
  • Programcı da değiştirebilir: STC (1), CLC (0), CMC (tersle).
  • Çok baytlı toplamada ADC bu eldeyi bir sonraki bayta taşır.
İşlem (8 bit)SonuçCF
FFh + 01h00h1
80h + 80h00h1
70h + 10h80h0
05h − 07hFEh1 (borç)
07h − 05h02h0

Bayrak Yazmacı

OF — Taşma Bayrağı

  • Overflow Flag: sonuç, işaretli olarak yorumlandığında kullanılan bit sayısına sığmıyorsa OF = 1; aksi hâlde 0.
  • 8 bitte işaretli aralık −128 … +127, 16 bitte −32768 … +32767'dir.
  • Kural (toplama): iki pozitif toplanıp negatif, ya da iki negatif toplanıp pozitif sonuç çıkarsa OF = 1. Farklı işaretli sayıların toplamı asla taşmaz.
  • Donanımca: MSB'ye giren elde ile MSB'den çıkan elde farklıysa OF = 1.
İşlem (8 bit)İşaretsiz yorumİşaretli yorumSonuçCFOF
05h + 03h5 + 3 = 85 + 3 = 808h00
7Fh + 01h127 + 1 = 128127 + 1 ≠ −12880h01
FFh + 01h255 + 1 ≠ 0−1 + 1 = 000h10
80h + 80h128 + 128 ≠ 0−128 + (−128) ≠ 000h11

CF işaretsiz taşmayı, OF işaretli taşmayı gösterir; ikisi birbirinden bağımsızdır.

Bayrak Yazmacı · Adım adım

Bayrakları Elle Hesaplamak: 6Ah + 5Ch

bit 7 … 0elde6Ah01101010+5Ch01011100

MOV AL, 6Ah / ADD AL, 5Ch: iki sayı ikili yazılır ve sağdan sola toplanır.

bit 7 … 0elde0006Ah01101010+5Ch010111000110AF = 1bit 3 → 4 elde var

Düşük nibble: 1010 + 1100 = 1 0110 → bit 3'ten bit 4'e elde geçer → AF = 1.

bit 7 … 0elde11110006Ah01101010+5Ch0101110011000110C6hAF = 1bit 3 → 4 elde varCF = 0bit 7'den elde çıkmadıOF = 1bit 7'ye giren 1 ≠ çıkan 0

Yüksek nibble eldeyle toplanır: sonuç C6h. Bit 7'den elde çıkmadı → CF = 0; bit 7'ye 1 girdi ama 0 çıktı → OF = 1 (106 + 92 = 198 > 127).

bit 7 … 0elde11110006Ah01101010+5Ch0101110011000110C6hAF = 1bit 3 → 4 elde varCF = 0bit 7'den elde çıkmadıOF = 1bit 7'ye giren 1 ≠ çıkan 0SF = 1MSB = 1ZF = 0sonuç ≠ 0PF = 11100 0110: dört 1

Sonuçtan: MSB = 1 → SF = 1; sonuç sıfır değil → ZF = 0; 1'lerin sayısı 4 (çift) → PF = 1.

İşaretsiz yorum: 106 + 92 = 198 doğru (CF = 0). İşaretli yorum: +106 + (+92) = −58 görünür → yanlış, çünkü OF = 1.

Bayrak Yazmacı · Etkileşimli

Bayrak Hesaplayıcı: ADD / SUB / AND / INC

Onaltılı değer gir (ör. 7F ve 01, FF ve 01, 80 ve 80). INC A, CF bayrağını değiştirmez; AND ise CF = OF = 0 yapar (AF tanımsızdır).

Bayrak Yazmacı · Kodu adım adım çalıştır

Bayrak İzleme

MOV AL, 7Fh
ADD AL, 1      ; 7Fh+1
ADD AL, 80h    ; 80h+80h
SUB AL, 1      ; 00h-1
INC AL         ; FFh+1
CMP AL, 0      ; çıkar, sakla

AL = 7Fh (+127). MOV bayrakları etkilemez.

7Fh + 1 = 80h: SF = 1, OF = 1 (+127 + 1 işaretli aralığı aştı), AF = 1 (F + 1), CF = 0.

80h + 80h = 100h → AL = 00h: CF = 1, ZF = 1, OF = 1 (iki negatifin toplamı pozitif çıktı).

00h − 1 = FFh: borç → CF = 1, SF = 1, AF = 1; işaretli 0 − 1 = −1 doğru → OF = 0.

FFh + 1 = 00h: ZF = 1. Dikkat: INC/DEC CF'yi değiştirmez, CF önceki komuttan 1 kaldı.

CMP, AL − 0 hesaplar ama sonucu yazmaz: ZF = 1 (eşit), CF = 0.

Bayrak Yazmacı

DF — Yön Bayrağı

  • Direction Flag, dize (string) komutlarında veri erişim yönünü belirler.
  • DF = 0: düşük adresten yükseğe; her adımda SI/DI artar.
  • DF = 1: yüksek adresten düşüğe; SI/DI azalır.
  • Adım büyüklüğü bayt komutlarında 1, word komutlarında 2'dir.
  • CLD → DF = 0, STD → DF = 1.
  • Üst üste binen alanları kopyalarken yön önemlidir: hedef kaynağın ilerisindeyse sondan başa (STD) kopyalanır.
CLD (DF = 0)100101102103104SI, DI ++STD (DF = 1)100101102103104SI, DI −−

Bayrak Yazmacı

IF ve TF

IF — Kesme Bayrağı (Interrupt)
  • Dış donanım kesmeleri (INTR girişi) ile ilişkilidir.
  • IF = 1: çevre birimlerinden gelen maskelenebilir kesme talepleri ele alınır.
  • IF = 0: bu talepler göz ardı edilir (maskelenir).
  • STI → IF = 1, CLI → IF = 0.
  • NMI (maskelenemeyen kesme) ve yazılım kesmeleri (INT n) IF'den etkilenmez.
TF — Tuzak Bayrağı (Trap)
  • Yonga içi hata ayıklama için kullanılır.
  • TF = 1: tek adım (single step) modu; her komuttan sonra dahili INT 1 kesmesi üretilir ve tek adım ISR'si (kesme hizmet yordamı) çalışır.
  • Böylece program komut komut incelenebilir (DEBUG, emu8086 “single step”).
  • TF = 0: normal çalışma.
  • Doğrudan komutu yoktur; PUSHF → bit 8'i değiştir → POPF.

Bayrak Yazmacı

Bayrakları Değiştiren Komutlar

KomutEtkiKomutEtki
CLCCF = 0CLDDF = 0
STCCF = 1STDDF = 1
CMCCF = ¬CFCLI / STIIF = 0 / 1
LAHFAH ← SF ZF – AF – PF – CFSAHFAH → düşük bayrak baytı
PUSHFFLAGS'i yığına koyPOPFyığından FLAGS'e yükle
Komut grubuBayraklara etkisi
ADD, ADC, SUB, SBB, CMP, NEGCF, PF, AF, ZF, SF, OF hepsi güncellenir
INC, DECCF hariç hepsi güncellenir
AND, OR, XOR, TESTCF = OF = 0; PF, ZF, SF güncellenir; AF tanımsız
MOV, PUSH, POP, XCHG, LEA, LOOP, JMPbayrakları etkilemez

Adresleme Modları

Adresleme Modları

  • İşlenen verinin (operand) belirtilme yöntemine adresleme modu denir.
  • İşlenenin bir veri (immediate data) mi, bir yazmaç mı, yoksa bir bellek adresi mi olduğunu belirtir.
  • Bellek işlenenlerinde işlemci önce etkin adresi (EA, effective address = bağıl konum) hesaplar, sonra kesim yazmacıyla fiziksel adresi bulur.
komutMOV AL, [BX+SI+4]EA = BX + SI + 4etkin adres (16 bit)DS × 16 + EAfiziksel (20 bit)bellek

Adresleme Modları

Modlara Genel Bakış

ModÖrnekİşlenen / etkin adres
YazmaçMOV AX, BXyazmacın kendisi
Dolaysız (immediate)MOV CL, 0Ahkomutun içindeki sabit
Doğrudan (direct)MOV AX, [0500h]EA = sabit adres
Yazmaç dolaylıMOV AX, [SI]EA = BX, SI ya da DI
TabanMOV AL, [BP+0100h]EA = BX/BP + kaydırma
İndisMOV AX, [SI+2000h]EA = SI/DI + kaydırma
Taban indisliMOV AX, [BX+DI]EA = BX/BP + SI/DI
Taban indisli kaydırmaMOV AL, [BP+SI+2000h]EA = taban + indis + kaydırma
DizeMOVSBDS:SI → ES:DI, otomatik ±
Giriş/çıkışIN AL, 45hport numarası
GöreceliJNZ etiketIP = IP + işaretli kaydırma

Adresleme Modları

Yazmaç ve Dolaysız Mod

Yazmaç Modu (Register)
  • Her iki işlenen de yazmaçtır; bellek erişimi yoktur → en hızlı mod.
  • MOV AX, BX
  • XOR AX, DX
  • ADD AL, BL
  • İki işlenen aynı boyda olmalı: MOV AL, BX hatalıdır.
Dolaysız Mod (Immediate)
  • Kaynak işlenen komutun içinde verilen 8 ya da 16 bitlik sabittir.
  • MOV AX, 2000h
  • MOV CL, 0Ah
  • ADD AL, 45h
  • AND AX, 0000h
  • Hedef işlenen asla dolaysız olamaz: MOV 5, AL anlamsızdır.
Düzeltme: Kaynakta örnek olarak verilen MOV CS, AX geçerli bir komut değildir: CS, MOV ile değiştirilemez (yalnızca uzak JMP/CALL/RET/IRET ve kesmeler değiştirir). Kesim yazmacına sabit yüklemek için bir yazmaç gerekir: MOV AX, 2000h + MOV DS, AX.

Adresleme Modları

Geçersiz İşlenen Bileşimleri

Hatalı komutNeden?Doğrusu
MOV [SI], [DI]bellekten belleğe aktarım yokMOV AL, [DI] + MOV [SI], AL (ya da MOVSB)
MOV DS, 2000hkesim yazmacına sabit yüklenemezMOV AX, 2000h + MOV DS, AX
MOV ES, DSkesimden kesime aktarım yokPUSH DS + POP ES
MOV AL, BXboyutlar uyuşmuyorMOV AL, BL
MOV [BX], 5boyut belirsizMOV BYTE PTR [BX], 5
MOV AX, [CX]CX adresleme yazmacı değilMOV BX, CX + MOV AX, [BX]
MOV AX, [SI+DI]iki indis birlikte kullanılamazMOV BX, SI + MOV AX, [BX+DI]
MOV IP, AXIP doğrudan yazılamazJMP AX

Adresleme Modları

Doğrudan ve Yazmaç Dolaylı Mod

Doğrudan Mod (Displacement / Direct)
  • Etkin adres komut içinde doğrudan verilir.
  • MOV AX, [0500h]
  • MOV AX, [DISP] — DISP bir değişken adı ya da sabit adres.
  • Değişken adları da bu moddadır: MOV AL, sayi.
Yazmaç Dolaylı Mod (Register Indirect)
  • Etkin adres BX, SI ya da DI yazmacındadır.
  • MOV AX, [DI]
  • ADD AL, [BX]
  • MOV AX, [SI]
  • Fiziksel adres = kesim × 16 + etkin adres.
MOV AX, [0500h]EA0500hMOV AX, [SI]SI = 0600hEA0600h

Adresleme Modları

Taban ve İndis Modları

Taban Modu (Based)
  • EA = taban yazmacı (BX ya da BP) + kaydırma.
  • MOV AL, [BP+0100h]
  • MOV AX, [BX+4] — bir kaydın 4. baytındaki alan.
  • Kayıt/yapı alanlarına erişim için uygundur.
İndis Modu (Indexed)
  • EA = indis yazmacı (SI ya da DI) + kaydırma.
  • MOV AX, [SI+2000h]
  • MOV AL, [DI+3000h]
  • Kaydırma dizinin başlangıç adresi, indis eleman konumu olarak düşünülebilir: MOV AL, dizi[SI].
Taban İndisli Mod (Based Indexed)
  • EA = taban (BX/BP) + indis (SI/DI).
  • MOV AL, [BP+SI], MOV AX, [BX+DI]
  • İki boyutlu dizi: BX satır başı, SI sütun.
Taban İndisli Kaydırma Modu
  • EA = taban + indis + kaydırma.
  • MOV AL, [BP+SI+2000h]
  • Yığındaki yerel bir dizinin elemanı gibi karmaşık yapılara erişim.

Adresleme Modları

Etkin Adres Bileşimleri

tabanBXBP—indisSIDI—kaydırma8 bit16 bityok++EA =DSvarsayılanBP varsa SS
  • Her sütundan en fazla bir öğe seçilir; en az biri bulunmalıdır. Toplam 24 geçerli bileşim vardır (yalnız kaydırma = doğrudan mod).
  • BP içeren adresler varsayılan olarak SS, diğerleri DS kesimini kullanır.
  • Varsayılan kesim kesim önekiyle değiştirilebilir: MOV AL, ES:[BX], MOV AX, DS:[BP+2].
  • Kaydırma işaretli 8 bit (−128…+127) ya da 16 bit olabilir; toplam 16 bitte sarar (FFFFh + 1 = 0000h).

Adresleme Modları · Adım adım

Etkin ve Fiziksel Adres: [BX+SI+10h]

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h

Komut ve yazmaç değerleri. Adreste BP olmadığı için kesim DS.

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h0200hBX

Taban yazmacı BX = 0200h.

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h0200hBX+ 0030hSI

İndis yazmacı SI = 0030h eklenir.

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h0200hBX+ 0030hSI+ 0010hkaydırma

Komuttaki 8 bitlik kaydırma 10h eklenir.

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h0200hBX+ 0030hSI+ 0010hkaydırma0240hEA

Etkin adres EA = 0240h (16 bit).

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h0200hBX+ 0030hSI+ 0010hkaydırma0240hEA10000hDS × 16+ 0240h

DS × 16 = 10000h ile EA toplanır.

MOV AL, [BX+SI+10h]DS = 1000h BX = 0200h SI = 0030h0200hBX+ 0030hSI+ 0010hkaydırma0240hEA10000hDS × 16+ 0240h10240hfiziksel adres

Fiziksel adres = 10240h; AL bu adresteki baytı alır.

Adresleme Modları · Etkileşimli

Etkin / Fiziksel Adres Hesaplayıcı

Adresleme Modları · Kodu adım adım çalıştır

Modlar Bir Arada

MOV BX, 0200h       ; dolaysız
MOV SI, 2
MOV AL, [0200h]     ; doğrudan
MOV AH, [BX+1]      ; taban+kaydırma
ADD AL, [BX+SI]     ; taban+indis
MOV [BX+SI+2], AL   ; taban+indis+kayd.
MOV DX, AX          ; yazmaç
10h0200h20h0201h30h0202h00h0203h00h0204h

Dolaysız mod: BX = 0200h (sabit komutun içinde).

10h0200h20h0201h30h0202h00h0203h00h0204h

SI = 0002h.

10h0200h20h0201h30h0202h00h0203h00h0204h

Doğrudan mod: EA = 0200h → AL = 10h.

10h0200h20h0201h30h0202h00h0203h00h0204h

Taban + kaydırma: EA = BX + 1 = 0201h → AH = 20h; AX = 2010h.

10h0200h20h0201h30h0202h00h0203h00h0204h

Taban indisli: EA = BX + SI = 0202h → AL = 10h + 30h = 40h.

10h0200h20h0201h30h0202h00h0203h40h0204h

Taban indisli kaydırma: EA = 0200h + 2 + 2 = 0204h ← AL (40h).

10h0200h20h0201h30h0202h00h0203h40h0204h

Yazmaç modu: DX = AX = 2040h; bellek erişimi yok.

Adresleme Modları

Dize Modu

  • Dize (string) komutları ile ilgilidir; işlenenler örtüktür, komutta yazılmaz.
  • Kaynak DS:SI, hedef ES:DI.
  • Her işlemden sonra SI ve DI, yön bayrağına bağlı olarak otomatik artar (DF = 0) ya da azalır (DF = 1).
  • Örnekler: MOVSB (bayt), MOVSW (word, ±2).
  • REP öneki komutu CX kez tekrarlar; REPE/REPNE ZF'ye de bakar.
Komutİşlem
MOVSBES:[DI] ← DS:[SI]
CMPSBDS:[SI] − ES:[DI] (bayrak)
SCASBAL − ES:[DI]
LODSBAL ← DS:[SI]
STOSBES:[DI] ← AL
Kaynakta yazılan MOVS B / MOVS W, assembler'da bitişik yazılır: MOVSB, MOVSW.

Adresleme Modları

Giriş/Çıkış Modu

  • Giriş/çıkış (I/O) portlarına erişim içindir; 8086'nın bellekten ayrı 64 K'lık port adres alanı vardır.
  • Veri her zaman AL (8 bit) ya da AX (16 bit) üzerinden aktarılır.
  • Sabit port (0–255): port numarası komutta 8 bit olarak verilir.
  • Değişken port (0–65535): port numarası DX'te verilir.
IN  AL, 45h    ; port 45h → AL
OUT 50h, AL    ; AL → port 50h
MOV DX, 03F8h
IN  AL, DX     ; port 03F8h → AL
OUT DX, AX     ; AX → port 03F8h
Düzeltme: Kaynaktaki IN A, 45 ve OUT A, 50 yazımı 8085 tarzıdır. 8086'da doğrusu IN AL, 45h ve OUT 50h, AL — OUT'ta önce port, sonra veri yazmacı gelir.

Adresleme Modları · Adım adım

Göreceli Mod

  • Etkin adres, komut işaretçisine (IP) göre hesaplanır: komutta hedefin kendisi değil, uzaklığı bulunur.
  • Kısa koşullu atlamalar (JNZ, JC …) işaretli 8 bit kaydırma kullanır: −128 … +127 bayt.
  • Hesap, atlama komutundan sonraki komutun adresine göre yapılır: IP = IPsonraki + kaydırma.
00FChDEC CX00FDh…0100hJNZ 00FCh0102hMOV AX, 175 FAh

Döngünün sonundaki JNZ, 0100h adresinde 2 baytlık bir komuttur: 75h FAh.

00FChDEC CX00FDh…0100hJNZ 00FCh0102hMOV AX, 175 FAh

İşlemci JNZ'yi çalıştırırken IP zaten bir sonraki komutu gösterir.

00FChDEC CX00FDh…0100hJNZ 00FCh0102hMOV AX, 175 FAhIP (sonraki komut) = 0102h

IP = 0100h + 2 = 0102h.

00FChDEC CX00FDh…0100hJNZ 00FCh0102hMOV AX, 175 FAhIP (sonraki komut) = 0102hkaydırma FAh = −6

Kaydırma baytı FAh işaretli olarak −6'dır (Bölüm 3: 2'ye tümleyen).

00FChDEC CX00FDh…0100hJNZ 00FCh0102hMOV AX, 175 FAhIP (sonraki komut) = 0102hkaydırma FAh = −60102h + (−6) = 00FCh

ZF = 0 ise IP = 0102h − 6 = 00FCh: döngü başına dönülür. ZF = 1 ise IP 0102h'de kalır.

Özet

Özet

YazmaçlarAX, BX, CX, DX ikiye bölünebilen veri yazmaçlarıdır; SP/BP yığını, SI/DI dizeleri ve indisleri, CS/DS/SS/ES kesimleri, IP sonraki komutu tutar.
Örtük görevlerMUL/DIV → AX, DX · LOOP/REP → CX · [BX] → DS · [BP] → SS · dize → DS:SI, ES:DI · port → DX.
BayraklarCF işaretsiz, OF işaretli taşma; ZF sıfır; SF MSB; PF düşük baytın çiftliği; AF nibble eldesi. DF, IF, TF kontrol bayraklarıdır.
AdreslemeEA = [BX|BP] + [SI|DI] + kaydırma; fiziksel adres = kesim × 16 + EA. Bellekten belleğe ve kesime sabit aktarım yoktur.

Özet

Alıştırmalar

  1. AX = 3A7Fh iken MOV AL, 0 ve ardından INC AH çalışınca AX kaç olur?
  2. MOV AL, 9Ch / ADD AL, 64h sonrası AL, CF, ZF, SF, OF, PF değerlerini bulun.
  3. MOV AL, 50h / ADD AL, 50h: CF ve OF kaçtır? Neden farklılar?
  4. DS = 3000h, SS = 4000h, BX = 0100h, BP = 0020h, SI = 0008h için [BX+SI+4] ve [BP+SI] fiziksel adreslerini hesaplayın.
  5. SP = 0100h iken 3 PUSH ve 1 POP sonrası SP kaçtır?
  6. MOV CX, 0 ile başlayan bir LOOP döngüsü kaç kez döner?
  7. MOV [BX], [SI] neden derlenmez? İki komutla yazın.
Cevaplar
  1. MOV AL, 0 → 3A00h; INC AH → 3B00h.
  2. 9Ch + 64h = 100h → AL = 00h, CF = 1, ZF = 1, SF = 0, OF = 0 (−100 + 100 = 0), PF = 1, AF = 1.
  3. A0h: CF = 0 (80 + 80 = 160 ≤ 255), OF = 1 (+80 + +80 = +160 > 127).
  4. EA = 010Ch → 3010Ch; EA = 0028h, BP olduğundan SS → 40028h.
  5. 0100h − 6 + 2 = 00FCh.
  6. 65536 kez (ilk LOOP CX'i FFFFh yapar).
  7. Bellekten belleğe aktarım yok: MOV AL, [SI] + MOV [BX], AL.

Özet

Kaynaklar

  • Intel, The 8086 Family User's Manual, 1979.
  • Barry B. Brey, The Intel Microprocessors, 8. baskı, Pearson, 2009.
  • Muhammad Ali Mazidi, Janice G. Mazidi, The x86 PC: Assembly Language, Design, and Interfacing, 5. baskı, 2010.
  • emu8086 belgeleri: 8086 instructions ve Addressing modes bölümleri.
  • Mehmet Bodur, Mikroişlemcilere Giriş: Assembler ile Yazılım ve Arayüz.

Son

Bölüm 2: 8086 Yazmaçlar
Sonraki bölüm: Bölüm 3: Sayı Sistemleri
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.