Bölüm 13: Final Çalışma Soruları

Mikroişlemciler
Veri taşımaDeğişkenlerDolaylı adreslemeAritmetik ve mantıkAkış kontrolü ve döngülerYığın ve prosedürlerMakrolarKomut kümesiAygıtlar ve kesmeler
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Kod izleme

Kısa bir 8086 programını komut komut izleyip yazmaç, bayrak ve bellek içeriklerini onaltılık olarak yazmak.

Aritmetik ve bayraklar

ADD, SUB, MUL, DIV, mantık ve kaydırma komutlarının sonucunu ve etkilediği bayrakları bulmak.

Döngü, yığın, prosedür

DEC/JNZ, LOOP, CMP ile dallanma, PUSH/POP ve CALL/RET davranışını adım adım açıklamak.

Makro, aygıt, kesme

Makro genişletmeyi, IN/OUT kurallarını ve BIOS/DOS kesme servislerini doğru kullanmak.

Giriş

Bu Sunum Nasıl Kullanılır?

1 · Kodu okuyunHer soruda kısa bir program ya da kavram sorusu var. Çoğunda soru: "Kod çalıştıktan sonra AX, BX … ne olur?"
2 · Kâğıtta izleyinHer komuttan sonra değişen yazmacı yazın. Sayıların ondalık mı onaltılık mı (10 / 10h) verildiğine dikkat edin.
3 · Kontrol edin"Cevabı göster" kutusunu açın; kod sorularında bir sonraki "İzleme" slaytında program satır satır çalışır.
  • Aksi söylenmedikçe tüm yazmaçlar 0000h ile başlar; program emu8086'da .COM olarak çalışır (ORG 100h, SP = FFFEh, CS = DS = SS).
  • İzleme slaytlarında @num1+2 gösterimi, yazmacın num1 etiketinin adresi + 2 değerini tuttuğunu anlatır.
  • Kod MASM/emu8086 yazımıyla verilmiştir: MOV AX, SAYI değişkenin değerini, OFFSET SAYI / LEA ise adresini verir.

Soru 1 · Veri Taşıma

Soru 1: 8 Bitlik Yazmaç Parçaları

Aşağıdaki kod çalıştıktan sonra AX, BX ve CX yazmaçlarının içeriği ne olur?

MOV AX, 0x4321
MOV BL, AL
MOV CL, AH

; (b) şıkkı:
; MOV AX, 0x4231
; MOV BL, AL
; MOV CH, AH
Cevabı göster

AX = 4321h, BX = 0021h, CX = 0043h

  • AX = AH:AL → AH = 43h, AL = 21h.
  • MOV BL, AL yalnız BX'in düşük baytını yazar; BH = 00h kalır.
  • MOV CL, AH → CL = 43h → CX = 0043h.
  • (b) AX = 4231h, BX = 0031h, CX = 4200h: CH, CX'in yüksek baytıdır.

Sonuç, dokunulmayan baytların (BH, CL) başlangıçta 00h olmasına bağlıdır.

Soru 1 · Çözüm

Soru 1: Adım Adım Çözüm

AX ← 4321h: AH = 43h, AL = 21h. 0x öneki onaltılık demektir.

BL ← AL = 21h. BH değişmez (00h) → BX = 0021h.

CL ← AH = 43h → CX = 0043h. MOV hiçbir bayrağı etkilemez.

MOV AX, 0x4321
MOV BL, AL
MOV CL, AH

Soru 2 · Veri Taşıma

Soru 2: XCHG ile Takas

Aşağıdaki kod çalıştıktan sonra CX ve DX yazmaçlarının içeriği ne olur? (b) İlk iki satır MOV CX, 07h ve MOV DX, 13h olsaydı?

MOV CX, 5h
MOV DX, 15h
XCHG CX, DX
Cevabı göster

CX = 0015h, DX = 0005h

  • XCHG iki işlenenin içeriğini tek komutta değiştirir; geçici yazmaç gerekmez, bayraklar etkilenmez.
  • 15h onaltılıktır (ondalık 21); cevap yine onaltılık yazılır.
  • (b) CX = 0013h, DX = 0007h.
  • Kurallar: işlenenler aynı boyutta olmalı, ikisi birden bellek olamaz, segment yazmacı kullanılamaz.

Soru 2 · Çözüm

Soru 2: Adım Adım Çözüm

CX ← 0005h.

DX ← 0015h (ondalık 21).

XCHG: CX ↔ DX aynı anda değişir → CX = 0015h, DX = 0005h.

MOV CX, 5h
MOV DX, 15h
XCHG CX, DX

Soru 3 · Veri Taşıma

Soru 3: Doğrudan Adresleme

MOV AX, [0x1000] ve MOV [0x2000], BX komutları ne işe yarar? DS = 0700h ise hangi fiziksel adreslere erişilir?

MOV AX, [0x1000]
MOV [0x2000], BX

; (b) şıkkı:
; MOV BX, [0x1500]
; MOV [0x2200], AX
Cevabı göster
  • Köşeli parantezdeki sayı bir ofsettir (doğrudan adresleme). Veri erişiminde varsayılan kesim DS'dir.
  • Fiziksel adres = DS × 10h + ofset = 07000h + 1000h = 08000h. AX 16 bit olduğundan iki bayt okunur: AL ← [08000h], AH ← [08001h].
  • MOV [0x2000], BX: 07000h + 2000h = 09000h; BL → [09000h], BH → [09001h].
  • (b) BX ← [08500h] sözcüğü; AX → 09200h ve 09201h.

Veri için kesim DS'dir (BP'li adreslerde SS). .COM programında CS = DS olduğundan sayısal sonuç CS ile hesaplansa da aynı çıkar.

Soru 4 · Veri Taşıma

Soru 4: DB, DW ve DD

Değişken tanımlarken kullanılan DB, DW ve DD anahtar kelimelerinin özelliği nedir? X DW 1234h bellekte nasıl saklanır?

A  DB 41h          ; 1 bayt
S  DB 'Merhaba$'   ; bayt dizisi
X  DW 1234h        ; 2 bayt
Y  DD 12345678h    ; 4 bayt
Z  DW ?            ; ilk değersiz
T  DB 5 DUP(0)     ; 5 bayt sıfır
Cevabı göster
YönergeBoyutKullanım
DB (Define Byte)1 baytkarakter, dizgi, 0–255
DW (Define Word)2 bayt16 bitlik sayı, adres
DD (Define Double Word)4 bayt32 bitlik sayı
  • Yönerge değişkenin boyutunu belirler; çevirici bellekte o kadar yer ayırır.
  • Küçük uçlu (little-endian) saklama: X → [X] = 34h, [X+1] = 12h. Y → 78 56 34 12.
  • Boyut uyuşmalı: MOV AL, X hatalıdır; MOV AL, BYTE PTR X → AL = 34h.

Soru 5 · Değişkenler

Soru 5: Değişkenlerle Toplama

Kod çalıştıktan sonra AX yazmacının içeriği sırayla ne olur? SONUC değişkeninde ne bulunur? (b) DEGER1 = 1225H, DEGER2 = 2133H olsaydı?

JMP BASLA
DEGER1 DW 125H
DEGER2 DW 133H
SONUC DW ?
BASLA:
MOV AX, DEGER1
ADD AX, DEGER2
MOV SONUC, AX
END BASLA
Cevabı göster

AX: 0125h → 0258h, SONUC = 0258h

  • 125h + 133h = 258h (5+3 = 8, 2+3 = 5, 1+1 = 2; elde yok).
  • MOV SONUC, AX AX'i değiştirmez; bellekte 58h, 02h sırasıyla durur.
  • JMP BASLA veri baytlarının komut gibi çalıştırılmasını önler; END BASLA kaynak kodun sonunu ve giriş noktasını bildirir.
  • (b) AX: 1225h → 3358h.

Soru 5 · Çözüm

Soru 5: Adım Adım Çözüm

JMP BASLA: veri tanımlarının üzerinden atlanır; veriler komut olarak çalıştırılmaz.

AX ← DEGER1 = 0125h. MASM/emu8086'da değişken adı bellekteki değeri temsil eder.

AX ← 0125h + 0133h = 0258h.

SONUC ← AX = 0258h (bellekte 58h, 02h). AX değişmez.

END BASLA makine kodu üretmez; program biter.

JMP BASLA
DEGER1 DW 125H
DEGER2 DW 133H
SONUC DW ?
BASLA:
MOV AX, DEGER1
ADD AX, DEGER2
MOV SONUC, AX
END BASLA

Soru 6 · Değişkenler

Soru 6: RET'ten Sonra Gelen Veriler

(a) Soldaki iki sayılı kodda AX ve BX ne olur? (b) Sağdaki üç sayılı kodda AX, BX ve num4 ne olur?

; (a)
MOV AX, SAYI1
MOV BX, SAYI2
ADD AX, BX
RET
SAYI1 DW 5H
SAYI2 DW 10H

