Bölüm 2: 8086 Yazmaçlar
Giriş
Öğrenme Çıktıları
8086'nın 14 yazmacını gruplarına göre sayabilmek ve 8/16 bitlik kullanımını açıklamak.
AX, BX, CX, DX, SP, BP, SI, DI yazmaçlarının komutlardaki örtük (implicit) görevlerini bilmek.
Bir işlemden sonra CF, ZF, SF, OF, PF, AF bayraklarını elle hesaplayabilmek.
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.
Yazmaç Kümesi
8086 Yazmaç Kümesi
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ç | Ad | 8 bitlik yarılar | Örtük kullanım (örnek) |
|---|---|---|---|
AX | Accumulator | AH, AL | MUL, DIV, IN, OUT, LODS/STOS |
BX | Base | BH, BL | bellek adresleme [BX], XLAT |
CX | Counter | CH, CL | LOOP, REP, kaydırma sayısı CL |
DX | Data | DH, DL | MUL/DIV yüksek yarısı, port adresi |
SP | Stack Pointer | — | PUSH, POP, CALL, RET |
BP | Base Pointer | — | yığın çerçevesi [BP+n] |
SI | Source Index | — | dize kaynağı DS:SI |
DI | Destination 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.
AX'e 1234h yazılır: yüksek bayt AH = 12h, düşük bayt AL = 34h.
Yalnızca AL değişir; AH korunur → AX = 12FFh.
FFh + 1 = 100h, 8 bite sığmaz: AL = 00h, CF = 1, ZF = 1. Elde AH'ye geçmez; AX = 1200h.
AX yeniden 12FFh yapılır.
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.
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
BX'e 0500h sayısı yazılır; artık BX bir adres (işaretçi) olarak kullanılabilir.
[BX]: BX'in gösterdiği bayt okunur → AL = 25h.
Aynı türden erişim adres sabit verilerek de yapılabilir: DL = [0501h] = 17h.
AL = 25h + 17h = 3Ch.
[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
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 → 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:
PUSHile eklenir,POPile çı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.
İş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
AX = 1111h. Yığın boş: SP = FFFEh (.COM programı).
BX = 2222h.
PUSH AX: SP = FFFEh − 2 = FFFCh, sonra [FFFCh] = 1111h.
PUSH BX: SP = FFFAh, [FFFAh] = 2222h. En üstte 2222h var.
POP AX: en üstteki 2222h AX'e okunur, SP = FFFCh. Eski hücredeki veri silinmez, sadece geçersiz sayılır.
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
Başlangıç: yığın boş, SP = FFFEh. Çağıran, parametre olarak AX = 0007h'yi geçirecek.
PUSH AX: parametre yığına konur; SP = FFFCh.
CALL TOPLA: dönüş adresi (sonraki komutun IP'si, ör. 0105h) yığına konur; SP = FFFAh.
PUSH BP: çağıranın BP değeri saklanır; SP = FFF8h.
MOV BP, SP: BP = FFF8h. Bundan sonra SP değişse de BP sabit kalır.
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ı
- 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.
- 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.
[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]
CLD: DF = 0 → SI ve DI her adımda artacak.
SI = 0200h: kopyalanacak “ABC” dizesinin başı.
DI = 0300h: hedef alanın başı.
CX = 3: REP en fazla 3 kez tekrarlar.
1. tur: 'A' kopyalanır; SI = 0201h, DI = 0301h, CX = 2.
2. tur: 'B' kopyalanır; SI = 0202h, DI = 0302h, CX = 1.
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
MOVile yazılamaz; yalnızca JMP, CALL, RET, kesmeler değiştirir. - Kesim yazmacına dolaysız değer yüklenemez:
MOV DS, AXgerekir.
| Çift | Kullanım |
|---|---|
CS:IP | sonraki komut |
SS:SP | yığının üstü |
SS:BP | yığın çerçevesi |
DS:BX, DS:SI, DS:DI | veri |
DS:SI → ES:DI | dize komutları |
İşaretçi ve İndis Yazmaçları · Adım adım
Fiziksel Adres Hesabı
Komut [BX] ile DS kesimindeki bir bayta erişmek istiyor.
Kesim değeri 16 ile çarpılır (onaltılıda sonuna 0 eklenir): 2000h → 20000h.
Bağıl konum (BX = 0500h) eklenir.
Fiziksel adres = 20500h. Bu 20 bitlik değer adres yoluna (A0–A19) konur.
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.
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) | MSB | SF |
|---|---|---|
00h … 7Fh | 0 | 0 |
80h … FFh | 1 | 1 |
35h = 0011 0101b | 0 | 0 |
C2h = 1100 0010b | 1 | 1 |
Bayrak Yazmacı
ZF ve PF
- İşlem sonucunun sıfır olup olmadığını belirtir.
- Sonuç 0 ise ZF = 1; değilse ZF = 0.
CMP AX, BXeşitlikte ZF = 1 yapar →JE/JZatlar.- Örnek:
SUB AL, AL→ AL = 00h, ZF = 1.
- 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.
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,AASbu bayrağı kullanır.
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
ADCbu eldeyi bir sonraki bayta taşır.
| İşlem (8 bit) | Sonuç | CF |
|---|---|---|
FFh + 01h | 00h | 1 |
80h + 80h | 00h | 1 |
70h + 10h | 80h | 0 |
05h − 07h | FEh | 1 (borç) |
07h − 05h | 02h | 0 |
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 yorum | Sonuç | CF | OF |
|---|---|---|---|---|---|
05h + 03h | 5 + 3 = 8 | 5 + 3 = 8 | 08h | 0 | 0 |
7Fh + 01h | 127 + 1 = 128 | 127 + 1 ≠ −128 | 80h | 0 | 1 |
FFh + 01h | 255 + 1 ≠ 0 | −1 + 1 = 0 | 00h | 1 | 0 |
80h + 80h | 128 + 128 ≠ 0 | −128 + (−128) ≠ 0 | 00h | 1 | 1 |
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
MOV AL, 6Ah / ADD AL, 5Ch: iki sayı ikili yazılır ve sağdan sola toplanır.
Düşük nibble: 1010 + 1100 = 1 0110 → bit 3'ten bit 4'e elde geçer → AF = 1.
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).
Sonuçtan: MSB = 1 → SF = 1; sonuç sıfır değil → ZF = 0; 1'lerin sayısı 4 (çift) → PF = 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.
Bayrak Yazmacı
IF ve TF
- 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.
- 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
| Komut | Etki | Komut | Etki |
|---|---|---|---|
CLC | CF = 0 | CLD | DF = 0 |
STC | CF = 1 | STD | DF = 1 |
CMC | CF = ¬CF | CLI / STI | IF = 0 / 1 |
LAHF | AH ← SF ZF – AF – PF – CF | SAHF | AH → düşük bayrak baytı |
PUSHF | FLAGS'i yığına koy | POPF | yığından FLAGS'e yükle |
| Komut grubu | Bayraklara etkisi |
|---|---|
| ADD, ADC, SUB, SBB, CMP, NEG | CF, PF, AF, ZF, SF, OF hepsi güncellenir |
| INC, DEC | CF hariç hepsi güncellenir |
| AND, OR, XOR, TEST | CF = OF = 0; PF, ZF, SF güncellenir; AF tanımsız |
| MOV, PUSH, POP, XCHG, LEA, LOOP, JMP | bayrakları 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.
Adresleme Modları
Modlara Genel Bakış
| Mod | Örnek | İşlenen / etkin adres |
|---|---|---|
| Yazmaç | MOV AX, BX | yazmacın kendisi |
| Dolaysız (immediate) | MOV CL, 0Ah | komutun içindeki sabit |
| Doğrudan (direct) | MOV AX, [0500h] | EA = sabit adres |
| Yazmaç dolaylı | MOV AX, [SI] | EA = BX, SI ya da DI |
| Taban | MOV AL, [BP+0100h] | EA = BX/BP + kaydırma |
| İndis | MOV AX, [SI+2000h] | EA = SI/DI + kaydırma |
| Taban indisli | MOV AX, [BX+DI] | EA = BX/BP + SI/DI |
| Taban indisli kaydırma | MOV AL, [BP+SI+2000h] | EA = taban + indis + kaydırma |
| Dize | MOVSB | DS:SI → ES:DI, otomatik ± |
| Giriş/çıkış | IN AL, 45h | port numarası |
| Göreceli | JNZ etiket | IP = IP + işaretli kaydırma |
Adresleme Modları
Yazmaç ve Dolaysız Mod
- Her iki işlenen de yazmaçtır; bellek erişimi yoktur → en hızlı mod.
MOV AX, BXXOR AX, DXADD AL, BL- İki işlenen aynı boyda olmalı:
MOV AL, BXhatalıdır.
- Kaynak işlenen komutun içinde verilen 8 ya da 16 bitlik sabittir.
MOV AX, 2000hMOV CL, 0AhADD AL, 45hAND AX, 0000h- Hedef işlenen asla dolaysız olamaz:
MOV 5, ALanlamsızdır.
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ı komut | Neden? | Doğrusu |
|---|---|---|
MOV [SI], [DI] | bellekten belleğe aktarım yok | MOV AL, [DI] + MOV [SI], AL (ya da MOVSB) |
MOV DS, 2000h | kesim yazmacına sabit yüklenemez | MOV AX, 2000h + MOV DS, AX |
MOV ES, DS | kesimden kesime aktarım yok | PUSH DS + POP ES |
MOV AL, BX | boyutlar uyuşmuyor | MOV AL, BL |
MOV [BX], 5 | boyut belirsiz | MOV BYTE PTR [BX], 5 |
MOV AX, [CX] | CX adresleme yazmacı değil | MOV BX, CX + MOV AX, [BX] |
MOV AX, [SI+DI] | iki indis birlikte kullanılamaz | MOV BX, SI + MOV AX, [BX+DI] |
MOV IP, AX | IP doğrudan yazılamaz | JMP AX |
Adresleme Modları
Doğrudan ve Yazmaç Dolaylı Mod
- 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.
- 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.
Adresleme Modları
Taban ve İndis Modları
- 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.
- 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].
- 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.
- 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
- 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]
Komut ve yazmaç değerleri. Adreste BP olmadığı için kesim DS.
Taban yazmacı BX = 0200h.
İndis yazmacı SI = 0030h eklenir.
Komuttaki 8 bitlik kaydırma 10h eklenir.
Etkin adres EA = 0240h (16 bit).
DS × 16 = 10000h ile EA toplanır.
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ç
Dolaysız mod: BX = 0200h (sabit komutun içinde).
SI = 0002h.
Doğrudan mod: EA = 0200h → AL = 10h.
Taban + kaydırma: EA = BX + 1 = 0201h → AH = 20h; AX = 2010h.
Taban indisli: EA = BX + SI = 0202h → AL = 10h + 30h = 40h.
Taban indisli kaydırma: EA = 0200h + 2 + 2 = 0204h ← AL (40h).
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, hedefES: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/REPNEZF'ye de bakar.
| Komut | İşlem |
|---|---|
MOVSB | ES:[DI] ← DS:[SI] |
CMPSB | DS:[SI] − ES:[DI] (bayrak) |
SCASB | AL − ES:[DI] |
LODSB | AL ← DS:[SI] |
STOSB | ES:[DI] ← AL |
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
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.
Döngünün sonundaki JNZ, 0100h adresinde 2 baytlık bir komuttur: 75h FAh.
İşlemci JNZ'yi çalıştırırken IP zaten bir sonraki komutu gösterir.
IP = 0100h + 2 = 0102h.
Kaydırma baytı FAh işaretli olarak −6'dır (Bölüm 3: 2'ye tümleyen).
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
[BX] → DS · [BP] → SS · dize → DS:SI, ES:DI · port → DX.Özet
Alıştırmalar
- AX = 3A7Fh iken
MOV AL, 0ve ardındanINC AHçalışınca AX kaç olur? MOV AL, 9Ch/ADD AL, 64hsonrası AL, CF, ZF, SF, OF, PF değerlerini bulun.MOV AL, 50h/ADD AL, 50h: CF ve OF kaçtır? Neden farklılar?- DS = 3000h, SS = 4000h, BX = 0100h, BP = 0020h, SI = 0008h için
[BX+SI+4]ve[BP+SI]fiziksel adreslerini hesaplayın. - SP = 0100h iken 3 PUSH ve 1 POP sonrası SP kaçtır?
MOV CX, 0ile başlayan bir LOOP döngüsü kaç kez döner?MOV [BX], [SI]neden derlenmez? İki komutla yazın.
Cevaplar
- MOV AL, 0 → 3A00h; INC AH → 3B00h.
- 9Ch + 64h = 100h → AL = 00h, CF = 1, ZF = 1, SF = 0, OF = 0 (−100 + 100 = 0), PF = 1, AF = 1.
- A0h: CF = 0 (80 + 80 = 160 ≤ 255), OF = 1 (+80 + +80 = +160 > 127).
- EA = 010Ch → 3010Ch; EA = 0028h, BP olduğundan SS → 40028h.
- 0100h − 6 + 2 = 00FCh.
- 65536 kez (ilk LOOP CX'i FFFFh yapar).
- 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.