Bölüm 1: Programlama Dilleri

Bölüm 1: Programlama Dilleri · Çalışma Soruları
Dil seviyeleriMakine diliKomut biçimiAssembler ve yükleyiciListe çıktısıSözdizimleriSistem çağrılarıYığın ve stdcallDerlenen ve yorumlananfor/if → 8086
Sercan KÜLCÜ

Çoktan Seçmeli · Yazılım

Soru 1: Dil Seviyeleri

Makine dilinden assembly diline, oradan yüksek seviyeli dillere çıkıldıkça ne olur?

B: Yüksek seviyeli dilde değişkenin hangi yazmaçta ya da adreste duracağına derleyici karar verir; aynı kaynak kod farklı işlemciler için yeniden derlenebilir. Bedeli, donanım üzerindeki doğrudan denetimin azalmasıdır. Kaynak kodun yine de bir derleyici ya da yorumlayıcıyla makine diline çevrilmesi gerekir; elle adres ve yazmaç seçimi assembly'nin özelliğidir.

Kod Yazma · Yazılım

Soru 2: Üç Seviyede Aynı İşlem

C'deki y = a - b + c; satırını 8086 assembly ile yazın (16 bitlik değişkenler: a = 0200h, b = 0202h, c = 0204h, y = 0206h adreslerinde). Ardından aşağıdaki kodları kullanarak makine kodunu çıkarın. a = 50, b = 8, c = 3 ise y kaç olur?

KomutKod
MOV AX, [adr]A1 + adr
SUB AX, [adr]2B 06 + adr
ADD AX, [adr]03 06 + adr
MOV [adr], AXA3 + adr
Cevabı göster
MOV AX, [0200h]   ; A1 00 02
SUB AX, [0202h]   ; 2B 06 02 02
ADD AX, [0204h]   ; 03 06 04 02
MOV [0206h], AX   ; A3 06 02

Adres baytları little-endian yazılır: 0202h → 02 02, 0204h → 04 02. Kod toplam 3 + 4 + 4 + 3 = 14 bayttır.

y = 50 − 8 + 3 = 45 (002Dh). Her assembly satırı tek bir makine komutuna karşılık gelir; C satırının hangi yazmacı kullanacağına derleyici karar verir.

Çoktan Seçmeli · Makine Dili

Soru 3: Makine Dili

Makine dili için hangisi doğrudur?

D: Makine dili, işlemcinin kontrol biriminin doğrudan çözebildiği ikili komut kodlarıdır: işlem kodu ve işlenen alanları. Her işlemci ailesinin kendi komut kümesi vardır; 8086'da B0 05 "AL'ye 5 yükle" demektir, ARM'da aynı iş başka bir 32 bitlik sözcükle kodlanır. Onaltılık gösterim yalnızca insanların okuması içindir; bellekte bitler durur.

Hesap Sorusu · Makine Dili

Soru 4: Kodla ve Çöz

Örnek makine dili: 8 bitlik komut = 4 bit işlem kodu | 2 bit hedef | 2 bit kaynak; HALT 0000, ADD 0001, SUB 0010, AND 0011, OR 0100; R0 = 00 … R3 = 11; hedef ← hedef işlem kaynak.

  1. AND R1, R3 ve OR R2, R0 komutlarını ikili ve onaltılık kodlayın.
  2. 1Eh ve 2Dh baytlarını çözün.
  3. R2 = 7, R3 = 4 ise 1Eh'den sonra R3 kaç olur?
Cevabı göster
  1. AND R1, R3 = 0011 01 11 = 37h; OR R2, R0 = 0100 10 00 = 48h.
  2. 1Eh = 0001 11 10 → ADD R3, R2; 2Dh = 0010 11 01 → SUB R3, R1.
  3. R3 ← R3 + R2 = 4 + 7 = 11. Kaynak R2 değişmez.

Onaltılık yazımda ilk basamak işlem kodudur; ikinci basamak hedef ve kaynak alanlarını birlikte taşır.

Adım Adım Çalıştırma · Makine Dili

Soru 5: Makine Programı İzleme

Örnek makine dilinde (4 bit işlem | 2 bit hedef | 2 bit kaynak) yazılmış program 0. adresten çalışıyor. Başlangıçta R0 = 6, R1 = 9, R2 = 12, R3 = 5. HALT'te yazmaçlar kaçtır?