; (b)
mov ax, num1     ; 1. sayı
mov bx, num2     ; 2. sayı
add ax, bx
mov bx, num3     ; 3. sayı
add ax, bx
mov num4, ax     ; toplamı sakla
ret
num1 dw 5
num2 dw 10
num3 dw 15
num4 dw 0
Cevabı göster

(a) AX = 0015h, BX = 0010h — 10H onaltılıktır: 5h + 10h = 15h.

(b) AX = 001Eh, BX = 000Fh, num4 = 001Eh — burada 10 ve 15 ondalıktır: 5 + 10 + 15 = 30 = 1Eh.

  • Veriler RET'ten sonra olduğu için hiç çalıştırılmaz; JMP gerekmez.
  • BX son olarak num3'ü (000Fh) taşır.

Etiket iki noktayla tanımlanırsa (num1: dw 5) NASM'da ad adres demektir; değer okumak için [num1] yazılır.

Soru 6 · Çözüm

Soru 6: Adım Adım Çözüm

AX ← num1 = 0005h.

BX ← num2 = 10 = 000Ah (ondalık 10!).

AX ← 0005h + 000Ah = 000Fh.

BX ← num3 = 15 = 000Fh.

AX ← 000Fh + 000Fh = 001Eh (30).

num4 ← AX = 001Eh.

RET: program biter. Alttaki veri satırları çalıştırılmaz.

mov ax, num1     ; 1. sayı
mov bx, num2     ; 2. sayı
add ax, bx
mov bx, num3     ; 3. sayı
add ax, bx
mov num4, ax     ; toplamı sakla
ret
num1 dw 5
num2 dw 10
num3 dw 15
num4 dw 0

Soru 7 · Değişkenler

Soru 7: LEA ile Adres Almak

Kod çalıştıktan sonra AX, BX ve num3 ne olur? LEA komutu ne yapar?

lea si, num1
mov ax, [si]     ; 1. sayı
lea si, num2
mov bx, [si]     ; 2. sayı
add ax, bx
lea si, num3
mov [si], ax     ; num3'e yaz
ret
num1: dw 5
num2: dw 10
num3: dw 0
Cevabı göster

AX = 000Fh, BX = 000Ah, num3 = 000Fh (5 + 10 = 15)

  • LEA SI, num1 SI'ya num1'in adresini (ofsetini) yükler; MOV SI, OFFSET num1 ile aynı işi yapar.
  • [SI] bu adresteki sözcüğe erişir (yazmaç dolaylı adresleme).
  • Toplam num3'ün üzerine yazılır.

Soru 7 · Çözüm

Soru 7: Adım Adım Çözüm

SI ← num1'in adresi (@num1). LEA belleğe erişmez, yalnız adresi hesaplar.

AX ← [SI] = 0005h.

SI ← @num2.

BX ← [SI] = 000Ah.

AX ← 0005h + 000Ah = 000Fh.

SI ← @num3.

[SI] ← AX: num3 = 000Fh.

RET: program biter.

lea si, num1
mov ax, [si]     ; 1. sayı
lea si, num2
mov bx, [si]     ; 2. sayı
add ax, bx
lea si, num3
mov [si], ax     ; num3'e yaz
ret
num1: dw 5
num2: dw 10
num3: dw 0

Soru 8 · Dolaylı Adresleme

Soru 8: Taban + Yer Değiştirme: [SI+2]

Kod çalıştıktan sonra AX ve BX ne olur? (b) Veriler 8, 10, 12 olsaydı? (c) Veriler 5, 10, 15, 0 olup sona MOV [SI+6], AX eklenseydi?

MOV SI, OFFSET SAYI1
MOV AX, [SI]
MOV BX, [SI+2]
ADD AX, BX
MOV BX, [SI+4]
ADD AX, BX
RET
SAYI1: DW 7
DW 9
DW 11
Cevabı göster

AX = 001Bh, BX = 000Bh (7 + 9 + 11 = 27 = 1Bh)

  • Etiketsiz DW satırları bir öncekinin hemen arkasına yerleşir: 7 → SAYI1, 9 → SAYI1+2, 11 → SAYI1+4.
  • Sözcükler 2 bayt olduğu için ofsetler 2'şer artar.
  • BX son olarak 11 = 000Bh'yi tutar.
  • (b) AX = 001Eh, BX = 000Ch.
  • (c) AX = 001Eh, BX = 000Fh ve dördüncü sözcük [SI+6] = 001Eh olur.

Soru 8 · Çözüm

Soru 8: Adım Adım Çözüm

SI ← SAYI1'in adresi (@SAYI1).

AX ← [SI] = 0007h.

BX ← [SI+2] = 0009h.

AX ← 7 + 9 = 0010h.

BX ← [SI+4] = 000Bh (11).

AX ← 0010h + 000Bh = 001Bh (27).

RET: program biter. AX = 001Bh, BX = 000Bh.

MOV SI, OFFSET SAYI1
MOV AX, [SI]
MOV BX, [SI+2]
ADD AX, BX
MOV BX, [SI+4]
ADD AX, BX
RET
SAYI1: DW 7
DW 9
DW 11

Soru 9 · Dolaylı Adresleme

Soru 9: mov si, num1: Adres mi, Değer mi?

Bu kodda amaç üç sayının toplamını dizinin dördüncü sözcüğüne yazmaktır. (a) NASM'da (b) MASM/emu8086'da birinci satır SI'ya ne yükler? Kod emu8086'da nasıl düzeltilir?

mov si, num1
mov ax, [si]
mov bx, [si+2]
add ax, bx
mov bx, [si+4]
add ax, bx
mov [si+6], ax
ret
num1: dw 5, 10, 15, 0
Cevabı göster
  • (a) NASM'da etiket adı adres demektir: SI = num1'in adresi. Sonuç AX = 001Eh, dördüncü sözcük = 001Eh. Değer okumak için [num1] yazılır.
  • (b) MASM sözdiziminde veri tanımlı bir ad (ör. num1 DW 5, 10, 15, 0) değişkendir; mov si, num1 içeriği (0005h) yükler. [SI] artık 0005h adresindeki ilgisiz baytları okur, [si+6]'ya yazmak da başka bir yeri bozar.
  • Güvenli yazım: mov si, offset num1 ya da lea si, num1.

Bu sunumdaki ders örnekleri bu nedenle OFFSET/LEA ile yazılmıştır.

Soru 10 · Dolaylı Adresleme

Soru 10: Toplamı Bellekte Biriktirmek

Kod çalıştıktan sonra num1 dizisinin dört sözcüğü ve AX ne olur? Neden her sayı önce AX'e alınıyor?

mov bx, offset num1
mov ax, [bx]       ; 1. sayı
mov [bx+6], ax     ; sonuca yaz
mov ax, [bx+2]     ; 2. sayı
add [bx+6], ax     ; sonuca ekle
mov ax, [bx+4]     ; 3. sayı
add [bx+6], ax     ; sonuca ekle
ret
num1: dw 5, 10, 15, 0
Cevabı göster

num1 = 0005h, 000Ah, 000Fh, 001Eh; AX = 000Fh

  • Toplam doğrudan bellekte ([BX+6]) biriktirilir; ADD'in hedefi bellek olabilir.
  • Ancak iki işlenen birden bellek olamaz (add [bx+6], [bx+2] geçersiz), bu yüzden her sayı önce AX'e alınır.
  • AX en son üçüncü sayıyı (15 = 000Fh) taşır; toplam AX'te değil bellektedir.

Soru 10 · Çözüm

Soru 10: Adım Adım Çözüm

BX ← num1'in adresi.

AX ← [BX] = 0005h.

[BX+6] ← 0005h: dördüncü sözcük artık 0005h.

AX ← [BX+2] = 000Ah.

[BX+6] ← 0005h + 000Ah = 000Fh.

AX ← [BX+4] = 000Fh.

[BX+6] ← 000Fh + 000Fh = 001Eh (30).

RET. Toplam bellekte; AX = 000Fh.

mov bx, offset num1
mov ax, [bx]       ; 1. sayı
mov [bx+6], ax     ; sonuca yaz
mov ax, [bx+2]     ; 2. sayı
add [bx+6], ax     ; sonuca ekle
mov ax, [bx+4]     ; 3. sayı
add [bx+6], ax     ; sonuca ekle
ret
num1: dw 5, 10, 15, 0

Soru 11 · Dolaylı Adresleme

Soru 11: Bayt Dizisi: [BX+1], [BX+2]

Kod çalıştıktan sonra AL, DL ve num1 dizisi ne olur? Ofsetler neden 1'er artıyor? İkinci sayı DL yerine BL'ye yüklenseydi ne olurdu?

mov bx, offset num1
mov al, [bx]       ; 1. sayı
mov dl, [bx+1]     ; 2. sayı
add al, dl
mov dl, [bx+2]     ; 3. sayı
add al, dl
mov [bx+3], al     ; num1+3'e yaz
ret
num1: db 5, 10, 15, 0
Cevabı göster

AL = 1Eh, DL = 0Fh, num1 = 05h 0Ah 0Fh 1Eh

  • DB ile tanımlı elemanlar 1 bayttır: [BX], [BX+1], [BX+2], [BX+3].
  • Yazmaçlar da 8 bitlik seçilmelidir (AL, DL).
  • BL kullanılsaydı BX'in düşük baytı, yani adres değişirdi; sonraki [bx+2] yanlış yeri okurdu.

