Bölüm 2.2: 8086 Yazmaçları

Mikroişlemciler
Yazmaç kümesiAX · BX · CX · DXSP · BP · SI · DIKesim yazmaçları ve IPBayrak yazmacıDurum ve kontrol bayraklarıBayrakları değiştiren komutlar
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

CF, ZF, SF, OF, PF, AF bayraklarının hangi sonuçta kurulduğunu açıklamak; DF, IF, TF'nin işlemciyi nasıl yönettiğini bilmek.

Yazmaç çiftleri

CS:IP, SS:SP, SS:BP, DS:SI ve ES:DI çiftlerinin hangi erişimde kullanıldığını bilmek.

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 turu 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 turBellekveri yolu4+ tur
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 indisiDIhedef indisiKesim (segment) yazmaçlarıCSkodDSveriSSyığınESekÖ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. Bu derste AX…DI sekizlisi genel amaçlı yazmaçlar olarak sayılır.

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—dizgi kaynağı DS:SI
DIDestination Index—dizgi 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]
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
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 G/Ç port numaraları DX ile verilir: OUT DX, AL.
  • DOS kesmelerinde (INT 21h) dizgi adresini taşır: LEA DX, mesaj.
MUL BX (16 bit × 16 bit)AX×BXDX (yüksek)AX (düşük)32 bitlik çarpım
Örnek: 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.
  • “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ı

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ı

SI ve DI — İndis Yazmaçları

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

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