R06R19R212R35PC0

Başlangıç: R0 = 6, R1 = 9, R2 = 12 (1100b), R3 = 5 (0101b). PC = 0.

R06R13R212R35PC10010SUB01R100R0= 24h

24h = 0010 01 00 → SUB R1, R0: R1 = 9 − 6 = 3.

R06R13R213R35PC20100OR10R211R3= 4Bh

4Bh = 0100 10 11 → OR R2, R3: 1100 OR 0101 = 1101 → R2 = 13.

R019R13R213R35PC30001ADD00R010R2= 12h

12h = 0001 00 10 → ADD R0, R2: R0 = 6 + 13 = 19. R2'nin yeni değeri kullanılır.

R019R13R213R31PC40011AND11R301R1= 3Dh

3Dh = 0011 11 01 → AND R3, R1: 0101 AND 0011 = 0001 → R3 = 1.

R019R13R213R31PC50000HALT00R000R0= 00h

00h → HALT. Sonuç: R0 = 19, R1 = 3, R2 = 13, R3 = 1.

0: 0010 0100  ; 24h
1: 0100 1011  ; 4Bh
2: 0001 0010  ; 12h
3: 0011 1101  ; 3Dh
4: 0000 0000  ; 00h

Çoktan Seçmeli · Makine Dili

Soru 6: Sekiz Yazmaçlı Biçim

Örnek makine dilinde komut 4 bit işlem kodu ve iki 2 bitlik yazmaç alanından oluşuyor. İşlem kodu alanı korunup yazmaç sayısı 8'e çıkarılırsa bir komut kaç bit olur?

A: 8 yazmaçtan birini seçmek için log2 8 = 3 bit gerekir; iki yazmaç alanı 3 + 3 = 6 bit, işlem koduyla birlikte 4 + 6 = 10 bit eder. Komut 8 bitte kalacaksa işlem kodu 2 bite iner ve yalnızca 4 işlem tanımlanabilir.

Çoktan Seçmeli · Assembly Dilleri

Soru 7: Programdan Belleğe

Kaynak koddan çalışan programa giden araç zincirinde hangi eşleştirme doğrudur?

C: Assembler her assembly satırını makine koduna çevirip nesne dosyası üretir; bağlayıcı nesne dosyalarını kütüphane koduyla birleştirip çalıştırılabilir dosya yapar; yükleyici bu dosyayı ana belleğe yerleştirir, gerekli adresleri ayarlar ve denetimi programın başına verir. Önişlemci yalnızca #include ve #define satırlarını açar; tip denetimini derleyici yapar.

Çoktan Seçmeli · Assembly Dilleri

Soru 8: Makine Kodu Üretmeyen Satır

Aşağıdaki assembly satırlarından hangisi makine kodu üretmez?

C: ORG bir direktiftir: assembler'a "sonraki baytları 100h bağıl konumundan yerleştir" der, belleğe hiçbir bayt yazmaz. .COM programlarında ilk 256 bayt PSP'ye ayrıldığı için kod 100h'den başlar. Diğer üçü komuttur: B4 09, CD 21 ve C3.

Kod Okuma · Assembly Dilleri

Soru 9: Dizginin Adresi

emu8086'da derlenen .COM programı için:

org 100h
mov ah, 09h
mov dx, offset msg
int 21h
mov ah, 4Ch
int 21h
msg db 'Giresun 2026!', 0Dh, 0Ah, '$'
uzun equ $ - msg
  1. msg hangi bağıl konumdadır?
  2. uzun kaçtır?
  3. Ekrana ne yazılır?
  4. Sondaki '$' unutulsaydı ne olurdu?
Cevabı göster
AdresBaytSatır
0100h2mov ah, 09h
0102h3mov dx, offset msg
0105h2int 21h
0107h2mov ah, 4Ch
0109h2int 21h
010Bh16msg db …
  1. Kod 11 bayt: msg = 010Bh.
  2. 13 karakter + 0Dh + 0Ah + '$' = 16. EQU yer kaplamaz.
  3. Giresun 2026! ve satır başı + satır sonu; '$' yazılmaz.
  4. DOS 09h hizmeti bir '$' görene kadar bellekteki rastgele baytları da ekrana basardı.

