Bölüm 7: Akış Kontrolü

Bölüm 7: Akış Kontrolü · Çalışma Soruları
JMP ve etiketlerBağıl konumKoşullu atlamalarCMPJA mı, JG mi?if / elseLOOP ailesiDizi toplamıKabarcık sıralama
Sercan KÜLCÜ

Ç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ından JMP ile 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ı?

AX0000hCX0000hZF0

JMP BASLA: SAYI verisinin üzerinden atlanır; yoksa 04h 00h baytları komut sanılırdı.

AX0000hCX0004hZF0

CX = SAYI = 4 (sayaç), AX = 0.

AX0004hCX0003hZF0

Tur 1: AX = 4. DEC CX → 3, ZF = 0 → JNZ geri atlar.

AX0008hCX0002hZF0

Tur 2: AX = 8, CX = 2.

AX000ChCX0001hZF0

Tur 3: AX = 0Ch, CX = 1.

AX0010hCX0000hZF1

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.

Tur12345
AX11235
BX01123

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?

BXFFFFhCX0004hAL00hDL00hZF0Karşılaştırılan iki dizgi'A's1+0'B's1+1'C's1+2'D's1+3'A's2+0'B's2+1'X's2+2'D's2+3

BX = −1 (FFFFh): ilk INC onu 0 yapar. En fazla 4 tur.

BX0000hCX0003hAL41hDL00hZF1Karşılaştırılan iki dizgi'A's1+0'B's1+1'C's1+2'D's1+3'A's2+0'B's2+1'X's2+2'D's2+3↑ BX

Tur 1: 'A' = 'A' → ZF = 1. LOOPE: CX = 3 ≠ 0 ve ZF = 1 → devam.

BX0001hCX0002hAL42hDL00hZF1Karşılaştırılan iki dizgi'A's1+0'B's1+1'C's1+2'D's1+3'A's2+0'B's2+1'X's2+2'D's2+3↑ BX

Tur 2: 'B' = 'B' → ZF = 1, CX = 2 → devam.

BX0002hCX0001hAL43hDL00hZF0Karşılaştırılan iki dizgi'A's1+0'B's1+1'C's1+2'D's1+3'A's2+0'B's2+1'X's2+2'D's2+3↑ BX

Tur 3: 'C' ≠ 'X' → ZF = 0. LOOPE CX'i yine azaltır (1) ama ZF = 0 olduğu için döngüden çıkar.

BX0002hCX0001hAL43hDL00hZF0Karşılaştırılan iki dizgi'A's1+0'B's1+1'C's1+2'D's1+3'A's2+0'B's2+1'X's2+2'D's2+3↑ BX

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

dizi (geçiş sonunda) ve takas60h[0]55h[1]45h[2]50h[3]40h[4]00htakas

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.

dizi (geçiş sonunda) ve takas55h[0]45h[1]50h[2]40h[3]60h[4]01htakas

Geçiş 1: dört takas. En büyük 60h en sağa ulaştı. takas = 1 → JE start: yeni geçiş.

dizi (geçiş sonunda) ve takas45h[0]50h[1]40h[2]55h[3]60h[4]01htakas

Geçiş 2: üç takas (55h sağa kaydı).

dizi (geçiş sonunda) ve takas45h[0]40h[1]50h[2]55h[3]60h[4]01htakas

Geçiş 3: yalnızca 50h ile 40h takas edildi.

dizi (geçiş sonunda) ve takas40h[0]45h[1]50h[2]55h[3]60h[4]01htakas

Geçiş 4: 45h ile 40h takas edildi. Dizi artık sıralı ama program bunu henüz bilmiyor.

dizi (geçiş sonunda) ve takas40h[0]45h[1]50h[2]55h[3]60h[4]00htakas

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

Son

Bölüm 7: Akış Kontrolü: Çalışma Soruları
Konu anlatımı: akış kontrolü sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.