Bölüm 10: Komut Kümesi
Çoktan Seçmeli · Komut Yapısı
Soru 1: Geçerli Komut
Aşağıdaki komutlardan hangisi 8086'da geçerlidir?
D: Bellek hedefe anlık değer yazılabilir; boyut BYTE PTR ile belirtilmiştir. Bir komutun iki işleneni birden bellek olamaz: bellekten belleğe kopyalama bir ara yazmaçla (mov al, [si] · mov [di], al), MOVSB ile ya da PUSH/POP ile yapılır. Kesim yazmacına anlık değer yazılamaz (önce AX'e yüklenir); AL bayt, WORD PTR sözcük olduğu için boyutlar uyuşmaz.
Adım Adım Çalıştırma · Komut Kodlama
Soru 2: Makine Kodunu Çözmek
Bellekte 0100h'den başlayan 9 bayt kod olarak çözülecek. Kaç komut vardır ve her biri nedir?
8Bh = 100010 1 1: MOV ailesi; D = 1 → REG alanı hedef; W = 1 → sözcük.
47h = 01 000 111: MOD = 01 → ardından 8 bitlik yer değiştirme (06h). Komut: mov ax, [bx+06h] (3 bayt).
26h bir komut değil, kesim önekidir: sonraki komutun bellek işleneni DS yerine ES'ten okunur/yazılır.
88h = 100010 0 0: D = 0 → REG alanı kaynak (yazmaçtan belleğe); W = 0 → bayt.
25h = 00 100 101: W = 0 olduğundan REG 100 = AH (W = 1 olsaydı SP). Komut: mov es:[di], ah.
05h = 0000010 1: akümülatöre anlık ekleme, W = 1 → 16 bitlik veri: 34 12 little-endian = 1234h. Komut: add ax, 1234h. ModR/M'siz kısa biçim.
8B 47 06 26 88 25 05 34 12
Çoktan Seçmeli · Komut Kodlama
Soru 3: MOD = 00, R/M = 110
88 1E 00 10 baytları hangi komutun makine kodudur?
C: 88h = 100010 0 0: D = 0 (REG kaynak), W = 0 (bayt). 1Eh = 00 011 110: REG = 011 (BL); MOD = 00 ve R/M = 110 özel durumdur, [BP] değil 16 bitlik doğrudan adres anlamına gelir: 00 10 → 1000h. D = 1 olsaydı (8Ah) yön tersine döner ve mov bl, [1000h] olurdu.
Hesap Sorusu · Komut Kodlama
Soru 4: Komut Kodlama
Aşağıdaki komutların makine kodunu bulun. MOV r/m↔reg işlem kodu 100010, ADD r/m↔reg işlem kodu 000000 (ardından D ve W bitleri).
mov [si+20h], cxadd bx, [1234h]mov [bp], al
Cevabı göster
| Komut | 1. bayt | ModR/M | Kod |
|---|---|---|---|
| mov [si+20h], cx | 100010 0 1 = 89h | 01 001 100 = 4Ch | 89 4C 20 |
| add bx, [1234h] | 000000 1 1 = 03h | 00 011 110 = 1Eh | 03 1E 34 12 |
| mov [bp], al | 100010 0 0 = 88h | 01 000 110 = 46h | 88 46 00 |
1: CX kaynak → D = 0; MOD = 01 (d8 = 20h), REG = 001 (CX), R/M = 100 ([SI]).
2: BX hedef → D = 1; MOD = 00, R/M = 110 doğrudan adres, ardından 34 12 (little-endian).
3: [BP] için MOD = 00 kullanılamaz (doğrudan adrese ayrılmış); assembler MOD = 01 ve d8 = 00 üretir. Varsayılan kesim SS'tir.
Hesap Sorusu · Adresleme Modları
Soru 5: Fiziksel Adres
DS = 1A00h, SS = 2F00h, ES = 3000h, BX = 0FF0h, BP = 0100h, SI = 0020h, DI = F020h. Her komutun eriştiği fiziksel adresi bulun.
mov al, [bx+si+10h]mov ax, [bp+di]mov cl, es:[bx]mov dl, [bx+di]
Cevabı göster
| Komut | Kesim | EA | Fiziksel adres |
|---|---|---|---|
| [bx+si+10h] | DS | 1020h | 1B020h |
| [bp+di] | SS | F120h | 3E120h (ve 3E121h) |
| es:[bx] | ES | 0FF0h | 30FF0h |
| [bx+di] | DS | 0010h | 1A010h |
Fiziksel adres = kesim × 10h + EA. BP içeren adreslerin varsayılan kesimi SS'tir. Son satırda BX + DI = 1 0010h 16 bite sığmaz; EA 0010h'ye sarar, 1B010h değil.
Çoktan Seçmeli · Veri Taşıma
Soru 6: MOV ve Bayraklar
MOV AX, BX komutu hakkında hangisi doğrudur?
A: MOV, XCHG, LEA, PUSH ve POP (POPF hariç) bayrakları değiştirmez; bayraklar ALU işlemlerinde kurulur. Hedef soldadır: BX'in içeriği AX'e kopyalanır, BX değişmez. İki işlenen de yazmaç olduğu için yazmaç adresleme modudur (anlık örnek: MOV AX, 5). MOV'un iki işleneni birden bellek olamaz.
Çıktı Sorusu · Aritmetik
Soru 7: Elde mi, Taşma mı?
Her işlemden sonra AL ve CF, OF, SF, ZF, PF ne olur? Sonuç işaretsiz ve işaretli yorumda doğru mudur?
mov al, 0C8h·add al, 50hmov al, 50h·add al, 50hmov al, 50h·sub al, 0C8h
Cevabı göster
| AL | CF | OF | SF | ZF | PF | |
|---|---|---|---|---|---|---|
| 1 | 18h | 1 | 0 | 0 | 0 | 1 |
| 2 | A0h | 0 | 1 | 1 | 0 | 1 |
| 3 | 88h | 1 | 1 | 1 | 0 | 1 |
- 1: 200 + 80 = 280 → işaretsiz taşma (CF = 1). İşaretli −56 + 80 = 24 doğru (OF = 0): işaretleri farklı iki sayının toplamı taşmaz.
- 2: 80 + 80 = 160 işaretsiz doğru; işaretli +160 sığmaz, sonuç −96 görünür → OF = 1.
- 3: 80 − 200 ödünç ister (CF = 1); işaretli 80 − (−56) = 136 > 127 → OF = 1. İkisi de yanlış.
PF düşük baytta çift sayıda 1 olduğunu gösterir: 18h, A0h, 88h'in her birinde iki tane 1 var.
Çoktan Seçmeli · Aritmetik
Soru 8: Sığmayan Bölüm
mov ax, 0800h · mov bl, 4 · div bl çalışınca ne olur?
B: 8 bitlik DIV, AX'i BL'ye böler; bölüm AL'ye, kalan AH'ye yazılır. 2048 ÷ 4 = 512 = 200h, AL'ye sığmaz; işlemci INT 0 (bölme hatası) üretir. Sözcük bölmesiyle (xor dx, dx · mov bx, 4 · div bx) AX = 0200h elde edilir.
Adım Adım Çalıştırma · Aritmetik
Soru 9: DAA ile Onluk Toplam
Paketli BCD 58 ile 67 toplanıyor. Her adımda AL, AF ve CF ne olur? Sonuç AX'te nasıl görünür?
AL = 58h: paketli BCD, onluk 58.
İkili toplama 58h + 67h = BFh. Düşük nibble Fh > 9: geçerli BCD değil. 8 + 7 = 15 < 16 → AF = 0.
DAA: düşük nibble > 9 → +06h (C5h, AF = 1); AL baştan > 99h → +60h → 25h, CF = 1.
AH = 0. MOV bayrakları değiştirmez; CF = 1 korunur.
ADC AH, 0: AH = 0 + 0 + CF = 1 → AX = 0125h: 58 + 67 = 125.
ORG 100h mov al, 58h ; BCD 58 add al, 67h ; + BCD 67 daa mov ah, 0 adc ah, 0 ; yüzler basamağı ret
Çoktan Seçmeli · Mantık İşlemleri
Soru 10: TEST ile Bit Sınama
AL = 4Ch iken test al, 03h çalışıyor. ZF ve AL ne olur?
A: TEST, sonucu yazmayan AND'dir: 4Ch = 0100 1100b, alt iki biti 0 olduğundan 4Ch AND 03h = 0 → ZF = 1; AL değişmez. Alt iki bitin sıfır olması sayının 4'e tam bölündüğünü gösterir (76 = 4 × 19). AND aynı işi yapsaydı AL = 00h olurdu. TEST sonrası CF = OF = 0.
Adım Adım Çalıştırma · Kaydırma ve Döndürme
Soru 11: SHL, RCR, SAR
Her komuttan sonra AL ve CF ne olur?
AL = 96h = 1001 0110b.
SHL: bitler sola, sağdan 0 girer, b7 (1) CF'ye → AL = 2Ch, CF = 1.
RCR: CF ile birlikte 9 bitlik halka sağa döner; eski CF (1) b7'ye girer, b0 (0) CF'ye çıkar → AL = 96h, CF = 0.
SAR: işaret biti (1) kopyalanır → 1100 1011b = CBh, CF = 0. İşaretli bölme: −106 ÷ 2 = −53.
ORG 100h MOV AL, 96h SHL AL, 1 RCR AL, 1 SAR AL, 1 ret
Hata Bulma · Kaydırma ve Döndürme
Soru 12: Kaydırarak Çarpma: Gizli Varsayımlar
Program bittiğinde result ne olur? Hangi algoritma uygulanıyor? Kod hangi gizli varsayımlara dayanıyor?
jmp start multiplicand: db 13 ; çarpılan multiplier: db 5 ; çarpan result: db 0 start: mov cl, 4 mov bl, [multiplicand+si] mov dl, [multiplier+si] checkbit: shr dl, 1 jnc skip add [result+si], bl skip: shl bl, 1 loop checkbit ret
Cevabı göster
result = 41h (13 × 5 = 65).
Çarpanın bitleri SHR ile tek tek CF'ye alınır; bit 1 ise o anki çarpılan sonuca eklenir, çarpılan her turda SHL ile iki katına çıkar: 5 = 0101b → 13 × 1 + 13 × 4 = 65.
- SI = 0 varsayılıyor. SI = 1 olsaydı BL = 5 (multiplier), DL = 0 (result) okunur, hiç ekleme yapılmaz ve result 0 kalırdı.
- CH = 0 varsayılıyor: LOOP CX'i kullanır ama yalnızca CL yüklenmiş. CH = 1 ise döngü 260 kez döner (sonuç yine 41h, ama boşuna). emu8086 bir .COM programını yüklerken CX'e program boyunu koyar;
mov cx, 4yazılmalıdır.
Çoktan Seçmeli · Kaydırma ve Döndürme
Soru 13: SAR ile IDIV Farkı
AL = F7h (−9) iken sar al, 1 sonrası AL nedir?
C: SAR işaret bitini koruyarak sağa kaydırır: 1111 0111b → 1111 1011b = FBh = −5; çıkan 1 CF'ye gider. SAR −∞'a doğru yuvarlar (−4,5 → −5), IDIV ise sıfıra doğru keser (−9 ÷ 2 = −4, FCh). 7Bh SHR'nin, EEh SHL'nin sonucudur.
Çoktan Seçmeli · Dizgi İşleme
Soru 14: Yön Bayrağı
8086'da FLAGS yazmacındaki yön bayrağı (DF) ne işe yarar?
D: DF = 0 (cld): MOVSB, LODSB, STOSB, CMPSB, SCASB her adımda SI/DI'yi artırır; DF = 1 (std): azaltır. Bayt komutlarında adım 1, sözcük komutlarında 2'dir. Kesmeleri IF denetler; 8086'da ayrıcalık seviyesi yoktur.
Adım Adım Çalıştırma · Dizgi İşleme
Soru 15: REPE CMPSB
İki dizgi REPE CMPSB ile karşılaştırılıyor. Komut bitince CX, SI, DI ve ZF ne olur? İlk fark hangi indiste?
CLD: DF = 0, karşılaştırma soldan sağa ilerleyecek.
SI = 010Fh: s1 (DS:SI).
DI = 0114h: s2 (ES:DI; .COM programında ES = DS).
CX = 5: en çok 5 karşılaştırma.
'M' = 'M' → ZF = 1; SI, DI bir ilerler, CX = 4 → devam.
'I' = 'I' → ZF = 1, CX = 3.
'K' = 'K' → ZF = 1, CX = 2.
'R' (52h) − 'S' (53h): ZF = 0 → REPE durur. CX = 1, SI = 0113h, DI = 0118h; 'R' < 'S' olduğundan CF = 1. Fark SI − 1 − s1 = 3. indiste (0'dan sayarak).
ORG 100h cld lea si, s1 lea di, s2 mov cx, 5 repe cmpsb ret s1 db 'MIKRO' s2 db 'MIKSA'
Çıktı Sorusu · Dizgi İşleme
Soru 16: Örtüşen Kopyalama
Dizgiyi bir bayt sağa kaydırmak isteniyor. Program bitince metin ne olur? std yerine cld kullanılıp SI = metin, DI = metin+1 verilseydi ne olurdu?
std
lea si, metin+3 ; son karakter
lea di, metin+4
mov cx, 4
rep movsb
...
metin db 'ABCD', '.'Cevabı göster
STD ile: AABCD. Kopyalama sondan başa yapılır: D → 4. bayt, C → 3., B → 2., A → 1.; her kaynak bayt üzerine yazılmadan önce okunur.
CLD ile: AAAAA. İlk adımda A, B'nin üzerine yazılır; sonraki adım bu yeni A'yı okur ve aynı karakter bütün diziye yayılır.
Kural: hedef kaynağın sağında örtüşüyorsa sondan başa (STD), solunda örtüşüyorsa baştan sona (CLD) kopyalanır.
Hesap Sorusu · Kontrol Aktarma
Soru 17: Atlama Uzaklığı
Göreli atlamada hedef = sonraki komutun adresi + uzaklık. Kısa JMP: EB d8 (2 bayt), yakın JMP: E9 d16 (3 bayt).
- 011Ch'deki
jmp geri0100h'e atlıyor. Makine kodu nedir? - 0100h'deki
jmp ileriile hedef arasında 127 bayt veri var. Hangi biçim seçilir? - Arada 128 bayt olsaydı?
Cevabı göster
- Sonraki komut 011Eh; 0100h − 011Eh = −1Eh = E2h → EB E2.
- Kısa biçimde sonraki adres 0102h, hedef 0102h + 7Fh = 0181h; uzaklık 7Fh = +127 sığar → EB 7F.
- +128 kısa erime (−128 … +127) sığmaz; yakın biçim gerekir. Komut 3 bayt olunca hedef 0103h + 80h = 0183h → E9 80 00.
Göreli kodlama sayesinde kod bellekte taşınabilir. 8086'da koşullu atlamaların yalnızca kısa biçimi vardır; uzak hedef için koşul ters çevrilip yakın JMP kullanılır.
Çoktan Seçmeli · Kontrol Aktarma
Soru 18: JG mi, JA mı?
AL = 80h iken cmp al, 7Fh çalışıyor. Ardından ayrı ayrı denenen jg ve ja için hangisi doğrudur?
B: 80h − 7Fh = 01h: CF = 0, ZF = 0, SF = 0; işaretli −128 − 127 sığmadığı için OF = 1. JA (CF = 0 ve ZF = 0) atlar: işaretsiz 128 > 127. JG, ZF = 0 ve SF = OF ister; SF ≠ OF olduğundan atlamaz: işaretli −128 > 127 değildir.
Çoktan Seçmeli · İşlemci Kontrolü
Soru 19: HLT Komutu
HLT komutu ile ilgili aşağıdakilerden hangisi doğru değildir?
C: HLT işlemciyi durma (halt) durumuna sokar; programı başlatmaz. Durumdan çıkmak için bir donanım kesmesi (INTR, NMI) ya da RESET gerekir. Diğer işlemci kontrolü komutları: NOP, WAIT, ESC, LOCK, CLC/STC/CMC, CLD/STD, CLI/STI.
Hata Bulma · Bayrak Etkileri
Soru 20: Kaybolan ZF
AX = BX = 5 iken DX'in 2 olması bekleniyor. Program bitince DX kaçtır? Hata nerede, nasıl düzeltilir?
mov cx, 0
cmp ax, bx
inc cx ; sayaç
je esit
mov dx, 1
jmp son
esit: mov dx, 2
son:Cevabı göster
DX = 1.
CMP eşitlik için ZF = 1 yapar, ama araya giren inc cx ZF'yi kendi sonucuna (CX = 1 ≠ 0) göre yeniden kurar: ZF = 0 ve JE atlamaz. INC/DEC yalnızca CF'yi korur; OF, SF, ZF, AF, PF'yi değiştirir.
Düzeltme: inc cx CMP'den önceye alınır. CMP ile Jcc arasına yalnızca MOV, LEA, PUSH, XCHG gibi bayrak etkilemeyen komutlar girebilir.