SI ve DI ile Dizgi 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” dizgisinin 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 (ek): 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 anlık 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:DIdizgi komutları
Fiziksel adres (20 bit) = kesim × 16 + bağıl konum. 16 ile çarpmak, onaltılık sayının sonuna bir 0 eklemektir: DS = 2000h, BX = 0500h ise [BX] → 20000h + 0500h = 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 ikiye tümleyen olarak (işaretli) yorumlamak programcının işidir.

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 — Eşlik 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.
03h000000112 tane 1 → çift → PF = 107h000001113 tane 1 → tek → PF = 0
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ı Elde Bayrağı

  • Auxiliary Carry Flag: işlem sırasında bit 3'ten bit 4'e elde (toplamada) ya da ödünç (çı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)
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 — Elde Bayrağı

  • Carry Flag: n bitlik işlemde sonuç n bite sığmazsa (MSB'den elde çıkarsa) CF = 1; aksi hâlde 0.
  • Çıkarmada ödünç (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 (ödünç)
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ı

DF — Yön Bayrağı

  • Direction Flag, dizgi (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, sözcük 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ı · Kodu adım adım çalıştır

Kod İzleme: DF = 1 ile Örtüşen Kopyalama

org 100h
mov si, offset dizi+3 ; kaynak
mov di, offset dizi+4 ; hedef
mov cx, 4
std                   ; DF = 1
rep movsb
cld
ret
dizi db 'KLMN', 0
dizi (010Eh–0112h)K010EhL010FhM0110hN0111h·0112hDF = 0 · CX = 0

“KLMN” bir sağa kaydırılacak; kaynak ve hedef örtüşüyor. SI = 0111h: kaynağın son baytı.

dizi (010Eh–0112h)K010EhL010FhM0110hN0111h·0112hSIDF = 0 · CX = 0

DI = 0112h: hedefin son baytı (bir sağda).

dizi (010Eh–0112h)K010EhL010FhM0110hN0111h·0112hSIDIDF = 0 · CX = 4

CX = 4 bayt kopyalanacak.

dizi (010Eh–0112h)K010EhL010FhM0110hN0111h·0112hSIDIDF = 1 · CX = 4

std: DF = 1; dizgi komutları SI ve DI'yi her adımda azaltacak.

dizi (010Eh–0112h)K010EhL010FhM0110hN0111hN0112hSIDIDF = 1 · CX = 3

MOVSB 1: [0111h] → [0112h] ('N'); SI, DI 1 azaldı, CX = 3.

dizi (010Eh–0112h)K010EhL010FhM0110hM0111hN0112hSIDIDF = 1 · CX = 2

MOVSB 2: [0110h] → [0111h] ('M'); SI, DI 1 azaldı, CX = 2.

dizi (010Eh–0112h)K010EhL010FhL0110hM0111hN0112hSIDIDF = 1 · CX = 1

MOVSB 3: [010Fh] → [0110h] ('L'); SI, DI 1 azaldı, CX = 1.

dizi (010Eh–0112h)K010EhK010FhL0110hM0111hN0112hSIDIDF = 1 · CX = 0

MOVSB 4: [010Eh] → [010Fh] ('K'); SI, DI 1 azaldı, CX = 0. Sonuç KKLMN: dizi doğru kaydı.

dizi (010Eh–0112h)K010EhK010FhL0110hM0111hN0112hSIDIDF = 0 · CX = 0

cld ile DF = 0'a dönülür. CLD ile baştan kopyalansaydı 'K' her bayta taşınır, sonuç KKKKK olurdu: örtüşen alanda hedef kaynağın ilerisindeyse geriye kopyalanır.

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.
komut yürütülürTF = 1 → INT 1FLAGS, CS, IP yığına; TF = 0tek adım yordamıIRET → sonraki komut

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

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

Kod İzleme: Bayrakları Okumak ve Yazmak

org 100h
mov al, 0FFh
add al, 1       ; CF ZF AF PF = 1
lahf            ; AH ← bayraklar
cmc             ; CF tersle
clc             ; CF = 0
stc             ; CF = 1
mov ah, 0C1h    ; 1100 0001b
sahf            ; bayraklar ← AH
ret
bayraklar (düşük bayt)SF0ZF0–0AF0–0PF0–1CF0AH00000000AH = 00h

AL = FFh. Bayrakların düşük baytı: SF ZF – AF – PF – CF.

bayraklar (düşük bayt)SF0ZF1–0AF1–0PF1–1CF1AH00000000AH = 00h

FFh + 1 = 00h: CF = 1, ZF = 1, AF = 1 (F + 1), PF = 1 (00h'de sıfır tane 1, çift).

bayraklar (düşük bayt)SF0ZF1–0AF1–0PF1–1CF1AH01010111AH = 57h

lahf: bayrakların düşük baytı AH'ye kopyalanır → AH = 57h = 0101 0111b (bit 1 her zaman 1).

bayraklar (düşük bayt)SF0ZF1–0AF1–0PF1–1CF0AH01010111AH = 57h

cmc: CF tersine döner, 1 → 0. Diğer bayraklar aynı.

bayraklar (düşük bayt)SF0ZF1–0AF1–0PF1–1CF0AH01010111AH = 57h

clc: CF = 0 (zaten 0'dı).

bayraklar (düşük bayt)SF0ZF1–0AF1–0PF1–1CF1AH01010111AH = 57h

stc: CF = 1. Çok baytlı ADC/SBB öncesi eldeyi hazırlamak için kullanılır.

bayraklar (düşük bayt)SF0ZF1–0AF1–0PF1–1CF1AH11000001AH = C1h

AH = C1h = 1100 0001b: bit 7 (SF), bit 6 (ZF), bit 0 (CF) = 1.

bayraklar (düşük bayt)SF1ZF1–0AF0–0PF0–1CF1AH11000001↓AH = C1h

sahf: AH bayrakların düşük baytına yazılır → SF = 1, ZF = 1, CF = 1, AF = PF = 0. OF, DF, IF, TF etkilenmez.

Laboratuvar · 8086 komutları adım adım

Laboratuvar: Yazmaçlar ve Bayraklar

Özet

Özet

YazmaçlarAX, BX, CX, DX ikiye bölünebilen veri yazmaçlarıdır; SP/BP yığını, SI/DI dizgileri 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 · dizgi → 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 eşliği; AF nibble eldesi. DF, IF, TF kontrol bayraklarıdır.
Yazmaç çiftleriCS:IP sonraki komut, SS:SP yığının üstü, SS:BP yığın çerçevesi, DS:SI → ES:DI dizgi kopyalama. Kesim yazmacına sabit yüklenemez.

Ö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. SP = 0100h iken 3 PUSH ve 1 POP sonrası SP kaçtır?
  5. MOV CX, 0 ile başlayan bir LOOP döngüsü kaç kez döner?
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. 0100h − 6 + 2 = 00FCh.
  5. 65536 kez (ilk LOOP CX'i FFFFh yapar).

Ö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.2: 8086 Yazmaçları
Sonraki bölüm: Bölüm 3.1: Programlama Dilleri · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.