Bölüm 11: Komut Kodlama ve Dizgi Komutları
Ç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 · Komut Kodlama
Soru 5: Önek Baytları
Aşağıdaki bayt dizileri hangi komutlardır? Önek baytları: 26h ES, 2Eh CS, F3h REP; FF /4 dolaylı yakın JMP.
26 8A 07F3 AB2E FF 27
Cevabı göster
| Baytlar | Çözüm | Komut |
|---|---|---|
| 26 8A 07 | ES öneki; 8Ah: d = 1, w = 0; 07h = 00 000 111 | mov al, es:[bx] |
| F3 AB | REP öneki; ABh = STOSW | rep stosw |
| 2E FF 27 | CS öneki; 27h = 00 100 111: REG = 100 (/4), R/M = [BX] | jmp word ptr cs:[bx] |
1: MOD = 00, REG = 000 (AL), R/M = 111 ([BX]); önek varsayılan DS yerine ES'i seçer.
2: STOSW, AX'i ES:[DI]'ye yazar; REP ile CX kez yinelenir.
3: FF baytında REG alanı yazmaç değil, işlem seçicidir (/4 = dolaylı yakın JMP): IP ← CS:[BX] sözcüğü.
Ç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.
Çoktan Seçmeli · Veri Taşıma
Soru 7: XLAT ile Çeviri
tablo db '0123456789ABCDEF' tanımlı; mov bx, offset tablo · mov al, 0Bh · xlat sonrası AL nedir?
B: XLAT, AL ← [DS:BX + AL] yapar: tablo[11] = 'B' = 42h. İndis 0'dan başladığı için tablo[10] = 'A', tablo[11] = 'B'. Bir onaltılık basamak bu yolla tek komutta ASCII karaktere çevrilir. XLAT bayrakları değiştirmez.
Çoktan Seçmeli · Veri Taşıma
Soru 8: LEA mı, MOV mu?
BX = 1000h, SI = 0020h ve DS:1024h adresindeki sözcük 5A5Ah iken lea ax, [bx+si+4] sonrası AX nedir?
A: LEA etkin adresi hesaplar ama belleğe erişmez: AX = 1000h + 0020h + 4 = 1024h. Aynı işlenenle mov ax, [bx+si+4] o adresteki içeriği (5A5Ah) okurdu. LEA bayrakları etkilemez; bu yüzden lea ax, [bx+si] bayrak bozmadan toplama için de kullanılır.
Hesap Sorusu · Veri Taşıma
Soru 9: LES ile Uzak İşaretçi
DS = 2000h. 2000:0100h adresinden başlayan baytlar 50 00 00 B8. Aşağıdaki kod çalışıyor (DF = 0):
les di, [0100h] mov al, 'A' stosb
- LES sonrası ES ve DI nedir?
- STOSB hangi fiziksel adrese yazar?
- STOSB sonrası DI nedir?
Cevabı göster
1: Uzak işaretçide önce bağıl konum, sonra kesim saklanır (little-endian): DI = 0050h, ES = B800h.
2: STOSB hedefi her zaman ES:DI'dir: B800h × 10h + 0050h = B8050h (metin belleğinde 0. satırın 40. karakteri).
3: DF = 0 olduğundan DI bir artar: 0051h. LDS aynı işi DS ile yapar.
Çoktan Seçmeli · Dizgi İşleme
Soru 10: 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.
Hesap Sorusu · Dizgi İşleme
Soru 11: REP STOSW ile Satır Silme
ES = B800h iken aşağıdaki kod çalışıyor.
cld mov ax, 0720h mov cx, 80 mov di, 0 rep stosw
- Kaç bayt yazılır? Son durumda DI ve CX nedir?
- Ekranda ne görülür?
- CX = 0 ile başlansaydı ne olurdu?
Cevabı göster
1: 80 sözcük = 160 bayt; her adımda DI += 2: DI = 00A0h, CX = 0.
2: Her sözcükte AL = 20h (boşluk) çift adrese, AH = 07h (gri öznitelik) tek adrese yazılır: ekranın ilk satırı silinir.
3: REP önce CX'i sınar; CX = 0 ise STOSW hiç yürütülmez ve bellek değişmez. LOOP'tan farkı budur.
Adım Adım Çalıştırma · Dizgi İşleme
Soru 12: 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 13: Ö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 14: 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 · İşlemci Kontrolü
Soru 15: 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 16: 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.