Bölüm 13: Final Çalışma Soruları
Giriş
Öğrenme Çıktıları
Kısa bir 8086 programını komut komut izleyip yazmaç, bayrak ve bellek içeriklerini onaltılık olarak yazmak.
ADD, SUB, MUL, DIV, mantık ve kaydırma komutlarının sonucunu ve etkilediği bayrakları bulmak.
DEC/JNZ, LOOP, CMP ile dallanma, PUSH/POP ve CALL/RET davranışını adım adım açıklamak.
Makro genişletmeyi, IN/OUT kurallarını ve BIOS/DOS kesme servislerini doğru kullanmak.
Giriş
Bu Sunum Nasıl Kullanılır?
10 / 10h) verildiğine dikkat edin.- 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+2gösterimi, yazmacın num1 etiketinin adresi + 2 değerini tuttuğunu anlatır. - Kod MASM/emu8086 yazımıyla verilmiştir:
MOV AX, SAYIdeğişkenin değerini,OFFSET SAYI/LEAise 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, ALyalnı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
XCHGiki 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önerge | Boyut | Kullanım |
|---|---|---|
| DB (Define Byte) | 1 bayt | karakter, dizgi, 0–255 |
| DW (Define Word) | 2 bayt | 16 bitlik sayı, adres |
| DD (Define Double Word) | 4 bayt | 32 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, Xhatalı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, AXAX'i değiştirmez; bellekte 58h, 02h sırasıyla durur.JMP BASLAveri baytlarının komut gibi çalıştırılmasını önler;END BASLAkaynak 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, num1SI'ya num1'in adresini (ofsetini) yükler;MOV SI, OFFSET num1ile 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, num1iç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 num1ya dalea 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, 10hyalnız AH'yi değiştirir: AH = 10h. - Anlık değer
0x0010yazı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
- DX
- AX
- BX
- 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 30hbit 4 ve 5'i 1 yapar: 0011 1100 = 3Ch.XOR 0FFhtüm bitleri ters çevirir: 1100 0011 = C3h.TESTAND 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 CXZF'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
| Tur | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| AX | 1 | 1 | 2 | 3 | 5 |
| BX = DX | 0 | 1 | 1 | 2 | 3 |
- 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
EQUbir sabittir: bellekte yer kaplamaz; çevirici her kullanımda 10 yazar.xor ax, axAX'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, 1bayrakları etkiler;JNZZF'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?
- CX
- BX
- SI
- 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
JCXZkullanılır. LOOPE/LOOPZayrıca ZF = 1,LOOPNE/LOOPNZZF = 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?
- ZF (sıfır)
- AF (yardımcı taşıma)
- CF (taşıma)
- 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.
JBEiş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, 4kullanı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 AXAX'in kopyasını yığına yazar; AX değişmez. SP: FFFEh → FFFCh.MOV AX, 5678hAX'i geçici olarak değiştirir.POP AXyığı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?
- Yığın belleğinin en üstündeki adresi içerir.
- 8 bitlik bir yazmaçtır.
- Veriyi kalıcı olarak saklar.
- 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?
- Yığın (stack)
- Bellek (memory)
- Yazmaç (register)
- 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 ALgeç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
RET0106h'yi IP'ye geri yükler; SP = FFFEh. ADD AX, 1→ 000Ah; sonRET.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?
- Makro çağrısı CALL komutuna, ENDM ise RET'e çevrilir.
- Makro her kullanıldığı yerde genişletilir; kod büyür ama CALL/RET maliyeti olmaz.
- Prosedürün gövdesi her çağrıldığı yere yeniden kopyalanır.
- 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 →
LOCALyö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, 4yazı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?
- Bir kesmenin beklenip beklenmediğini gösterir.
- Dizgi işlemlerinin yönünü belirler.
- CPU'nun ayrıcalık seviyesini kontrol eder.
- 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/MOVSWDS:SI'dan ES:DI'ya kopyalar ve SI, DI'yı ilerletir; bir blok içinMOV 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?
- İşlemci denetimi (makine kontrol) komutudur.
- Programın yürütülmesini başlatmak için kullanılır.
- İşlemci bir kesme ya da RESET gelene kadar bekler.
- 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?
- AX'in içeriğini BX'e taşır.
- Anlık adresleme modunu kullanır.
- Bayrak yazmacını etkilemez.
- 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, 5gibidir. - 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?
- 8257 / 8237
- 8155
- 8253 / 8254
- 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?
OUT 300h, ALMOV DX, 300h·OUT DX, ALIN BX, 60hOUT 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, ALveIN AL, port; d) işlenenleri ters yazmıştır. - Örnek: emu8086 trafik ışıkları
OUT 4, AXile sürülür; termometreIN AL, 125ile 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 / AH | Giriş / çıkış |
|---|---|---|
| 1 | INT 21h / 01h | AL ← ASCII |
| 2 | INT 21h / 02h | DL = karakter |
| 3 | INT 21h / 09h | DS:DX = dizgi |
| 4 | INT 21h / 4Ch | AL = dönüş kodu |
| 5 | INT 10h / 0Eh | AL = karakter |
| 6 | INT 16h / 00h | AL ← 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
10 ondalık, 10h onaltılık. Cevaplar onaltılık ve tam genişlikte (0010h) yazılır.MOV AX, [adres] iki bayt okur.MOV AX, X değer; OFFSET X ve LEA adres. Veri erişiminde varsayılan kesim DS.Özet
Soruların Konuları
| Konu | Sorular | Akılda kalsın |
|---|---|---|
| Veri taşıma | 1–4 | AH:AL parçaları, XCHG, [ofset] + DS, DB/DW/DD |
| Değişkenler | 5–7 | Değişken adı = değer; JMP/RET ile veriyi atlamak; LEA = adres |
| Dolaylı adresleme | 8–11 | [SI+2], [BX+6]; bayt dizisinde +1, sözcükte +2 |
| Aritmetik ve mantık | 12–18 | Bayraklar, MUL/DIV yazmaçları, AND/OR/XOR/TEST |
| Akış kontrolü | 19–27 | DEC/JNZ, LOOP, CMP + JA/JG, dizi toplamı, sıralama |
| Yığın ve prosedürler | 28–33 | LIFO, SP, CALL dönüş adresi, dengeli yığın |
| Makrolar | 34–35 | Genişletme, LOCAL, makro ↔ prosedür |
| Komut kümesi | 36–41 | Kaydırma/döndürme, DF, bellekten belleğe, HLT, MOV |
| Aygıtlar ve kesmeler | 42–46 | DMA, IN/OUT + DX, INT 21h/10h/16h, vektör tablosu |
Özet
Alıştırmalar: Kendiniz Deneyin
MOV AX, 0FFFFh·ADD AX, 1→ AX, CF, ZF?MOV AX, 0123h·MOV BL, 10h·DIV BL→ AX?MOV CX, 3·MOV AX, 1·D: SHL AX, 1·LOOP D→ AX?MOV AL, 80h·CMP AL, 1→ JL atlar mı? JB atlar mı?PUSH AX·PUSH BX·POP AX·POP BXne işe yarar?
Cevaplar
- AX = 0000h, CF = 1, ZF = 1.
- 0123h = 291; 291 ÷ 16 = 18 kalan 3 → AL = 12h, AH = 03h → AX = 0312h.
- AX = 0008h (1 → 2 → 4 → 8).
- JL atlar (−128 < 1); JB atlamaz (128 > 1, CF = 0).
- 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.