Bölüm 2.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.
Adım Adım Çalıştırma · Yazmaç Kümesi
Soru 3: 8 Bitlik Yazmaç Parçaları
Başlangıçta yazmaçlar 0. Kod çalışınca AX, BX ve CX ne olur? (b) İlk satır MOV AX, 0x4231, son satır MOV CH, AH olsaydı?
AX ← 4321h: AH = 43h, AL = 21h. 0x öneki onaltılık demektir.
BL ← AL = 21h. Yalnız BX'in düşük baytı yazılır; BH = 00h kalır → BX = 0021h.
CL ← AH = 43h → CX = 0043h. MOV hiçbir bayrağı etkilemez. (b) MOV AX, 0x4231 · MOV BL, AL · MOV CH, AH ile: AX = 4231h, BX = 0031h, CX = 4200h.
MOV AX, 0x4321 MOV BL, AL MOV CL, AH
Çoktan Seçmeli · Genel Amaçlı Yazmaçlar
Soru 4: 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 5: 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 6: 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 7: 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 8: 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.
Çı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: Bayrak Yazmacı
16 bitlik bayrak yazmacı (FLAGS) için hangisi doğrudur?
D: Durum bayrakları CF, PF, AF, ZF, SF, OF son aritmetik/mantık işleminin sonucunu anlatır ve donanımca kurulur. Kontrol bayrakları TF, IF, DF ise işlemcinin davranışını yönetir; programcı STD/CLD, STI/CLI ya da PUSHF/POPF ile ayarlar. Kalan 7 bit kullanılmaz.
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
Çoktan Seçmeli · Bayrak Yazmacı
Soru 14: Bayrakları Okuma
AL = 80h iken ADD AL, 80h çalışıyor. Sonra bayraklar ne olur?
C: 80h + 80h = 100h → AL = 00h, dışarı taşan 1 → CF = 1; sonuç sıfır → ZF = 1; MSB 0 → SF = 0. İşaretli yorumda −128 + (−128) = −256 sığmaz ve iki negatifin toplamı pozitif (0) çıktı → OF = 1.
Hesap Sorusu · Bayrak Yazmacı
Soru 15: 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.
Adım Adım Çalıştırma · Bayrak Yazmacı
Soru 16: Bayraklar ve IP
.COM programı 0100h'den başlıyor; yazmaçlar ve bayraklar 0. Her komuttan sonra IP, AX, BL ve CF, ZF, SF, OF, PF, AF ne olur?
AX = 7FF0h. Komut 3 bayt → IP = 0103h. MOV bayrakları değiştirmez.
7FF0h + 0010h = 8000h. İşaretli +32752 + 16 = +32768 16 bite sığmaz → OF = 1, SF = 1. Elde yok: CF = 0. Düşük bayt 00h (sıfır tane 1) → PF = 1.
BL = F0h. 8 bitlik MOV, 2 bayt → IP = 0108h.
F0h + 20h = 110h → BL = 10h, CF = 1. İşaretli −16 + 32 = 16 doğru → OF = 0. 10h'de tek bir 1 → PF = 0.
10h − 1 = 0Fh: bit 4'ten ödünç → AF = 1. DEC, CF'yi değiştirmez: CF = 1 kaldı.
8000h − 1 = 7FFFh: −32768 − 1 sığmaz → OF = 1. İşaretsiz 32768 − 1 doğru → CF = 0.
RET: .COM programı DOS'a döner. IP 0100h'den komut uzunluklarına göre 0110h'ye ilerlemişti; RET, yığındaki 0000h'yi IP'ye alır.
org 100h mov ax, 7FF0h add ax, 0010h mov bl, 0F0h add bl, 20h dec bl sub ax, 1 ret
Kod Yazma · Bayrak Yazmacı
Soru 17: 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.