Soru 11 · Çözüm

Soru 11: Adım Adım Çözüm

BX ← num1'in adresi.

AL ← [BX] = 05h.

DL ← [BX+1] = 0Ah.

AL ← 05h + 0Ah = 0Fh.

DL ← [BX+2] = 0Fh.

AL ← 0Fh + 0Fh = 1Eh.

[BX+3] ← AL = 1Eh.

RET: AL = 1Eh, num1 = 05 0A 0F 1E.

mov bx, offset num1
mov al, [bx]       ; 1. sayı
mov dl, [bx+1]     ; 2. sayı
add al, dl
mov dl, [bx+2]     ; 3. sayı
add al, dl
mov [bx+3], al     ; num1+3'e yaz
ret
num1: db 5, 10, 15, 0

Soru 12 · Aritmetik ve Mantık

Soru 12: Yüksek Bayta Ekleme

Aşağıdaki kod çalıştıktan sonra AX ne olur? (b) İkinci satır ADD AH, 0x001E olsaydı?

MOV AX, 0x00F0
ADD AH, 0x0010
Cevabı göster

AX = 10F0h

  • AH = 00h, AL = F0h. ADD AH, 10h yalnız AH'yi değiştirir: AH = 10h.
  • Anlık değer 0x0010 yazılsa da hedef 8 bit olduğundan 10h bayt olarak kullanılır.
  • AL (F0h) değişmez; bayraklar: CF = 0, ZF = 0, SF = 0.
  • (b) AH = 1Eh → AX = 1EF0h.

Soru 12 · Çözüm

Soru 12: Adım Adım Çözüm

AX ← 00F0h: AH = 00h, AL = F0h. MOV bayrakları etkilemez.

AH ← 00h + 10h = 10h → AX = 10F0h. Sonuç sıfır değil, elde yok: ZF = 0, CF = 0.

MOV AX, 0x00F0
ADD AH, 0x0010

Soru 13 · Aritmetik ve Mantık

Soru 13: AX Sırayla Ne Olur?

Kod çalıştıktan sonra AX yazmacının içeriği her satırdan sonra sırayla ne olur? (AX = 0000h ile başlıyor.) (b) MOV AH, 0AH ve MOV AL, 0BH ile?

MOV AH, 09H
MOV AL, 05H
ADD AL, AH
Cevabı göster

AX: 0900h → 0905h → 090Eh

  • AH'ye yazmak AX'in üst baytını, AL'ye yazmak alt baytını değiştirir.
  • 09h + 05h = 0Eh (14); AH değişmez.
  • (b) 0A00h → 0A0Bh → 0A15h (10 + 11 = 21 = 15h; alt dörtlüden elde çıktığı için AF = 1).

Soru 13 · Çözüm

Soru 13: Adım Adım Çözüm

AH ← 09h → AX = 0900h.

AL ← 05h → AX = 0905h.

AL ← 05h + 09h = 0Eh → AX = 090Eh. 0Eh = 0000 1110b: üç adet 1 → PF = 0.

MOV AH, 09H
MOV AL, 05H
ADD AL, AH

Soru 14 · Aritmetik ve Mantık

Soru 14: Çıkarmada Negatif Sonuç

Kod çalıştıktan sonra AX ve BX ne olur? CF, ZF, SF, OF, AF ve PF bayrakları kaç olur?

MOV AL, 05H
MOV BL, 08H
SUB AL, BL
Cevabı göster

AX = 00FDh, BX = 0008h

  • 05h − 08h = −3 → 8 bitte ikiye tümleyen: FDh. AH değişmez (00h).
  • CF = 1 (borç alındı), SF = 1 (bit 7 = 1), ZF = 0.
  • OF = 0: işaretli yorumda 5 − 8 = −3 doğru ve aralıkta.
  • AF = 1 (alt dörtlüde 5 − 8 borç); PF = 0 (FDh = 1111 1101b → yedi adet 1).

Soru 14 · Çözüm

Soru 14: Adım Adım Çözüm

AL ← 05h → AX = 0005h.

BL ← 08h → BX = 0008h.

AL ← 05h − 08h = FDh (−3). Borç: CF = 1; SF = 1; AF = 1; PF = 0. AX = 00FDh.

MOV AL, 05H
MOV BL, 08H
SUB AL, BL

Soru 15 · Aritmetik ve Mantık

Soru 15: MUL, DIV ve Ondalık 10

Kod çalıştıktan sonra AX ve CX ne olur?

MOV CL, 4H
MOV AL, 3H
MUL CL
MOV CL, 2H
DIV CL
ADD AL, 10
Cevabı göster

AX = 0010h, CX = 0002h

  • MUL CL: AX ← AL × CL = 3 × 4 = 12 = 000Ch.
  • DIV CL: AX ÷ CL → AL = bölüm 06h, AH = kalan 00h.
  • ADD AL, 10: 10 ondalıktır (= 0Ah): 06h + 0Ah = 10h.
  • Tuzak: "10" ile "10h" farklıdır; 10h yazılsaydı AL = 16h olurdu.

Soru 15 · Çözüm

Soru 15: Adım Adım Çözüm

CL ← 04h.

AL ← 03h.

MUL CL: AX ← AL × CL = 3 × 4 = 000Ch.

CL ← 02h.

DIV CL: 000Ch ÷ 2 → AL = 06h (bölüm), AH = 00h (kalan).

AL ← 06h + 10 (= 0Ah) = 10h → AX = 0010h, CX = 0002h.

MOV CL, 4H
MOV AL, 3H
MUL CL
MOV CL, 2H
DIV CL
ADD AL, 10

Soru 16 · Aritmetik ve Mantık

Soru 16: DIV ile Bölüm ve Kalan

Kod çalıştıktan sonra AX ne olur? AH ve AL neyi gösterir? BL = 0 olsaydı ne olurdu?

MOV AX, 100
MOV BL, 7
DIV BL
Cevabı göster

AX = 020Eh

  • 100 (ondalık) = 0064h. 8 bitlik bölmede bölünen AX'tir.
  • 100 ÷ 7 = 14, kalan 2 → AL = 0Eh (bölüm), AH = 02h (kalan).
  • BL = 0 ise ya da bölüm 8 bite sığmazsa (ör. AX = 0400h, BL = 2 → 200h) işlemci bölme hatası kesmesi (INT 0) üretir.

Soru 16 · Çözüm

Soru 16: Adım Adım Çözüm

AX ← 100 = 0064h.

BL ← 07h.

DIV BL: 100 ÷ 7 → AL = 0Eh (14), AH = 02h (kalan) → AX = 020Eh.

MOV AX, 100
MOV BL, 7
DIV BL

Soru 17 · Aritmetik ve Mantık

Soru 17: Çarpımın Üst 16 Biti

8086'da 16 bitlik çarpmada çarpımın üst 16 biti hangi yazmaçta saklanır? Soldaki kodda DX ve AX ne olur?

MOV AX, 1234h
MOV BX, 0100h
MUL BX
  1. DX
  2. AX
  3. BX
  4. CX
Cevabı göster

a) DX

  • MUL BX: DX:AX ← AX × BX = 1234h × 0100h = 0012 3400h → DX = 0012h, AX = 3400h.
  • Üst yarı sıfır olmadığı için CF = OF = 1.
  • 8 bitlik MUL'de sonuç yalnız AX'tedir (AH:AL).

Soru 17 · Çözüm

Soru 17: Adım Adım Çözüm

AX ← 1234h.

BX ← 0100h.

MUL BX: 1234h × 0100h = 0012 3400h → DX = 0012h, AX = 3400h; CF = OF = 1.

MOV AX, 1234h
MOV BX, 0100h
MUL BX

Soru 18 · Aritmetik ve Mantık

Soru 18: AND, OR, XOR, TEST

Her komuttan sonra AL ne olur? TEST'ten sonra ZF ve SF kaç olur?

MOV AL, 6Ch
AND AL, 0Fh
OR  AL, 30h
XOR AL, 0FFh
TEST AL, 80h
Cevabı göster

AL: 6Ch → 0Ch → 3Ch → C3h → C3h; TEST sonrası ZF = 0, SF = 1

  • AND 0Fh üst dörtlüyü sıfırlar (maskeleme): 0110 1100 → 0000 1100.
  • OR 30h bit 4 ve 5'i 1 yapar: 0011 1100 = 3Ch.
  • XOR 0FFh tüm bitleri ters çevirir: 1100 0011 = C3h.
  • TEST AND yapar ama sonucu yazmaz: C3h AND 80h = 80h ≠ 0 → ZF = 0, SF = 1; AL değişmez.
  • Mantık komutları her zaman CF = OF = 0 yapar.

Soru 18 · Çözüm

Soru 18: Adım Adım Çözüm

AL ← 6Ch = 0110 1100b.

AL ← 6Ch AND 0Fh = 0Ch. CF = OF = 0.

