Bölüm 10: Komut Kümesi

Bölüm 10: Komut Kümesi · Çalışma Soruları
Komut yapısıMakine koduAdreslemeVeri taşımaAritmetikMantıkKaydırmaDizgiKontrol aktarmaİş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 · 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.

  1. mov al, [bx+si+10h]
  2. mov ax, [bp+di]
  3. mov cl, es:[bx]
  4. mov dl, [bx+di]
Cevabı göster
KomutKesimEAFiziksel adres
[bx+si+10h]DS1020h1B020h
[bp+di]SSF120h3E120h (ve 3E121h)
es:[bx]ES0FF0h30FF0h
[bx+di]DS0010h1A010h

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?

  1. mov al, 0C8h · add al, 50h
  2. mov al, 50h · add al, 50h
  3. mov al, 50h · sub al, 0C8h
Cevabı göster
ALCFOFSFZFPF
118h10001
2A0h01101
388h11101
  • 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?

AX0058hAF0CF0AH0000000000AL0101100058

AL = 58h: paketli BCD, onluk 58.

AX00BFhAF0CF0AH0000000000AL10111111BF

İkili toplama 58h + 67h = BFh. Düşük nibble Fh > 9: geçerli BCD değil. 8 + 7 = 15 < 16 → AF = 0.

AX0025hAF1CF1AH0000000000AL0010010125

DAA: düşük nibble > 9 → +06h (C5h, AF = 1); AL baştan > 99h → +60h → 25h, CF = 1.

AX0025hAF1CF1AH0000000000AL0010010125

AH = 0. MOV bayrakları değiştirmez; CF = 1 korunur.

AX0125hAF0CF0AH0000000101AL0010010125

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?

AL96h1b70b60b51b40b31b21b10b00CF

AL = 96h = 1001 0110b.

AL2Ch0b70b61b50b41b31b20b10b01CF

SHL: bitler sola, sağdan 0 girer, b7 (1) CF'ye → AL = 2Ch, CF = 1.

AL96h1b70b60b51b40b31b21b10b00CF

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.

ALCBh1b71b60b50b41b30b21b11b00CF

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, 4 yazı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?

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

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

Son

Bölüm 10: Komut Kümesi: Çalışma Soruları
Konu anlatımı: Komut kümesi sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.