Çoktan Seçmeli · Assembly Dilleri

Soru 10: AT&T Sözdizimi

GNU as ile yazılmış AT&T sözdizimindeki subl %ebx, %eax komutunun Intel sözdizimindeki karşılığı hangisidir?

A: AT&T'de sıra kaynak, hedeftir; Intel'de hedef, kaynak. Yazmaçlar % ile yazılır, l soneki 32 bitlik işlem demektir. Bellek işleneni AT&T'de (%ebx) biçiminde olurdu. İşlem değişmez: sonuç hedefe, yani EAX'e yazılır.

Adım Adım Çalıştırma · Assembly Dilleri

Soru 11: DOS ile Karakter Yazma

Program ekrana ne yazar? Her LOOP turundan sonra CX ve DL kaçtır?

CX0003hDL41h 'A'ekran INT 21h, AH = 02h → DL'deki karakteri yazLOOP: CX ← CX − 1; CX ≠ 0 ise yaz'a atla

CX = 3 tur, DL = 'A' (41h).

CX0002hDL43h 'C'ekranAINT 21h, AH = 02h → DL'deki karakteri yazLOOP: CX ← CX − 1; CX ≠ 0 ise yaz'a atla

1. tur: AH = 02h, INT 21h 'A' yazar. DL = 41h + 2 = 43h ('C'). LOOP: CX = 2 ≠ 0 → atla.

CX0001hDL45h 'E'ekranACINT 21h, AH = 02h → DL'deki karakteri yazLOOP: CX ← CX − 1; CX ≠ 0 ise yaz'a atla

2. tur: 'C' yazılır; DL = 45h ('E'), CX = 1 → atla.

CX0000hDL47h 'G'ekranACEINT 21h, AH = 02h → DL'deki karakteri yazLOOP: CX ← CX − 1; CX ≠ 0 ise yaz'a atla

3. tur: 'E' yazılır; DL = 47h ('G'), CX = 0 → atlama yok.

CX0000hDL47h 'G'ekranACEINT 21h, AH = 02h → DL'deki karakteri yazLOOP: CX ← CX − 1; CX ≠ 0 ise yaz'a atla

RET: .COM programı DOS'a döner. Ekranda ACE var; son DL ('G') hiç yazılmadı.

org 100h
mov cx, 3
mov dl, 'A'
yaz: mov ah, 02h
int 21h
add dl, 2
loop yaz
ret

Çoktan Seçmeli · Assembly Dilleri

Soru 12: Sistem Çağrısı

32 bitlik Linux'ta (x86) ekrana yazmak için hizmet numarası nereye konur ve çekirdek nasıl çağrılır?

D: Linux x86 (32 bit): hizmet numarası EAX'te (4 = write, 1 = exit), parametreler EBX, ECX, EDX'te, geçiş int 0x80. Diğerleri de doğrudur ama başka ortamlar içindir: AH = 09h + INT 21h MS-DOS, r7 + svc #0 ARM Linux, RAX = 1 + syscall 64 bitlik Linux.

Hesap Sorusu · Assembly Dilleri

Soru 13: stdcall ve ESP

32 bitlik Windows'ta ESP = 0012FF70h iken üç parametreli bir stdcall fonksiyonu çağrılıyor:

push 1      ; c
push 2      ; b
push 3      ; a
call Fonk   ; Fonk(a, b, c)
  1. Fonksiyona girildiği anda ESP kaçtır? [ESP] ve [ESP+4] neyi tutar?
  2. Fonksiyon ret 12 ile dönünce ESP kaç olur?
  3. Parametreler neden c, b, a sırasıyla itilir?
Cevabı göster
  1. Her PUSH ESP'yi 4 azaltır: 3 parametre + dönüş adresi = 16 bayt → ESP = 0012FF60h. [ESP] dönüş adresi, [ESP+4] ilk parametre a = 3.
  2. ret 12 dönüş adresini alır (+4) ve 12 bayt parametreyi atar → ESP = 0012FF70h, çağrıdan önceki değer. stdcall'da yığını çağrılan temizler.
  3. Sağdan sola itilince ilk parametre yığının tepesine, dönüş adresinin hemen üstüne gelir; fonksiyon onu her zaman aynı yerde bulur.

Çoktan Seçmeli · Yüksek Seviyeli Diller