AL ← 0Ch OR 30h = 3Ch.

AL ← 3Ch XOR FFh = C3h (bitler ters). SF = 1.

TEST: C3h AND 80h = 80h ≠ 0 → ZF = 0, SF = 1. AL = C3h değişmez.

MOV AL, 6Ch
AND AL, 0Fh
OR  AL, 30h
XOR AL, 0FFh
TEST AL, 80h

Soru 19 · Akış Kontrolü

Soru 19: DEC ve JNZ ile Döngü

Kod çalıştıktan sonra AX ve CX ne olur? (b) SAYI DW 6 olsaydı?

JMP BASLA
SAYI DW 4
BASLA:
MOV CX, SAYI
MOV AX, 0
TEKRAR:
ADD AX, SAYI
DEC CX
JNZ TEKRAR
Cevabı göster

AX = 0010h, CX = 0000h

  • CX = SAYI = 4 kez döner; her turda AX'e 4 eklenir: 4 × 4 = 16 = 10h.
  • DEC CX ZF'yi etkiler; CX 0 olunca ZF = 1 ve JNZ atlamaz.
  • (b) 6 × 6 = 36 = 0024h.

JMP'de etiket iki noktasız yazılır (JMP BASLA); iki nokta yalnız etiketin tanımlandığı satırda kullanılır. loop: gibi bir etiket geçersizdir: LOOP bir komut adıdır.

Soru 19 · Çözüm

Soru 19: Adım Adım Çözüm

JMP BASLA: SAYI verisinin üzerinden atlanır.

CX ← SAYI = 0004h (sayaç).

AX ← 0.

AX ← AX + SAYI = 0004h.

DEC CX → CX = 0003h, ZF = 0.

ZF = 0 → JNZ, TEKRAR'a geri atlar.

AX ← AX + SAYI = 0008h.

DEC CX → CX = 0002h, ZF = 0.

ZF = 0 → JNZ, TEKRAR'a geri atlar.

AX ← AX + SAYI = 000Ch.

DEC CX → CX = 0001h, ZF = 0.

ZF = 0 → JNZ, TEKRAR'a geri atlar.

AX ← AX + SAYI = 0010h.

DEC CX → CX = 0000h, ZF = 1.

ZF = 1 → JNZ atlamaz; döngü biter. AX = 0010h, CX = 0000h.

JMP BASLA
SAYI DW 4
BASLA:
MOV CX, SAYI
MOV AX, 0
TEKRAR:
ADD AX, SAYI
DEC CX
JNZ TEKRAR

Soru 20 · Akış Kontrolü

Soru 20: LOOP ile Fibonacci

Kod çalıştıktan sonra AX, BX, CX ve DX ne olur? (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
Cevabı göster

AX = 0005h, BX = 0003h, CX = 0000h, DX = 0003h

Tur12345
AX11235
BX = DX01123
  • DX eski AX'i saklar; AX ← AX + BX; BX ← eski AX. Fibonacci dizisi.
  • LOOP: CX ← CX − 1, CX ≠ 0 ise atla.
  • (b) AX = 000Bh, BX = 0007h, CX = 0000h, DX = 0007h.

Soru 20 · Çözüm

Soru 20: Adım Adım Çözüm

AX ← 0.

BX ← 1.

CX ← 5 (tur sayısı).

DX ← AX = 0000h (eski AX saklanır).

AX ← AX + BX = 0001h.

BX ← DX = 0000h.

LOOP: CX ← CX − 1 = 0004h ≠ 0 → DONGU'ya dön.

DX ← AX = 0001h (eski AX saklanır).

AX ← AX + BX = 0001h.

BX ← DX = 0001h.

LOOP: CX ← CX − 1 = 0003h ≠ 0 → DONGU'ya dön.

DX ← AX = 0001h (eski AX saklanır).

AX ← AX + BX = 0002h.

BX ← DX = 0001h.

LOOP: CX ← CX − 1 = 0002h ≠ 0 → DONGU'ya dön.

DX ← AX = 0002h (eski AX saklanır).

AX ← AX + BX = 0003h.

BX ← DX = 0002h.

LOOP: CX ← CX − 1 = 0001h ≠ 0 → DONGU'ya dön.

DX ← AX = 0003h (eski AX saklanır).

AX ← AX + BX = 0005h.

BX ← DX = 0003h.

LOOP: CX = 0000h → döngüden çıkılır. AX = 0005h, BX = 0003h, DX = 0003h.

MOV AX, 0
MOV BX, 1
MOV CX, 5
DONGU:
MOV DX, AX
ADD AX, BX
MOV BX, DX
LOOP DONGU

Soru 21 · Akış Kontrolü

Soru 21: EQU Sabiti ve 10 Tur

Kod çalıştıktan sonra AX, BX, CX ve DX ne olur? max_iterations bellekte yer kaplar mı? xor ax, ax ne yapar?

max_iterations equ 10
start:
xor ax, ax              ; AX = 0
mov bx, 1
mov cx, max_iterations  ; CX = 10
loop1:
mov dx, ax
add ax, bx
mov bx, dx
loop loop1
ret
Cevabı göster

AX = 0037h (55), BX = 0022h (34), CX = 0000h, DX = 0022h

  • EQU bir sabittir: bellekte yer kaplamaz; çevirici her kullanımda 10 yazar.
  • xor ax, ax AX'i sıfırlar (MOV AX, 0'dan kısa; ayrıca ZF = 1, CF = 0 yapar).
  • 10 turda AX Fibonacci dizisinde ilerler: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55.

Soru 21 · Çözüm

Soru 21: Adım Adım Çözüm

AX ← AX XOR AX = 0000h.

BX ← 1.

CX ← 10 = 000Ah (EQU sabiti).

Tur 1: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0001h (1); CX = 0009h.

Tur 2: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0001h (1); CX = 0008h.

Tur 3: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0002h (2); CX = 0007h.

Tur 4: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0003h (3); CX = 0006h.

Tur 5: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0005h (5); CX = 0005h.

Tur 6: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0008h (8); CX = 0004h.

Tur 7: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 000Dh (13); CX = 0003h.

Tur 8: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0015h (21); CX = 0002h.

Tur 9: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0022h (34); CX = 0001h.

Tur 10: DX ← eski AX, AX ← AX + BX, BX ← DX → AX = 0037h (55); CX = 0000h.

RET: AX = 0037h = 55, BX = 0022h = 34.

max_iterations equ 10
start:
xor ax, ax              ; AX = 0
mov bx, 1
mov cx, max_iterations  ; CX = 10
loop1:
mov dx, ax
add ax, bx
mov bx, dx
loop loop1
ret

Soru 22 · Akış Kontrolü

Soru 22: Dizi Toplamı: LOOP ve SUB/JNZ

Kod çalıştıktan sonra total ve AX ne olur? loop l1 yerine sub cx, 1 + jnz l1 yazılsaydı sonuç değişir miydi?

mov bx, offset num1  ; dizinin adresi
mov cx, 10           ; eleman sayısı
mov ax, 0            ; toplam = 0
l1:
add ax, [bx]         ; sayıyı ekle
add bx, 2            ; sonraki sözcük
loop l1              ; CX--, ≠0 ise dön
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. LOOP = CX'i azalt + sıfır değilse atla; bayrakları etkilemez.
  • SUB CX, 1 bayrakları etkiler; JNZ ZF'ye bakar. İki yazım da 10 tur döner.

Soru 22 · Çözüm

Soru 22: Adım Adım Çözüm

BX ← num1'in adresi.

CX ← 10 = 000Ah.

AX ← 0.

Tur 1: AX ← AX + 10 → AX = 000Ah (10); BX += 2; CX = 0009h.

Tur 2: AX ← AX + 20 → AX = 001Eh (30); BX += 2; CX = 0008h.

Tur 3: AX ← AX + 30 → AX = 003Ch (60); BX += 2; CX = 0007h.

Tur 4: AX ← AX + 40 → AX = 0064h (100); BX += 2; CX = 0006h.

Tur 5: AX ← AX + 50 → AX = 0096h (150); BX += 2; CX = 0005h.

Tur 6: AX ← AX + 10 → AX = 00A0h (160); BX += 2; CX = 0004h.

Tur 7: AX ← AX + 20 → AX = 00B4h (180); BX += 2; CX = 0003h.

Tur 8: AX ← AX + 30 → AX = 00D2h (210); BX += 2; CX = 0002h.

Tur 9: AX ← AX + 40 → AX = 00FAh (250); BX += 2; CX = 0001h.

Tur 10: AX ← AX + 50 → AX = 012Ch (300); BX += 2; CX = 0000h.

total ← AX = 012Ch.

RET: total = 012Ch = 300.

mov bx, offset num1  ; dizinin adresi
mov cx, 10           ; eleman sayısı
mov ax, 0            ; toplam = 0
l1:
add ax, [bx]         ; sayıyı ekle
add bx, 2            ; sonraki sözcük
loop l1              ; CX--, ≠0 ise dön
mov [total], ax
ret
num1: dw 10, 20, 30, 40, 50
dw 10, 20, 30, 40, 50
total: dw 0

