Bölüm 11: Komut Kodlama ve Dizgi Komutları

Bölüm 11: Komut Kodlama ve Dizgi Komutları · Çalışma Soruları
Komut yapısıMakine koduÖneklerVeri taşımaXLATLEA · LESDizgiAtlama kodlamasıİşlemci kontrolüBayrak etkileri
Sercan KÜLCÜ

Ç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?

8B4706268825053412100010MOV r/m↔reg1D1W

8Bh = 100010 1 1: MOV ailesi; D = 1 → REG alanı hedef; W = 1 → sözcük.

8B470626882505341201MOD: d8000REG: AX111R/M: [BX]

47h = 01 000 111: MOD = 01 → ardından 8 bitlik yer değiştirme (06h). Komut: mov ax, [bx+06h] (3 bayt).

8B470626882505341200100110kesim öneki: ES

26h bir komut değil, kesim önekidir: sonraki komutun bellek işleneni DS yerine ES'ten okunur/yazılır.

8B4706268825053412100010MOV r/m↔reg0D0W

88h = 100010 0 0: D = 0 → REG alanı kaynak (yazmaçtan belleğe); W = 0 → bayt.

8B470626882505341200MOD: disp yok100REG: AH101R/M: [DI]

25h = 00 100 101: W = 0 olduğundan REG 100 = AH (W = 1 olsaydı SP). Komut: mov es:[di], ah.

8B47062688250534120000010ADD AL/AX, anlık1W

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).

  1. mov [si+20h], cx
  2. add bx, [1234h]
  3. mov [bp], al
Cevabı göster
Komut1. baytModR/MKod
mov [si+20h], cx100010 0 1 = 89h01 001 100 = 4Ch89 4C 20
add bx, [1234h]000000 1 1 = 03h00 011 110 = 1Eh03 1E 34 12
mov [bp], al100010 0 0 = 88h01 000 110 = 46h88 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.

  1. 26 8A 07
  2. F3 AB
  3. 2E FF 27
Cevabı göster
BaytlarÇözümKomut
26 8A 07ES öneki; 8Ah: d = 1, w = 0; 07h = 00 000 111mov al, es:[bx]
F3 ABREP öneki; ABh = STOSWrep stosw
2E FF 27CS ö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
  1. LES sonrası ES ve DI nedir?
  2. STOSB hangi fiziksel adrese yazar?
  3. 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
  1. Kaç bayt yazılır? Son durumda DI ve CX nedir?
  2. Ekranda ne görülür?
  3. 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?

s1MIKROs2MIKSA

CLD: DF = 0, karşılaştırma soldan sağa ilerleyecek.

s1MIKROSI→010Fhs2MIKSA

SI = 010Fh: s1 (DS:SI).

s1MIKROSI→010Fhs2MIKSADI→0114h

DI = 0114h: s2 (ES:DI; .COM programında ES = DS).

s1MIKROSI→010Fhs2MIKSADI→0114h

CX = 5: en çok 5 karşılaştırma.

s1MIKROSI→0110hs2MIKSADI→0115h

'M' = 'M' → ZF = 1; SI, DI bir ilerler, CX = 4 → devam.

s1MIKROSI→0111hs2MIKSADI→0116h

'I' = 'I' → ZF = 1, CX = 3.

s1MIKROSI→0112hs2MIKSADI→0117h

'K' = 'K' → ZF = 1, CX = 2.

s1MIKROSI→0113hs2MIKSADI→0118h

'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).

  1. 011Ch'deki jmp geri 0100h'e atlıyor. Makine kodu nedir?
  2. 0100h'deki jmp ileri ile hedef arasında 127 bayt veri var. Hangi biçim seçilir?
  3. Arada 128 bayt olsaydı?
Cevabı göster
  1. Sonraki komut 011Eh; 0100h − 011Eh = −1Eh = E2h → EB E2.
  2. Kısa biçimde sonraki adres 0102h, hedef 0102h + 7Fh = 0181h; uzaklık 7Fh = +127 sığar → EB 7F.
  3. +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.

Son

Bölüm 11: Komut Kodlama ve Dizgi Komutları: Çalışma Soruları
Konu anlatımı: Komut kodlama ve dizgi komutları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.