Soru 14: Java Nasıl Çalışır?

Java programının çalışma biçimi için hangisi doğrudur?

B: Java hibrittir: javac Main.java platformdan bağımsız .class (bytecode) üretir; java Main ile JVM bu kodu önce yorumlar, sık çalışan kısımları JIT ile makine koduna çevirir. Bu yüzden aynı .class dosyası JVM olan her platformda çalışır. C# da benzer biçimde IL ara koduna derlenir.

Adım Adım Çalıştırma · Yüksek Seviyeli Diller

Soru 15: for ve if, 8086'da

C'deki for (i = 1; i <= 4; i++) if (i % 2 == 0) toplam += i; döngüsünün 8086 karşılığında her turun sonunda CX ve AX kaçtır? Program bittiğinde AX kaçtır?

CX (i)0001hAX (toplam)0000hZF1CF0C: for (i = 1; i <= 4; i++)

i = 1, toplam = 0. xor ax, ax AX'i sıfırlar ve ZF = 1 yapar.

CX (i)0002hAX (toplam)0000hZF0CF0C: if (i % 2 == 0) toplam += i;

i = 1: 1 − 4 ödünç ister (CF = 1) → JA atlamaz. 1 AND 1 ≠ 0 → tek, toplama eklenmez. i = 2.

CX (i)0003hAX (toplam)0002hZF0CF0C: if (i % 2 == 0) toplam += i;

i = 2: 2 AND 1 = 0 → ZF = 1, JNZ atlamaz → toplam = 0 + 2 = 2. i = 3.

CX (i)0004hAX (toplam)0002hZF0CF0C: if (i % 2 == 0) toplam += i;

i = 3: tek → atlanır. i = 4.

CX (i)0005hAX (toplam)0006hZF0CF0C: if (i % 2 == 0) toplam += i;

i = 4: CMP 4, 4 → ZF = 1, CF = 0; JA yalnızca CF = 0 ve ZF = 0 iken atlar → devam. Çift → toplam = 6. i = 5.

CX (i)0005hAX (toplam)0006hZF0CF0çıkış: 5 > 4

CMP 5, 4: CF = 0, ZF = 0 → JA bitti'ye atlar. Sonuç AX = 6 = 2 + 4.

org 100h
mov cx, 1        ; i = 1
xor ax, ax       ; toplam = 0
dongu: cmp cx, 4
ja bitti         ; i > n ise bitir
test cl, 1       ; en düşük bit
jnz atla         ; tekse ekleme
add ax, cx
atla: inc cx
jmp dongu
bitti: ret

Çıktı Sorusu · Yüksek Seviyeli Diller

Soru 16: Python'da Aralık

C'deki for (int i = 1; i <= n; i++) döngüsü Python'a aşağıdaki gibi çevrilmiş. Çıktı nedir? C sürümünün çıktısıyla aynı mıdır?

n = 4
for i in range(1, n):
    if i % 2 == 0:
        print(f"{i} cift")
    else:
        print(f"{i} tek")
Cevabı göster
1 tek
2 cift
3 tek

Hayır. range(1, n) üst sınırı dahil etmez: i = 1, 2, 3. C sürümü "4 cift" satırını da yazar. Doğrusu range(1, n + 1).

Python yorumlanan bir dil olduğundan bu hata derleme sırasında değil, ancak çıktı incelenince fark edilir; sözdizimi olarak program doğrudur.

Kısa Cevap · Yüksek Seviyeli Diller

Soru 17: Derleme Aşamaları

gcc tekcift.c -o tekcift komutu dört aracı arka arkaya çalıştırır. Her aşamanın aracını, çıktı dosyasını ve o aşamada durmak için kullanılan gcc seçeneğini yazın. Program çalıştırılırken devreye giren beşinci bileşen hangisidir?

Cevabı göster
AşamaÇıktıSeçenek
Önişlemci (#include, #define)tekcift.i-E
Derleyici (C → assembly)tekcift.s-S
Assembler (assembly → makine kodu)tekcift.o-c
Bağlayıcı (+ printf, scanf …)tekcift(.exe)—

Beşinci bileşen yükleyicidir: işletim sistemi programı belleğe yerleştirir ve main'e atlar. Ara assembly'yi Intel sözdizimiyle görmek için gcc -S -masm=intel.

Son

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