Soru 23 · Akış Kontrolü

Soru 23: İndeksli 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       ; indeks = 0
mov ax, 0       ; toplam = 0
l1:
add ax, [num1+bx]
add bx, 2
cmp bx, 20      ; bitti mi?
jne l1
mov [total], ax
ret
Cevabı göster
  • (a) total = 012Ch. BX = 0, 2, …, 18 → 10 eleman; BX = 20 olunca ZF = 1, JNE atlamaz (20 = 10 eleman × 2 bayt).
  • (b) Son eleman toplanmaz: 300 − 50 = 250 = 00FAh.
  • (c) Veriler kodun önünde. JMP olmasaydı işlemci veri baytlarını komut sanıp çalıştırırdı.
  • [num1+bx]: sabit adres + indeks yazmacı. Aynı döngü CX ve LOOP ile de yazılabilir.

Soru 23 · Çözüm

Soru 23: Adım Adım Çözüm

JMP start: veri alanı atlanır.

BX ← 0 (indeks).

AX ← 0.

Tur 1: AX ← AX + [num1+0] → AX = 000Ah (10); BX = 0002h. BX ≠ 20 → JNE geri atlar.

Tur 2: AX ← AX + [num1+2] → AX = 001Eh (30); BX = 0004h. BX ≠ 20 → JNE geri atlar.

Tur 3: AX ← AX + [num1+4] → AX = 003Ch (60); BX = 0006h. BX ≠ 20 → JNE geri atlar.

Tur 4: AX ← AX + [num1+6] → AX = 0064h (100); BX = 0008h. BX ≠ 20 → JNE geri atlar.

Tur 5: AX ← AX + [num1+8] → AX = 0096h (150); BX = 000Ah. BX ≠ 20 → JNE geri atlar.

Tur 6: AX ← AX + [num1+10] → AX = 00A0h (160); BX = 000Ch. BX ≠ 20 → JNE geri atlar.

Tur 7: AX ← AX + [num1+12] → AX = 00B4h (180); BX = 000Eh. BX ≠ 20 → JNE geri atlar.

Tur 8: AX ← AX + [num1+14] → AX = 00D2h (210); BX = 0010h. BX ≠ 20 → JNE geri atlar.

Tur 9: AX ← AX + [num1+16] → AX = 00FAh (250); BX = 0012h. BX ≠ 20 → JNE geri atlar.

Tur 10: AX ← AX + [num1+18] → AX = 012Ch (300); BX = 0014h. BX = 20 (0014h) → ZF = 1, döngü biter.

total ← 012Ch.

RET.

jmp start
num1: dw 10, 20, 30, 40, 50
dw 10, 20, 30, 40, 50
total: dw 0
start:
mov bx, 0       ; indeks = 0
mov ax, 0       ; toplam = 0
l1:
add ax, [num1+bx]
add bx, 2
cmp bx, 20      ; bitti mi?
jne l1
mov [total], ax
ret

Soru 24 · Akış Kontrolü

Soru 24: LOOP Komutu

8086'da LOOP komutu sayaç olarak hangi yazmacı kullanır?

  1. CX
  2. BX
  3. SI
  4. DI
Cevabı göster

a) CX

  • LOOP etiket: CX ← CX − 1; CX ≠ 0 ise etikete atlar. Bayrakları etkilemez.
  • CX = 0 iken döngüye girilirse ilk LOOP CX'i FFFFh yapar ve döngü 65536 kez döner; bunu önlemek için önce JCXZ kullanılır.
  • LOOPE/LOOPZ ayrıca ZF = 1, LOOPNE/LOOPNZ ZF = 0 koşulunu ister.
  • CX dizgi komutlarında (REP) da sayaçtır.

Soru 25 · Akış Kontrolü

Soru 25: Koşullu Atlamalar ve Bayraklar

Koşullu atlama komutları aşağıdaki bayraklardan hangisinden bağımsızdır?

  1. ZF (sıfır)
  2. AF (yardımcı taşıma)
  3. CF (taşıma)
  4. PF (eşlik)
Cevabı göster

b) AF

  • AF'yi test eden bir koşullu atlama yoktur; AF yalnız BCD düzeltme komutlarında (DAA, DAS, AAA, AAS) kullanılır.
  • ZF → JZ/JE, JNZ/JNE; CF → JC/JB, JNC/JAE; PF → JP/JPE, JNP/JPO; SF → JS; OF → JO.
  • JA/JBE (CF, ZF) ve JG/JL (ZF, SF, OF) birden fazla bayrağa bakar.

Soru 26 · Akış Kontrolü

Soru 26: JA mı, JG mi?

Kod çalıştıktan sonra BL ve BH ne olur? Neden farklı çıkarlar?

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 (BX = 0001h)

  • 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.
  • Kural: işaretsiz sayılar için JA/JB, işaretli sayılar için JG/JL.

Soru 26 · Çözüm

Soru 26: Adım Adım Çözüm

AL ← F0h (işaretsiz 240, işaretli −16).

CMP: F0h − 10h = E0h (sonuç saklanmaz). CF = 0, ZF = 0, SF = 1, OF = 0.

JA: CF = 0 ve ZF = 0 → atlar.

BL ← 1.

Bayraklar yeniden kurulur (aynı değerler).

JG: ZF = 0 ama SF (1) ≠ OF (0) → atlamaz.

BH ← 0.

JMP SON.

RET: BL = 01h, BH = 00h.

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

Soru 27 · Akış Kontrolü

Soru 27: Kabarcık Sıralama (Bubble Sort)

Program bittiğinde data dizisi ne olur? Kaç geçiş yapılır, toplam kaç takas olur?

jmp start
data: db 60h, 55h, 45h, 50h, 40h
swap: db 0
start:
mov bx, 0      ; indeks = 0
mov cx, 4
mov [swap], 0  ; takas yok
loop1:
mov al, [data+bx]
cmp al, [data+bx+1]
jbe noswap     ; sıralı
mov dl, [data+bx+1]
mov [data+bx+1], al
mov [data+bx], dl
mov [swap], 1  ; takas oldu
noswap:
add bx, 1
cmp bx, 4      ; son mu?
jne loop1
cmp [swap], 1
je start       ; yeni geçiş
ret
Cevabı göster

data = 40h 45h 50h 55h 60h (küçükten büyüğe)

  • Her geçişte komşu iki bayt karşılaştırılır; büyük olan sağa kayar. JBE işaretsiz karşılaştırmadır.
  • 5 geçiş: ilk dördünde takas olur, beşincide olmaz → swap = 0, program biter.
  • Takas sayısı: 4 + 3 + 1 + 1 = 9; toplam 20 karşılaştırma.
  • mov cx, 4 kullanılmıyor; döngü BX ile sayılıyor.

Soru 27 · Çözüm

Soru 27: Adım Adım Çözüm

JMP start: veri atlanır. data = 60 55 45 50 40.

Geçiş 1, BX = 0: 60h ile 55h → takas, swap = 1.

Geçiş 1, BX = 1: 60h ile 45h → takas, swap = 1.

Geçiş 1, BX = 2: 60h ile 50h → takas, swap = 1.

Geçiş 1, BX = 3: 60h ile 40h → takas, swap = 1.

swap = 1 → JE start: yeni geçiş.

Geçiş 2, BX = 0: 55h ile 45h → takas, swap = 1.

Geçiş 2, BX = 1: 55h ile 50h → takas, swap = 1.

Geçiş 2, BX = 2: 55h ile 40h → takas, swap = 1.

Geçiş 2, BX = 3: 55h ile 60h → sıralı, takas yok.

swap = 1 → JE start: yeni geçiş.

Geçiş 3, BX = 0: 45h ile 50h → sıralı, takas yok.

Geçiş 3, BX = 1: 50h ile 40h → takas, swap = 1.

Geçiş 3, BX = 2: 50h ile 55h → sıralı, takas yok.

Geçiş 3, BX = 3: 55h ile 60h → sıralı, takas yok.

swap = 1 → JE start: yeni geçiş.

Geçiş 4, BX = 0: 45h ile 40h → takas, swap = 1.

Geçiş 4, BX = 1: 45h ile 50h → sıralı, takas yok.

Geçiş 4, BX = 2: 50h ile 55h → sıralı, takas yok.

Geçiş 4, BX = 3: 55h ile 60h → sıralı, takas yok.

swap = 1 → JE start: yeni geçiş.

Geçiş 5, BX = 0: 40h ile 45h → sıralı, takas yok.

Geçiş 5, BX = 1: 45h ile 50h → sıralı, takas yok.

Geçiş 5, BX = 2: 50h ile 55h → sıralı, takas yok.

Geçiş 5, BX = 3: 55h ile 60h → sıralı, takas yok.

swap = 0 → hiç takas olmadı, dizi sıralı. JE atlamaz.

RET: data = 40 45 50 55 60.

