Bölüm 7: Akış Kontrolü
Çoktan Seçmeli · Koşulsuz Atlama
Soru 1: JMP Komutu
JMP komutu için hangisi doğrudur?
C: JMP koşulsuzdur: her durumda IP'ye yeni değer yükler, bayraklara dokunmaz. Kısa biçim EB + 1 baytlık işaretli uzaklıktır (−128…+127); daha uzak hedefler için 3 baytlık yakın biçim (E9 rel16) kullanılır. İleri ve geri atlayabilir; CX'e bakan komut LOOP ailesidir.
Çoktan Seçmeli · Koşulsuz Atlama
Soru 2: Geçerli Etiket
Aşağıdaki etiket tanımlarından hangisi geçerlidir?
D: Etiket harf, rakam ve _ içerebilir ama rakamla başlayamaz (A). Komut ve yazmaç adları etiket olamaz (B). Boşluk içeremez (C). Etiket bellekte yer kaplamaz; assembler onu bir adrese (bağıl konum) çevirir.
Hesap Sorusu · Koşulsuz Atlama
Soru 3: Bağıl Konum Hesabı
Komutlar 2 bayttır (işlem kodu + rel8). Makine kodları nedir?
(a) 0105h'deki JMP SHORT, hedef 0130h
(b) 0120h'deki JNE (75h), hedef 0100h
(c) 0100h'deki JE, hedef 0190h
Cevabı göster
Uzaklık = hedef − (komut adresi + 2).
- (a) 0130h − 0107h = 29h → EB 29.
- (b) 0100h − 0122h = −22h; ikiye tümleyen → 75 DE. İşlemci 0122h + FFDEh = 0100h hesaplar (taşan bit atılır).
- (c) 0190h − 0102h = 8Eh = 142 > 127: kısa erim dışında. 8086'da koşullu atlamanın uzun biçimi yoktur; assembler hata verir. Çözüm: ters koşulla kısa atlama (
JNE devam) ve ardındanJMPile hedefe gitmek.
Çoktan Seçmeli · Koşullu Atlamalar
Soru 4: Atlamada Kullanılmayan Bayrak
Koşullu atlama komutları aşağıdaki bayraklardan hangisini hiç sınamaz?
B: AF'yi sınayan bir atlama yoktur; AF yalnızca BCD düzeltme komutlarında (DAA, DAS, AAA, AAS) kullanılır. ZF → JZ/JNZ, CF → JC/JNC, PF → JP/JNP, SF → JS, OF → JO. JA ve JG gibi komutlar birden fazla bayrağa bakar.
Çoktan Seçmeli · Koşullu Atlamalar
Soru 5: Eş Anlamlı Atlama
Hangi komut JNC ile aynı makine kodunu (73h) üretir?
A: JNC = JNB = JAE: üçü de CF = 0 koşulunu sınar. İşaretsiz çıkarmada A ≥ B ise ödünç alınmaz, CF = 0 olur. JNA (CF = 1 veya ZF = 1), JGE (SF = OF) ve JNS (SF = 0) farklı koşullardır.
Çıktı Sorusu · Karşılaştırma
Soru 6: JA mı, JG mi?
Kod çalıştıktan sonra BL ve BH nedir? Neden farklı çıkarlar? (BX = 0000h ile başlıyor.)
MOV AL, 0F0h CMP AL, 10h JA ISARETSIZ_BUYUK MOV BL, 0 JMP DEVAM ISARETSIZ_BUYUK: MOV BL, 1 DEVAM: CMP AL, 10h JG ISARETLI_BUYUK MOV BH, 0 JMP SON ISARETLI_BUYUK: MOV BH, 1 SON: RET
Cevabı göster
BL = 01h, BH = 00h.
CMP AL, 10h: F0h − 10h = E0h → CF = 0, ZF = 0, SF = 1, OF = 0.
- JA (işaretsiz; CF = 0 ve ZF = 0): 240 > 16 → atlar, BL = 1.
- JG (işaretli; ZF = 0 ve SF = OF): SF ≠ OF → atlamaz. İşaretli yorumda F0h = −16 < 16 → BH = 0.
Aynı bitler, farklı karar: işaretsiz veride JA/JB, işaretli veride JG/JL ailesi seçilir.
Çoktan Seçmeli · Karşılaştırma
Soru 7: 80h ile 1
MOV AL, 80h ve CMP AL, 1 sonrasında JA ve JG atlar mı?
B: 80h − 01h = 7Fh: CF = 0, ZF = 0 → JA atlar (işaretsiz 128 > 1). İşaretli yorumda −128 − 1 = −129 sığmaz: OF = 1, sonuçta SF = 0. SF ≠ OF → JG atlamaz (−128 < 1). Taşma işaret bitini ters çevirdiği için karar SF ile OF birlikte verilir.
Hata Bulma · Karşılaştırma
Soru 8: if / else Hatası
Kod, AX = BX ise CX = 1, değilse CX = 2 yapmak için yazıldı. AX = BX = 5 iken CX ne olur? Hata nerede, nasıl düzeltilir?
MOV AX, 5 MOV BX, 5 CMP AX, BX JNE degil MOV CX, 1 ; A bloğu (eşit) degil: MOV CX, 2 ; B bloğu (eşit değil) son: RET
Cevabı göster
CX = 2 (yanlış).
CMP sonrası ZF = 1, JNE atlamaz; A bloğu CX = 1 yapar. Ama blok bitince işlemci sıradaki satıra, yani B bloğuna geçer ve CX = 2 olur. A bloğunun sonunda B'nin üzerinden atlayan JMP eksik:
MOV CX, 1
JMP son ; B bloğunu atla
degil:
MOV CX, 2
son:Kalıp: koşulun tersiyle (JNE) A bloğu atlanır, A bloğu sonunda JMP ile B bloğu atlanır.
Çoktan Seçmeli · Karşılaştırma
Soru 9: Menzil Dışı Atlama
CMP AL, 0 ve JE cok_uzak satırında assembler "relative jump out of range" hatası veriyor (hedef 200 bayt ileride). Doğru düzeltme hangisi?
B: 8086'da koşullu atlamalar yalnızca rel8 (−128…+127) biçimindedir. Koşul ters çevrilir: eşit değilse hemen sonraki satıra kısa atlanır, eşitse yakın JMP (E9, kesim içinde her yere) uzak hedefe götürür. JE ile JZ aynı makine kodudur (A); SHORT erimi büyütmez (C); LOOPE de rel8'dir ve CX'i değiştirir (D).
Kod Yazma · Karşılaştırma
Soru 10: Aralık Denetimi
AL'de işaretli bir sayı var. Sayı −10 ile 10 arasındaysa (sınırlar dahil) BL = 1, değilse BL = 0 yapan kodu yazın. Hangi atlama ailesi seçilmeli?
Cevabı göster
MOV BL, 0 CMP AL, -10 JL disari CMP AL, 10 JG disari MOV BL, 1 disari:
Değer işaretli olduğu için JL/JG kullanılır. JB/JA ile −10 = F6h = 246 işaretsiz okunur: 5 < 246 olduğundan 5 bile aralık dışı sayılırdı.
Denendi: −11 → 0, −10 → 1, 0 → 1, 10 → 1, 11 → 0, −128 → 0, 127 → 0.
Adım Adım Çalıştırma · Döngüler
Soru 11: DEC ve JNZ ile Döngü
Kod çalıştıktan sonra AX ve CX nedir? SAYI DW 6 olsaydı?
JMP BASLA: SAYI verisinin üzerinden atlanır; yoksa 04h 00h baytları komut sanılırdı.
CX = SAYI = 4 (sayaç), AX = 0.
Tur 1: AX = 4. DEC CX → 3, ZF = 0 → JNZ geri atlar.
Tur 2: AX = 8, CX = 2.
Tur 3: AX = 0Ch, CX = 1.
Tur 4: AX = 10h (4 × 4 = 16). DEC CX → 0, ZF = 1: JNZ atlamaz, döngü biter. SAYI = 6 olsaydı 6 × 6 = 36 = 0024h.
ORG 100h JMP BASLA SAYI DW 4 BASLA: MOV CX, SAYI MOV AX, 0 TEKRAR: ADD AX, SAYI DEC CX JNZ TEKRAR RET
Çoktan Seçmeli · Döngüler
Soru 12: CX = 0 ile LOOP
Aşağıdaki döngünün gövdesi (INC AX) kaç kez çalışır?
MOV CX, 0 MOV AX, 0 d: INC AX LOOP d
D: LOOP önce CX'i azaltır, sonra sıfır mı diye bakar. CX = 0 iken ilk LOOP CX'i FFFFh yapar; döngü CX yeniden 0 olana kadar sürer: 65.536 tur (AX sonunda yeniden 0000h olur). Önlemek için döngüden önce JCXZ ile CX = 0 durumu atlanır. LOOP sayacı olarak hep CX'i kullanır.
Çıktı Sorusu · Döngüler
Soru 13: LOOP ile Fibonacci
Kod çalıştıktan sonra AX, BX, CX ve DX nedir? (b) İlk üç satır MOV AX, 1, MOV BX, 2, MOV CX, 4 olsaydı?
MOV AX, 0 MOV BX, 1 MOV CX, 5 DONGU: MOV DX, AX ADD AX, BX MOV BX, DX LOOP DONGU RET
Cevabı göster
AX = 0005h, BX = 0003h, CX = 0000h, DX = 0003h.
| Tur | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| AX | 1 | 1 | 2 | 3 | 5 |
| BX | 0 | 1 | 1 | 2 | 3 |
DX eski AX'i saklar, AX ← AX + BX, BX ← eski AX. LOOP: CX ← CX − 1, CX ≠ 0 ise atla.
(b) AX = 000Bh, BX = DX = 0007h, CX = 0000h.
Çoktan Seçmeli · Döngüler
Soru 14: EQU Sabiti ve 10 Tur
Kod çalıştıktan sonra AX nedir?
max_iterations EQU 10 XOR AX, AX MOV BX, 1 MOV CX, max_iterations loop1: MOV DX, AX ADD AX, BX MOV BX, DX LOOP loop1
A: max_iterations bir EQU sabitidir: bellekte yer kaplamaz, assembler her kullanımda 10 yazar. XOR AX, AX AX'i sıfırlar (MOV AX, 0'dan kısadır). 10 turda AX Fibonacci dizisinde ilerler: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 → 55 = 0037h (BX = 34 = 0022h). 0055h, 55'i onaltılık sanmaktır.
Çıktı Sorusu · Döngüler
Soru 15: LOOP mu, SUB ve JNZ mi?
Program bittiğinde total ve AX nedir? loop l1 yerine sub cx, 1 ve jnz l1 yazılsaydı sonuç değişir miydi? İki yazım nasıl farklıdır?
mov bx, offset num1 mov cx, 10 mov ax, 0 l1: add ax, [bx] add bx, 2 loop l1 mov [total], ax ret num1: dw 10, 20, 30, 40, 50 dw 10, 20, 30, 40, 50 total: dw 0
Cevabı göster
total = AX = 012Ch (10 + 20 + 30 + 40 + 50 = 150, iki kez → 300).
BX her turda 2 artar, çünkü elemanlar DW (2 bayt).
Sonuç değişmez: iki yazım da 10 tur döner. Fark bayraklardadır: LOOP CX'i azaltırken bayraklara dokunmaz ve 2 bayttır; SUB CX, 1 ZF, SF, CF… bayraklarını değiştirir, JNZ ZF'ye bakar. Ayrıca SUB/JNZ ile sayaç olarak herhangi bir yazmaç kullanılabilir.
Adım Adım Çalıştırma · Döngüler
Soru 16: LOOPE ile Dizgi Karşılaştırma
İki dizgi LOOPE ile karşılaştırılıyor. Döngü kaç turda biter? Sonunda BX, CX ve DL nedir?
BX = −1 (FFFFh): ilk INC onu 0 yapar. En fazla 4 tur.
Tur 1: 'A' = 'A' → ZF = 1. LOOPE: CX = 3 ≠ 0 ve ZF = 1 → devam.
Tur 2: 'B' = 'B' → ZF = 1, CX = 2 → devam.
Tur 3: 'C' ≠ 'X' → ZF = 0. LOOPE CX'i yine azaltır (1) ama ZF = 0 olduğu için döngüden çıkar.
LOOP ailesi bayraklara dokunmaz: ZF = 0 korundu, JNE farkli'ye atlar. DL = 0, BX = 2 ilk farklı konumdur.
ORG 100h MOV BX, -1 MOV CX, 4 kars: INC BX MOV AL, s1[BX] CMP AL, s2[BX] LOOPE kars JNE farkli MOV DL, 1 ; eşit RET farkli: MOV DL, 0 ; farklı RET s1 DB 'ABCD' s2 DB 'ABXD'
Kod Okuma · Örnek Programlar
Soru 17: İndisli Adresleme ve CMP
(a) total ne olur? (b) cmp bx, 20 yerine cmp bx, 18 yazılsaydı? (c) En baştaki jmp start neden gerekli?
jmp start num1: dw 10, 20, 30, 40, 50 dw 10, 20, 30, 40, 50 total: dw 0 start: mov bx, 0 mov ax, 0 l1: add ax, [num1+bx] add bx, 2 cmp bx, 20 jne l1 mov [total], ax ret
Cevabı göster
(a) total = 012Ch (300). BX = 0, 2, …, 18 → 10 eleman; BX = 20 olunca ZF = 1, JNE atlamaz (20 = 10 eleman × 2 bayt).
(b) BX = 18 olunca döngü biter, son eleman toplanmaz: 300 − 50 = 250 = 00FAh.
(c) Veriler kodun önünde. JMP olmasaydı işlemci 0Ah 00h 14h… veri baytlarını komut sanıp yürütürdü.
[num1+bx]: sabit adres + indis yazmacı (indisli adresleme).
Adım Adım Çalıştırma · Örnek Programlar
Soru 18: Kabarcık Sıralama
Program bittiğinde dizi ne olur? Kaç geçiş yapılır, toplam kaç takas olur? (Adımlar her geçişin sonunu gösterir.)
Başlangıç: 60h 55h 45h 50h 40h. Her geçişte komşu iki bayt karşılaştırılır; büyük olan sağa kayar.
Geçiş 1: dört takas. En büyük 60h en sağa ulaştı. takas = 1 → JE start: yeni geçiş.
Geçiş 2: üç takas (55h sağa kaydı).
Geçiş 3: yalnızca 50h ile 40h takas edildi.
Geçiş 4: 45h ile 40h takas edildi. Dizi artık sıralı ama program bunu henüz bilmiyor.
Geçiş 5: hiç takas yok → takas = 0, JE atlamaz, RET. Sonuç: 40h 45h 50h 55h 60h; 5 geçiş, 9 takas, 20 karşılaştırma. JBE işaretsiz karşılaştırmadır.
ORG 100h jmp start dizi db 60h, 55h, 45h, 50h, 40h takas db 0 start: mov bx, 0 mov takas, 0 gecis: mov al, dizi[bx] cmp al, dizi[bx+1] jbe sirali mov dl, dizi[bx+1] mov dizi[bx+1], al mov dizi[bx], dl mov takas, 1 sirali: inc bx cmp bx, 4 jne gecis cmp takas, 1 je start ret