Bölüm 2: 8086 Yazmaçlar
Çoktan Seçmeli · Yazmaç Kümesi
Soru 1: Kesim Yazmaçlarının Görevi
8086'da CS, DS, SS ve ES kesim yazmaçları ne tutar?
A: Kesim yazmacı bir paragraf numarası tutar: kesim tabanı = yazmaç × 10h. DS = 2000h ise veri kesimi 20000h'de başlar ve 2FFFFh'ye kadar uzanır. Kesim içindeki bağıl konumları IP, SP, BP, SI, DI ve BX gibi yazmaçlar tutar; veri ve sonuçlar genel amaçlı yazmaçlardadır.
Çıktı Sorusu · Yazmaç Kümesi
Soru 2: AH ve AL
Her komuttan sonra AX ve CF kaçtır?
MOV AX, 12F0h ADD AL, 20h INC AH ADD AX, 0F0h
Cevabı göster
| Komut | AX | CF |
|---|---|---|
MOV AX, 12F0h | 12F0h | 0 |
ADD AL, 20h | 1210h | 1 |
INC AH | 1310h | 1 |
ADD AX, 0F0h | 1400h | 0 |
F0h + 20h = 110h: 8 bitlik işlemde elde AH'ye geçmez, CF'ye gider; AL = 10h, AH değişmez. INC CF'ye dokunmaz. Son toplama 16 bitliktir: 1310h + 00F0h = 1400h, elde AH'ye geçer.
Çoktan Seçmeli · Genel Amaçlı Yazmaçlar
Soru 3: CX Yazmacı
CX yazmacının örtük (komutta yazılmadan) kullanıldığı görev hangisidir?
B: CX (count): LOOP önce CX'i azaltır, sıfır değilse atlar; REP dizgi komutunu CX kez tekrarlar; SHL AX, CL gibi çok bitlik kaydırmada sayı CL'dedir. Yüksek yarı ve port numarası DX'in, dizgi hedefi DI'nin, yığın çerçevesi tabanı BP'nin görevidir.
Çoktan Seçmeli · Genel Amaçlı Yazmaçlar
Soru 4: Adres Tutabilen Yazmaç
Aşağıdaki komutlardan hangisi 8086'da derlenmez?
C: Köşeli parantez içinde yalnızca BX, BP, SI ve DI (ve bir yer değiştirme) kullanılabilir. AX, CX ve DX adresleme yazmacı değildir; veri yazmaçlarından adres tutabilen tek yazmaç BX'tir. Doğrusu: MOV BX, CX + MOV AX, [BX].
Adım Adım Çalıştırma · Genel Amaçlı Yazmaçlar
Soru 5: MUL ve DIV ile DX:AX
Her komuttan sonra DX, AX, BX, CX kaçtır? MUL sonrasında CF ve OF neden 1 olur? DIV'in bölümü ve kalanı nereye yazılır?
AX = 0300h (768).
BX = 0200h (512).
16 bitlik MUL: DX:AX = AX × BX = 768 × 512 = 393 216 = 0006 0000h → DX = 0006h, AX = 0000h. Yüksek yarı sıfır değil → CF = OF = 1; SF, ZF, AF, PF tanımsız.
CX = 7. Bölünen olarak DX:AX'teki 32 bitlik değer kalır.
DIV CX: 393 216 / 7 = 56 173 kalan 5 → bölüm AX = DB6Dh, kalan DX = 0005h. Bölüm 16 bite sığdığı için bölme hatası yok; altı bayrak tanımsız (?).
mov ax, 0300h mov bx, 0200h mul bx mov cx, 0007h div cx
Çıktı Sorusu · Genel Amaçlı Yazmaçlar
Soru 6: LOOP Kaç Kez Döner?
Program bittiğinde AX kaçtır? Birinci satır MOV CX, 0 olsaydı döngü kaç kez döner, AX kaç olurdu?
MOV CX, 4 MOV AX, 1 D: ADD AX, AX LOOP D
Cevabı göster
Gövde CX = 4, 3, 2, 1 için çalışır; her turda AX ikiye katlanır: 1 → 2 → 4 → 8 → 16. AX = 0010h, CX = 0.
LOOP önce CX'i azaltır, sonra sınar. CX = 0 ile girilirse ilk LOOP CX'i FFFFh yapar; döngü 65 536 kez döner. 265536 16 bite sığmaz: 16. turdan sonra AX = 0 olur ve öyle kalır → AX = 0000h.
Bu tuzaktan korunmak için döngüden önce JCXZ ile CX = 0 durumu atlanır.
Çoktan Seçmeli · İşaretçi ve İndis Yazmaçları
Soru 7: Yığın İşaretçisi
Yığın işaretçisi (SP) için hangisi doğrudur?
D: SP 16 bittir ve SS kesimi içinde yığının tepesinin bağıl konumunu tutar. Yığın düşük adreslere doğru büyür: PUSH SP ← SP − 2, sonra yazma; POP önce okuma, sonra SP ← SP + 2. Yığındaki öğeler hep 16 bittir; POP eski hücreyi silmez, yalnızca geçersiz sayar.
Adım Adım Çalıştırma · İşaretçi ve İndis Yazmaçları
Soru 8: PUSH ve POP İzleme
.COM programında yığın başlangıçta boş (SP = FFFEh). Her komuttan sonra AX, BX, CX, SP ve yığın ne olur?
AX = 1234h. Yığın boş: SP = FFFEh (.COM programı).
BX = ABCDh.
PUSH AX: SP = FFFEh − 2 = FFFCh, [FFFCh] = 1234h (34h düşük adreste).
PUSH BX: SP = FFFAh, [FFFAh] = ABCDh. Tepede ABCDh var.
POP CX: tepedeki ABCDh CX'e, SP = FFFCh. FFFAh'deki değer silinmez, yalnızca geçersiz sayılır.
AX = 0. Yığın değişmez.
POP AX: 1234h geri gelir, SP = FFFEh. Sonuç: AX = 1234h, BX = CX = ABCDh; SS:FFFAh'de hâlâ CDh AB baytları durur.
mov ax, 1234h mov bx, 0ABCDh push ax push bx pop cx mov ax, 0 pop ax
Çıktı Sorusu · İşaretçi ve İndis Yazmaçları
Soru 9: Geriye Doğru Kopyalama
DS = ES ve DS:0200h–0204h'de "ABCDE" dizgisi var. Program bittiğinde SI, DI ve CX kaçtır? Hangi baytlar hangi sırayla kopyalanır? DS:0300h–0304h'de ne olur?
STD MOV SI, 0204h MOV DI, 0304h MOV CX, 5 REP MOVSB
Cevabı göster
STD → DF = 1: her adımda SI ve DI 1 azalır. Kopyalama sondan başa yapılır: 0204h → 0304h ('E'), 0203h → 0303h ('D'), …, 0200h → 0300h ('A').
Sonuç: SI = 01FFh, DI = 02FFh, CX = 0; DS:0300h–0304h = "ABCDE", sıra korunur.
Geriye doğru kopyalama, hedef kaynağın biraz ilerisinde olan çakışan alanlarda gerekir; ileri yönde (CLD) kopyalasaydık kaynağın henüz okunmamış baytlarının üzerine yazardık.
Çoktan Seçmeli · İşaretçi ve İndis Yazmaçları
Soru 10: Dizgi Komutunun İşlenenleri
MOVSB komutunun kaynağı ve hedefi nedir?
A: Dizgi komutlarında kaynak hep DS:SI, hedef hep ES:DI'dir; işlenenler komutta yazılmaz (örtük). Her adımdan sonra SI ve DI, DF'ye göre 1 (bayt) ya da 2 (sözcük) artar ya da azalır. Dizgi komutu dışında [DI] sıradan bir adrestir ve DS kesimini kullanır.
Çoktan Seçmeli · Bayrak Yazmacı
Soru 11: Durum mu, Kontrol mü?
Aşağıdaki bayraklardan hangisi bir durum bayrağı değil, kontrol bayrağıdır?
B: Durum bayraklarını (CF, PF, AF, ZF, SF, OF) işlemci her aritmetik/mantık işleminden sonra sonuca göre kendisi kurar. Kontrol bayraklarını (TF, IF, DF) programcı ayarlar: TF = 1 iken her komuttan sonra INT 1 oluşur ve program tek adımda çalıştırılabilir.
Çoktan Seçmeli · Bayrak Yazmacı
Soru 12: BCD Toplama
MOV AL, 38h / ADD AL, 29h / DAA çalışıyor (paketli BCD: 38 + 29). ADD'den sonraki bayrak durumu ve DAA'nın sonucu için hangisi doğrudur?
C: 8h + 9h = 11h: bit 3'ten bit 4'e elde → AF = 1; ikili sonuç 61h, BCD olarak yanlıştır. DAA, AF = 1 olduğu için düşük basamağa 6 ekler: 61h + 06h = 67h; 38 + 29 = 67 ✓. Yüksek basamak 9'u aşmadığı ve elde çıkmadığı için CF = 0 kalır.
Adım Adım Çalıştırma · Bayrak Yazmacı
Soru 13: Bayrak İzleme
Her komuttan sonra AL ve CF, ZF, SF, OF, PF, AF kaçtır? (Başlangıçta bayraklar 0.)
AL = 64h (+100). MOV bayrakları değiştirmez.
64h + 32h = 96h: +100 + 50 = 150 > 127 → OF = 1, SF = 1. İşaretsiz 150 doğru → CF = 0. 4 + 2 nibble eldesi yok → AF = 0; 1001 0110'da dört 1 → PF = 1.
96h − 97h = FFh: küçükten büyük çıkarıldı → CF = 1; AF = 1. İşaretli −106 − (−105) = −1 doğru → OF = 0.
FFh + 1 = 00h → ZF = 1. INC CF'yi değiştirmez: CF = 1 kaldı.
CMP AL, 1: 00h − 01h hesaplanır ama AL'ye yazılmaz. Ödünç → CF = 1, sonuç FFh → SF = 1, ZF = 0. AL hâlâ 00h.
mov al, 64h add al, 32h sub al, 97h inc al cmp al, 1
Hesap Sorusu · Bayrak Yazmacı
Soru 14: Bayrakları Elle Hesaplamak
Her işlemden sonra sonucu ve CF, ZF, SF, OF, PF, AF bayraklarını bulun.
MOV AX, 7FF8h/ADD AX, 0009hMOV BX, 0005h/SUB BX, 0007h
Cevabı göster
| Sonuç | CF | ZF | SF | OF | PF | AF | |
|---|---|---|---|---|---|---|---|
| 1 | 8001h | 0 | 0 | 1 | 1 | 0 | 1 |
| 2 | FFFEh | 1 | 0 | 1 | 0 | 0 | 1 |
- +32760 + 9 = 32769 > 32767 → OF = 1, MSB = 1 → SF = 1; işaretsiz toplam sığdı → CF = 0. 8h + 9h nibble eldesi → AF = 1. PF yalnız düşük bayta bakar: 01h'de bir tane 1 → PF = 0.
- 5 − 7: ödünç → CF = 1; işaretli 5 − 7 = −2 doğru → OF = 0. 5h − 7h nibble ödüncü → AF = 1. Düşük bayt FEh'de yedi tane 1 → PF = 0.
Kod Yazma · Bayrak Yazmacı
Soru 15: Tuzak Bayrağını Kurmak
TF'yi (bit 8) doğrudan kuran bir komut yoktur. Diğer bayrakları değiştirmeden TF'yi 1 yapan kısa bir kod yazın. TF = 1 olduktan sonra her komutun ardından ne olur? IF ve DF için neden böyle bir koda gerek yoktur?
Cevabı göster
PUSHF ; FLAGS yığına POP AX ; AX = FLAGS OR AX, 0100h ; bit 8 = TF ← 1 PUSH AX POPF ; FLAGS = AX
OR yalnızca bit 8'i 1 yapar, diğer bitler korunur. Silmek için AND AX, 0FEFFh kullanılır.
TF = 1 iken her komuttan sonra tip 1 kesme (INT 1) oluşur; hata ayıklayıcı programı komut komut yürütür. IF ve DF'nin kendi komutları vardır: STI/CLI ve STD/CLD.
Çoktan Seçmeli · Adresleme Modları
Soru 16: Adresleme Modunun Adı
MOV AX, [BX+DI+8] komutunun kaynak işleneni hangi adresleme modundadır?
D: Etkin adres taban yazmacı (BX), indis yazmacı (DI) ve sabit yer değiştirmenin (8) toplamıdır. Taban modunda yalnızca BX/BP + yer değiştirme ([BX+4]), indis modunda yalnızca SI/DI + yer değiştirme ([DI+8]) bulunur; yazmaç dolaylı modda ise tek bir yazmaç vardır ([BX]). Taban ve indis yazmacı birlikteyse mod taban indislidir; sabit de eklenince taban indisli yer değiştirme olur.
Hesap Sorusu · Adresleme Modları
Soru 17: Etkin ve Fiziksel Adres
DS = 2100h, SS = 3000h, ES = 5000h, BX = 0150h, BP = 0A00h, SI = 0034h, DI = 0010h. Her bellek işleneninin etkin adresini (EA) ve fiziksel adresini bulun.
[BX+SI+12h][BP+DI-4][DI+0FFF8h]ES:[BX]DS:[BP+SI]
Cevabı göster
| EA | Kesim | FA | |
|---|---|---|---|
| 1 | 0150 + 0034 + 12 = 0196h | DS | 21196h |
| 2 | 0A00 + 0010 − 4 = 0A0Ch | SS | 30A0Ch |
| 3 | 0010 + FFF8 = 1 0008 → 0008h | DS | 21008h |
| 4 | 0150h | ES | 50150h |
| 5 | 0A00 + 0034 = 0A34h | DS | 21A34h |
BP içeren adres varsayılan olarak SS'yi kullanır (2); önek bunu değiştirir (5). EA 16 bitte sarar (3): FFF8h, −8 gibi davranır.
Hata Bulma · Adresleme Modları
Soru 18: Geçersiz İşlenenler
Aşağıdaki satırların her birindeki hatayı açıklayın ve aynı işi yapan geçerli kodu yazın.
MOV [SI], [DI] MOV AX, [SI+DI] MOV [BX], 5 MOV ES, DS MOV AL, BX
Cevabı göster
| Hatalı | Neden | Doğrusu |
|---|---|---|
MOV [SI], [DI] | bellekten belleğe MOV yok | MOV AL, [DI]MOV [SI], AL |
MOV AX, [SI+DI] | iki indis birlikte olmaz | MOV BX, SIMOV AX, [BX+DI] |
MOV [BX], 5 | boyut belirsiz | MOV BYTE PTR [BX], 5 |
MOV ES, DS | kesimden kesime MOV yok | PUSH DSPOP ES |
MOV AL, BX | 8 ve 16 bit uyuşmaz | MOV AL, BL |
Bir bayt dizgisi için ilk satırın yerine MOVSB de kullanılabilir (ES:DI ← DS:SI; yön ters olur).
Adım Adım Çalıştırma · Adresleme Modları
Soru 19: Modlar Bir Arada
DS:0300h'den itibaren bellekte 11 22 33 44 55 66 77 baytları var. Her komutun adresleme modu ve etkin adresi nedir? Sonunda AX ve bellek ne olur?
Anlık mod: BX = 0300h. Sabit komutun içindedir; bellek erişimi yok.
SI = 0003h.
Doğrudan mod: EA = 0301h → AL = 22h.
Taban indisli: EA = BX + SI = 0303h → AH = 44h; AX = 4422h.
Taban indisli yer değiştirme: EA = 0300h + 3 + 1 = 0304h → AL = 22h + 55h = 77h.
DI = 0004h.
EA = 0300h + 4 + 1 = 0305h ← AX: [0305h] = 77h (AL), [0306h] = 44h (AH). Little-endian: düşük bayt düşük adrese.
mov bx, 0300h mov si, 3 mov al, [0301h] mov ah, [bx+si] add al, [bx+si+1] mov di, 4 mov [bx+di+1], ax
Çoktan Seçmeli · Adresleme Modları
Soru 20: Göreceli Atlama
0120h adresindeki 2 baytlık JNZ komutunun makine kodu 75 F4. ZF = 0 iken atlama sonrası IP kaç olur?
B: Uzaklık, atlama komutundan sonraki komutun adresine eklenir: IPsonraki = 0120h + 2 = 0122h. F4h işaretli olarak −12'dir (ikiye tümleyen): 0122h − 0Ch = 0116h. 0114h uzaklığı komutun kendi adresine eklemekten, 012Ch işareti yok saymaktan gelir; 0122h ise ZF = 1 iken (atlama yokken) IP'nin değeridir.