jmp start
data: db 60h, 55h, 45h, 50h, 40h
swap: db 0
start:
mov bx, 0      ; indeks = 0
mov cx, 4
mov [swap], 0  ; takas yok
loop1:
mov al, [data+bx]
cmp al, [data+bx+1]
jbe noswap     ; sıralı
mov dl, [data+bx+1]
mov [data+bx+1], al
mov [data+bx], dl
mov [swap], 1  ; takas oldu
noswap:
add bx, 1
cmp bx, 4      ; son mu?
jne loop1
cmp [swap], 1
je start       ; yeni geçiş
ret

Soru 28 · Yığın ve Prosedürler

Soru 28: PUSH ile Değer Saklamak

Kod çalıştıktan sonra AX yazmacının içeriği sırayla ne olur? SP nasıl değişir?

MOV AX, 1234h
PUSH AX
MOV AX, 5678h
POP AX
Cevabı göster

AX: 1234h → 1234h → 5678h → 1234h

  • PUSH AX AX'in kopyasını yığına yazar; AX değişmez. SP: FFFEh → FFFCh.
  • MOV AX, 5678h AX'i geçici olarak değiştirir.
  • POP AX yığının üstündeki 1234h'yi geri yükler; SP tekrar FFFEh.
  • Bu kalıp, bir yazmacı bozmadan geçici olarak kullanmanın yoludur.

Soru 28 · Çözüm

Soru 28: Adım Adım Çözüm

AX ← 1234h. Yığın boş, SP = FFFEh.

PUSH AX: SP ← SP − 2 = FFFCh; [SS:FFFCh] ← 1234h. AX değişmez.

AX ← 5678h (yığındaki kopya etkilenmez).

POP AX: AX ← [FFFCh] = 1234h; SP ← FFFEh.

MOV AX, 1234h
PUSH AX
MOV AX, 5678h
POP AX

Soru 29 · Yığın ve Prosedürler

Soru 29: Son Giren İlk Çıkar

Kod çalıştıktan sonra AX, BX ve CX ne olur?

MOV AX, 2
MOV BX, 4
MOV CX, 8
PUSH AX
PUSH BX
PUSH CX
POP AX
POP BX
POP CX
Cevabı göster

AX = 0008h, BX = 0004h, CX = 0002h

  • Yığın LIFO çalışır: en son itilen (CX = 8) ilk çıkar ve AX'e gider.
  • Aynı sırayla PUSH ve POP yapmak değerleri ters çevirir; korumak için POP ters sırada yazılmalıdır (POP CX, POP BX, POP AX).
  • Sonunda SP yine FFFEh: yığın dengeli.

Soru 29 · Çözüm

Soru 29: Adım Adım Çözüm

AX ← 2.

BX ← 4.

CX ← 8.

PUSH AX → SP = FFFCh.

PUSH BX → SP = FFFAh.

PUSH CX → SP = FFF8h; üstte 0008h.

POP AX ← 0008h (en son giren).

POP BX ← 0004h.

POP CX ← 0002h. SP = FFFEh.

MOV AX, 2
MOV BX, 4
MOV CX, 8
PUSH AX
PUSH BX
PUSH CX
POP AX
POP BX
POP CX

Soru 30 · Yığın ve Prosedürler

Soru 30: Yığın İşaretçisi (SP)

Yığın işaretçisi (SP) hakkında hangisi doğrudur?

  1. Yığın belleğinin en üstündeki adresi içerir.
  2. 8 bitlik bir yazmaçtır.
  3. Veriyi kalıcı olarak saklar.
  4. Yığın işleminden sonra başlatılır.
Cevabı göster

a) Yığının en üstündeki adresi içerir.

  • SP, SS kesimi içinde son yazılan sözcüğün ofsetini tutar; fiziksel adres = SS × 10h + SP.
  • 8086'da SP 16 bittir; PUSH'ta 2 azalır, POP'ta 2 artar (yığın aşağı doğru büyür).
  • Yığın geçici bir alandır; SS:SP yığın kullanılmadan önce ayarlanır (.COM programında SP = FFFEh).

Soru 31 · Yığın ve Prosedürler

Soru 31: PUSH Nereye Kopyalar?

PUSH komutu bir sözcüğü kaynaktan nereye kopyalar?

  1. Yığın (stack)
  2. Bellek (memory)
  3. Yazmaç (register)
  4. Hedef (destination)
Cevabı göster

a) Yığın

  • PUSH kaynak: SP ← SP − 2, ardından [SS:SP] ← kaynak. Kaynak değişmez.
  • Kaynak 16 bitlik yazmaç, segment yazmacı ya da bellek sözcüğü olabilir; PUSH AL geçersizdir.
  • Anlık değerle PUSH (PUSH 5) 8086'da yoktur, 80186 ile gelmiştir.
  • Yığın da bellektedir; "b" şıkkı bu yüzden yanıltıcıdır, ama doğru ve tam cevap "yığın"dır.

Soru 32 · Yığın ve Prosedürler

Soru 32: CALL, RET ve Dönüş Adresi

CALL KARE çalışınca yığına ne yazılır? Program bittiğinde AX ve DX ne olur? (Sağdaki yorumlar komut adresleridir.)

ORG 100h
MOV AX, 3        ; 0100h
CALL KARE        ; 0103h
ADD AX, 1        ; 0106h
RET              ; 0109h
KARE PROC
MUL AX           ; 010Ah
RET              ; 010Ch
KARE ENDP
Cevabı göster

AX = 000Ah, DX = 0000h

  • CALL KARE, sonraki komutun adresini (0106h) yığına iter: SP = FFFCh, [FFFCh] = 0106h; IP ← 010Ah.
  • MUL AX: DX:AX ← AX × AX = 9 → AX = 0009h, DX = 0000h (16 bitlik MUL, DX'i de yazar!).
  • KARE'deki RET 0106h'yi IP'ye geri yükler; SP = FFFEh.
  • ADD AX, 1 → 000Ah; son RET .COM programını sonlandırır.

Soru 32 · Çözüm

Soru 32: Adım Adım Çözüm

AX ← 3.

CALL: dönüş adresi 0106h yığına; SP = FFFCh; IP ← KARE (010Ah).

MUL AX: DX:AX ← 3 × 3 = 9 → AX = 0009h, DX = 0000h.

RET (KARE): IP ← 0106h, SP = FFFEh.

AX ← 0009h + 1 = 000Ah.

RET: yığın dengeli, program biter.

ORG 100h
MOV AX, 3        ; 0100h
CALL KARE        ; 0103h
ADD AX, 1        ; 0106h
RET              ; 0109h
KARE PROC
MUL AX           ; 010Ah
RET              ; 010Ch
KARE ENDP

Soru 33 · Yığın ve Prosedürler

Soru 33: Dengesiz Yığın

ALT prosedüründeki RET nereye döner? Program neden çöker? Nasıl düzeltilir?

ORG 100h
MOV AX, 1234h    ; 0100h
CALL ALT         ; 0103h
MOV BX, 1        ; 0106h
RET
ALT PROC
PUSH AX          ; AX'i sakla
; ... işlemler ...
RET
ALT ENDP
Cevabı göster
  • CALL yığına dönüş adresi 0106h'yi iter; ardından PUSH AX üstüne 1234h'yi koyar.
  • RET yığının üstündeki sözcüğü dönüş adresi sanır: IP ← 1234h. İşlemci CS:1234h'deki rastgele baytları komut olarak çalıştırır → program çöker ya da saçma davranır.
  • Düzeltme: RET'ten önce POP AX. Her PUSH'un ters sırada bir POP'u olmalıdır.
  • Kural: prosedürden çıkarken SP, girişteki değerine eşit olmalıdır.

Soru 34 · Makrolar

Soru 34: Makro Genişletme

Program bittiğinde AX ne olur? Çevirici bu kaynaktan kaç makine komutu üretir?

TOPLA MACRO a, b
    MOV AX, a
    ADD AX, b
ENDM

ORG 100h
TOPLA 5, 7
TOPLA AX, 3
RET
Cevabı göster

AX = 000Fh (önce 000Ch); 5 komut

  • Çevirici her makro çağrısının yerine gövdeyi kopyalar ve parametreleri yerleştirir (genişletme).
  • Üretilen kod: MOV AX, 5 · ADD AX, 7 · MOV AX, AX · ADD AX, 3 · RET.
  • 5 + 7 = 12 = 0Ch; 12 + 3 = 15 = 0Fh (sayılar ondalık).
  • İkinci çağrıda a = AX olduğundan MOV AX, AX üretilir: zararsız ama gereksiz.
  • Makroda CALL/RET yoktur; yığın kullanılmaz.

Soru 34 · Çözüm

Soru 34: Genişletilmiş Kodun İzlenmesi

TOPLA 5, 7 genişledi: AX ← 5.

AX ← 5 + 7 = 000Ch.

TOPLA AX, 3 genişledi: MOV AX, AX (değişiklik yok).

AX ← 12 + 3 = 000Fh.

RET. Genişletilmiş program 5 komuttan oluşur.

ORG 100h
MOV AX, 5     ; TOPLA 5, 7
ADD AX, 7
MOV AX, AX    ; TOPLA AX, 3
ADD AX, 3
RET

Soru 35 · Makrolar

Soru 35: Makro mu, Prosedür mü?

Makrolar ve prosedürler için aşağıdakilerden hangisi doğrudur?

  1. Makro çağrısı CALL komutuna, ENDM ise RET'e çevrilir.
  2. Makro her kullanıldığı yerde genişletilir; kod büyür ama CALL/RET maliyeti olmaz.
  3. Prosedürün gövdesi her çağrıldığı yere yeniden kopyalanır.
  4. Makro içinde etiket kullanmak hiçbir zaman sorun çıkarmaz.
Cevabı göster

b)

  • a) Yanlış: makro çağrısı çeviri anında metin olarak genişler; CALL/RET üretilmez.
  • c) Yanlış: prosedür bellekte bir kez bulunur; her çağrı CALL ile ona gider, RET ile döner (yığın kullanılır).
  • d) Yanlış: makro iki kez çağrılırsa içindeki etiket iki kez tanımlanmış olur → LOCAL yönergesi kullanılır.
  • Kısa ve sık kullanılan kod için makro, uzun kod için prosedür seçilir.

Soru 36 · Komut Kümesi

Soru 36: Kaydırarak Çarpma

Program bittiğinde result ne olur? Hangi algoritma uygulanıyor? Kodda hangi gizli varsayımlar var?

jmp start
multiplicand: db 13   ; 4 bitlik çarpılan
multiplier: db 5      ; 4 bitlik çarpan
result: db 0          ; 8 bitlik sonuç
start: mov cl, 4      ; bit sayısı
mov bl, [multiplicand+si]
mov dl, [multiplier+si]
checkbit: shr dl, 1   ; en sağdaki bit CF'ye
jnc skip              ; bit 0 ise ekleme yok
add [result+si], bl
skip: shl bl, 1       ; çarpılan × 2
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 2 katına çıkar.
  • 5 = 0101b → 13 × 1 + 13 × 4 = 13 + 52 = 65.
  • Varsayım 1: [...+si] için SI = 0.
  • Varsayım 2: LOOP CX'i kullanır ama yalnız CL yüklenmiş. CH ≠ 0 ise döngü CH × 256 + 4 kez döner (sonuç yine 41h, ama boşuna) → mov cx, 4 yazılmalı.

Soru 36 · Çözüm

Soru 36: Adım Adım Çözüm

JMP start. (SI = 0000h ve CH = 00h varsayılıyor.)

CL ← 4 → CX = 0004h.

BL ← 13 = 0Dh.

DL ← 5 = 0000 0101b.

SHR DL, 1: DL = 02h, dışarı çıkan bit CF = 1.

CF = 1 → atlamaz, ekleme yapılır.

result ← result + BL = 0Dh.

SHL BL, 1: BL = 1Ah (çarpılan × 2).

LOOP: CX = 0003h → checkbit'e dön.

SHR DL, 1: DL = 01h, dışarı çıkan bit CF = 0.

CF = 0 → skip'e atlar (ekleme yok).

SHL BL, 1: BL = 34h (çarpılan × 2).

LOOP: CX = 0002h → checkbit'e dön.

SHR DL, 1: DL = 00h, dışarı çıkan bit CF = 1.

CF = 1 → atlamaz, ekleme yapılır.

result ← result + BL = 41h.

SHL BL, 1: BL = 68h (çarpılan × 2).

LOOP: CX = 0001h → checkbit'e dön.

SHR DL, 1: DL = 00h, dışarı çıkan bit CF = 0.

CF = 0 → skip'e atlar (ekleme yok).

SHL BL, 1: BL = D0h (çarpılan × 2).

LOOP: CX = 0 → döngü biter.

RET: result = 41h = 65 = 13 × 5.

jmp start
multiplicand: db 13   ; 4 bitlik çarpılan
multiplier: db 5      ; 4 bitlik çarpan
result: db 0          ; 8 bitlik sonuç
start: mov cl, 4      ; bit sayısı
mov bl, [multiplicand+si]
mov dl, [multiplier+si]
checkbit: shr dl, 1   ; en sağdaki bit CF'ye
jnc skip              ; bit 0 ise ekleme yok
add [result+si], bl
skip: shl bl, 1       ; çarpılan × 2
loop checkbit
ret

Soru 37 · Komut Kümesi

Soru 37: Kaydırma ve Döndürme

Her komuttan sonra AL ve CF ne olur?

MOV AL, 96h
SHL AL, 1
RCR AL, 1
SAR AL, 1
Cevabı göster

AL: 96h → 2Ch (CF = 1) → 96h (CF = 0) → CBh (CF = 0)

  • 96h = 1001 0110b. SHL: bitler sola, bit 7 CF'ye, sağdan 0 girer → 0010 1100b.
  • RCR: CF ile birlikte sağa döndürür; eski CF (1) bit 7'ye girer, bit 0 (0) CF'ye çıkar → 1001 0110b.
  • SAR: işaret biti korunur → 1100 1011b = CBh. İşaretli bölme: −106 ÷ 2 = −53.
  • SHL = ×2, SHR = işaretsiz ÷2, SAR = işaretli ÷2.

Soru 37 · Çözüm

Soru 37: Adım Adım Çözüm

AL ← 96h = 1001 0110b.

SHL: AL = 0010 1100b = 2Ch, çıkan bit 7 → CF = 1.

RCR: CF (1) bit 7'ye girer, bit 0 (0) CF'ye → AL = 96h, CF = 0.

SAR: işaret biti (1) kopyalanır → 1100 1011b = CBh, CF = 0.

MOV AL, 96h
SHL AL, 1
RCR AL, 1
SAR AL, 1

Soru 38 · Komut Kümesi

Soru 38: Yön Bayrağı (DF)

8086'da FLAGS yazmacındaki yön bayrağı (DF) ne işe yarar?

  1. Bir kesmenin beklenip beklenmediğini gösterir.
  2. Dizgi işlemlerinin yönünü belirler.
  3. CPU'nun ayrıcalık seviyesini kontrol eder.
  4. Taşıma bayrağının durumunu gösterir.
Cevabı göster

b) Dizgi işlemlerinin yönünü belirler.

  • DF = 0 (CLD): MOVSB, LODSB, STOSB … her adımda SI/DI'yı artırır (düşük adresten yükseğe).
  • DF = 1 (STD): SI/DI azalır (sondan başa).
  • Bayt komutlarında adım 1, sözcük komutlarında 2'dir.

Soru 39 · Komut Kümesi

Soru 39: Bellekten Belleğe Taşıma

MOV [Y], [X] geçerli midir? Bellekteki X sözcüğü Y'ye nasıl kopyalanır?

; 1) Ara yazmaçla
MOV AX, [X]
MOV [Y], AX

; 2) Dizgi komutuyla
LEA SI, X
LEA DI, Y
CLD
MOVSW

; 3) Yığın üzerinden
PUSH [X]
POP  [Y]
Cevabı göster
  • Geçersiz: 8086'da bir komutun iki işleneni birden bellek olamaz (MOV, ADD, CMP …).
  • 1) Önce bir yazmaca alıp sonra belleğe yazmak en yaygın yoldur.
  • 2) MOVSB/MOVSW DS:SI'dan ES:DI'ya kopyalar ve SI, DI'yı ilerletir; bir blok için MOV CX, n + REP MOVSB.
  • 3) Bellek işlenenli PUSH/POP da kopyalamayı yazmaç kullanmadan yapar.

Soru 40 · Komut Kümesi

Soru 40: HLT Komutu

HLT komutu ile ilgili aşağıdakilerden hangisi doğru değildir?

  1. İşlemci denetimi (makine kontrol) komutudur.
  2. Programın yürütülmesini başlatmak için kullanılır.
  3. İşlemci bir kesme ya da RESET gelene kadar bekler.
  4. Bir programın sonunda işlemciyi durdurmak için kullanılabilir.
Cevabı göster

b)

  • HLT işlemciyi durdurur (halt durumu); programı başlatmaz.
  • Halt durumundan çıkmak için bir donanım kesmesi (INTR, NMI) ya da RESET gerekir.
  • Diğer işlemci denetimi komutları: NOP, WAIT, LOCK, CLC/STC/CMC, CLD/STD, CLI/STI.

Soru 41 · Komut Kümesi

Soru 41: MOV Bayrakları Etkiler mi?

MOV AX, BX komutu hakkında hangisi doğrudur?

  1. AX'in içeriğini BX'e taşır.
  2. Anlık adresleme modunu kullanır.
  3. Bayrak yazmacını etkilemez.
  4. Bellekten belleğe taşıma için de kullanılabilir.
Cevabı göster

c) Bayrak yazmacını etkilemez.

  • Hedef soldadır: BX'in içeriği AX'e kopyalanır, BX değişmez (ör. AX = 0050h, BX = 0040h → ikisi de 0040h).
  • Yazmaç adresleme modudur; anlık adresleme MOV AX, 5 gibidir.
  • MOV, XCHG, LEA, PUSH, POP (POPF hariç) bayrakları değiştirmez; bayraklar ALU işlemlerinde kurulur.
  • d) yanlış: MOV'un iki işleneni birden bellek olamaz.

Soru 42 · Aygıtlar ve Kesmeler

Soru 42: DMA Denetleyicisi

Aşağıdakilerden hangisi bir DMA (doğrudan bellek erişimi) denetleyicisidir?

  1. 8257 / 8237
  2. 8155
  3. 8253 / 8254
  4. 8279
Cevabı göster

a) 8257 / 8237

  • DMA denetleyicisi, veriyi işlemciyi kullanmadan G/Ç aygıtı ile bellek arasında taşır; işlemciden yolu HOLD ile ister, HLDA ile alır.
  • 8155: RAM + G/Ç portları + sayaç içeren çok amaçlı yonga.
  • 8253/8254: programlanabilir sayaç/zamanlayıcı.
  • 8279: klavye/ekran denetleyicisi.

Soru 43 · Aygıtlar ve Kesmeler

Soru 43: IN ve OUT Kuralları

Aşağıdakilerden hangisi 8086'da geçerli bir G/Ç komut dizisidir?

  1. OUT 300h, AL
  2. MOV DX, 300h · OUT DX, AL
  3. IN BX, 60h
  4. OUT AL, 4
Cevabı göster

b)

  • Port numarası 0–255 ise doğrudan yazılabilir (OUT 4, AL); 255'ten büyükse DX'te verilir.
  • Veri yalnız AL (bayt) ya da AX (sözcük) ile aktarılır; BX kullanılamaz.
  • Sözdizimi: OUT port, AL ve IN AL, port; d) işlenenleri ters yazmıştır.
  • Örnek: emu8086 trafik ışıkları OUT 4, AX ile sürülür; termometre IN AL, 125 ile okunur.

Soru 44 · Aygıtlar ve Kesmeler

Soru 44: INT 21h ile Ekrana Yazmak

Program çalışınca ekranda ne görünür? MESAJ'ın sonundaki $ neden gerekli?

ORG 100h
MOV DX, OFFSET MESAJ
MOV AH, 09h
INT 21h
MOV DL, 'B'
MOV AH, 02h
INT 21h
RET
MESAJ DB 'Merhaba $'
Cevabı göster

Ekran: Merhaba B

  • AH = 09h: DS:DX'teki dizgiyi $ (24h) karakterine kadar yazar; $ yazılmaz, ondan önceki boşluk yazılır.
  • $ unutulursa DOS bellekte ilk 24h baytına kadar ne bulursa yazar (ekranda çöp).
  • AH = 02h: DL'deki tek karakteri ('B' = 42h) yazar.
  • DX'e OFFSET MESAJ (adres) yüklenmelidir, MESAJ'ın kendisi değil.

Soru 44 · Çözüm

Soru 44: Adım Adım Çözüm

DX ← MESAJ'ın adresi (ofseti).

AH ← 09h: dizgi yazma servisi.

INT 21h: 'Merhaba ' yazılır; $ görülünce durur.

DL ← 'B' = 42h.

AH ← 02h: tek karakter yazma servisi.

INT 21h: DL'deki 'B' yazılır.

RET: program biter. Ekran: Merhaba B.

ORG 100h
MOV DX, OFFSET MESAJ
MOV AH, 09h
INT 21h
MOV DL, 'B'
MOV AH, 02h
INT 21h
RET
MESAJ DB 'Merhaba $'

Soru 45 · Aygıtlar ve Kesmeler

Soru 45: BIOS ve DOS Servisleri

Aşağıdaki işler için hangi kesme ve hangi AH değeri kullanılır? Sonuç hangi yazmaçta döner?

; 1) Klavyeden yankılı tek karakter oku
; 2) DL'deki karakteri ekrana yaz
; 3) $ ile biten dizgiyi yaz
; 4) Programı sonlandır
; 5) BIOS: teletype karakter yaz
; 6) BIOS: tuşa basılmasını bekle
Cevabı göster
İşKesme / AHGiriş / çıkış
1INT 21h / 01hAL ← ASCII
2INT 21h / 02hDL = karakter
3INT 21h / 09hDS:DX = dizgi
4INT 21h / 4ChAL = dönüş kodu
5INT 10h / 0EhAL = karakter
6INT 16h / 00hAL ← ASCII, AH ← tarama kodu

INT 10h = BIOS ekran, INT 16h = BIOS klavye, INT 21h = DOS servisleri.

Soru 46 · Aygıtlar ve Kesmeler

Soru 46: INT n Çalışınca Ne Olur?

INT 21h çalıştığında (a) kesme vektörü bellekte hangi adresten okunur? (b) Yığına ne itilir, SP ne kadar azalır? (c) Kesme yordamından hangi komutla dönülür?

Cevabı göster
  • (a) Kesme vektör tablosu 00000h'den başlar, her girdi 4 bayttır (IP, sonra CS). 21h × 4 = 84h → IP ← [0000:0084h], CS ← [0000:0086h].
  • (b) Sırayla FLAGS, CS, IP itilir → SP 6 azalır. Ardından IF = 0 ve TF = 0 yapılır.
  • (c) IRET: IP, CS ve FLAGS'ı geri alır (RET yalnız IP'yi alır, bayraklar geri gelmez).
  • Tablo 256 girdi × 4 bayt = 1 KB'tır (00000h–003FFh).

Özet

Hızlı Tekrar: Sınavda Sık Yapılan Hatalar

Sayı tabanı10 ondalık, 10h onaltılık. Cevaplar onaltılık ve tam genişlikte (0010h) yazılır.
Bayt mı, sözcük mü?AL/AH'ye yazmak yalnız bir baytı değiştirir. DW elemanları 2, DB elemanları 1 bayt arayla durur.
Küçük uçluluk1234h bellekte 34h, 12h sırasıyla saklanır; MOV AX, [adres] iki bayt okur.
MUL / DIV8 bit: AX = AL × r8; AX ÷ r8 → AL bölüm, AH kalan. 16 bit: DX:AX kullanılır.
DöngülerLOOP = CX azalt + sıfır değilse atla, bayrak değiştirmez. DEC/SUB bayrakları kurar; JNZ ZF'ye bakar.
İşaretli / işaretsizJA/JB işaretsiz (CF, ZF), JG/JL işaretli (SF, OF, ZF).
YığınPUSH: SP −2; POP: SP +2. LIFO: aynı sırada POP değerleri ters çevirir. RET'ten önce yığın dengeli olmalı.
Adres / değerMOV AX, X değer; OFFSET X ve LEA adres. Veri erişiminde varsayılan kesim DS.

Özet

Soruların Konuları

KonuSorularAkılda kalsın
Veri taşıma1–4AH:AL parçaları, XCHG, [ofset] + DS, DB/DW/DD
Değişkenler5–7Değişken adı = değer; JMP/RET ile veriyi atlamak; LEA = adres
Dolaylı adresleme8–11[SI+2], [BX+6]; bayt dizisinde +1, sözcükte +2
Aritmetik ve mantık12–18Bayraklar, MUL/DIV yazmaçları, AND/OR/XOR/TEST
Akış kontrolü19–27DEC/JNZ, LOOP, CMP + JA/JG, dizi toplamı, sıralama
Yığın ve prosedürler28–33LIFO, SP, CALL dönüş adresi, dengeli yığın
Makrolar34–35Genişletme, LOCAL, makro ↔ prosedür
Komut kümesi36–41Kaydırma/döndürme, DF, bellekten belleğe, HLT, MOV
Aygıtlar ve kesmeler42–46DMA, IN/OUT + DX, INT 21h/10h/16h, vektör tablosu

Özet

Alıştırmalar: Kendiniz Deneyin

  1. MOV AX, 0FFFFh · ADD AX, 1 → AX, CF, ZF?
  2. MOV AX, 0123h · MOV BL, 10h · DIV BL → AX?
  3. MOV CX, 3 · MOV AX, 1 · D: SHL AX, 1 · LOOP D → AX?
  4. MOV AL, 80h · CMP AL, 1 → JL atlar mı? JB atlar mı?
  5. PUSH AX · PUSH BX · POP AX · POP BX ne işe yarar?
Cevaplar
  1. AX = 0000h, CF = 1, ZF = 1.
  2. 0123h = 291; 291 ÷ 16 = 18 kalan 3 → AL = 12h, AH = 03h → AX = 0312h.
  3. AX = 0008h (1 → 2 → 4 → 8).
  4. JL atlar (−128 < 1); JB atlamaz (128 > 1, CF = 0).
  5. AX ile BX'i takas eder.

Özet

Kaynaklar

  • Intel, The 8086 Family User's Manual, 1979 — Instruction Set bölümü.
  • B. B. Brey, The Intel Microprocessors, 8. baskı, Pearson, 2009.
  • B. Hashmi, Assembly Language Programming (ders örneklerindeki dizi toplama, sıralama ve kaydırarak çarpma programları).
  • emu8086 yardım belgeleri: 8086 komutları, kesmeler ve sanal aygıtlar.

Dersin Sonu

Bölüm 13: Final Çalışma Soruları
Başarılar!
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.