Bölüm 8: Yığın
Çoktan Seçmeli · Yığın Kavramı
Soru 1: PUSH Nereye Yazar?
PUSH AX komutu AX'teki sözcüğü nereye, hangi sırayla kopyalar?
A: PUSH kaynak: SP ← SP − 2, ardından [SS:SP] ← kaynak; kaynak (AX) değişmez. Yığın aşağı doğru büyür (B ters yön). Yığın SS kesimindedir (C); BX ile ilgisi yoktur (D). POP ise önce okur, sonra SP'yi 2 artırır. Yığın da bellektedir ama doğru ve tam cevap "yığının üstüne"dir.
Çoktan Seçmeli · Yığın Kavramı
Soru 2: Yığın İşaretçisi
Yığın işaretçisi (SP) için hangisi doğrudur?
D: SS:SP her zaman yığının üstündeki (en son konan) sözcüğü gösterir; fiziksel adres SS × 10h + SP. SP 16 bittir; PUSH'ta 2 azalır, POP'ta 2 artar. Yığın kullanılmadan önce ayarlanır (.COM'da yükleyici SP = FFFEh yapar). Yığın geçici bir alandır.
Çoktan Seçmeli · Yığın Kavramı
Soru 3: Son Giren İlk Çıkar
Yığına sırasıyla 1, 2, 3, 4, 5 itiliyor. Ardından üç kez POP yapılıyor. Üçüncü POP hangi değeri alır?
C: LIFO: çıkış sırası 5, 4, 3, 2, 1'dir. Üçüncü POP 3'ü alır; yığında 2 ve 1 kalır. Yığın değerleri ters sırada geri verir; bu yüzden yazmaçları geri yüklerken POP sırası PUSH sırasının tersi olmalıdır.
Hesap Sorusu · Yığın Kavramı
Soru 4: Yığının Fiziksel Adresi
(a) .COM programında SS = 0700h, SP = FFFEh. Yığının üstünün fiziksel adresi nedir? (b) SS = 2000h, SP = 0100h, AX = 1234h iken PUSH AX çalışıyor. SP ne olur, hangi fiziksel adreslere hangi baytlar yazılır?
Cevabı göster
Fiziksel adres = SS × 10h + SP.
(a) 07000h + FFFEh = 16FFEh.
(b) SP = 0100h − 2 = 00FEh. 20000h + 00FEh = 200FEh: [200FEh] = 34h (düşük bayt), [200FFh] = 12h (yüksek bayt). 8086 sözcüğü little-endian yazar.
Çoktan Seçmeli · PUSH ve POP
Soru 5: Geçerli İşlenen
Hangisi 8086'da geçerli bir komuttur?
D: Kesim yazmaçları itilebilir; PUSH DS + POP ES, DS'yi ES'ye kopyalamanın bir yoludur. Yığına her zaman sözcük yazılır, PUSH AL geçersizdir. POP CS, IP aynı kalırken akışı rastgele bir yere atardı; yoktur. Anlık değerle PUSH 80186 ile gelmiştir (emu8086 kabul etse de).
Çıktı Sorusu · PUSH ve POP
Soru 6: PUSH ile Değer Saklamak
Her komuttan sonra AX ve SP nedir? (.COM programı: SP = FFFEh ile başlıyor.)
ORG 100h MOV AX, 1234h PUSH AX MOV AX, 5678h POP AX RET
Cevabı göster
| Komut | AX | SP | [FFFCh] |
|---|---|---|---|
| MOV AX, 1234h | 1234h | FFFEh | — |
| PUSH AX | 1234h | FFFCh | 1234h |
| MOV AX, 5678h | 5678h | FFFCh | 1234h |
| POP AX | 1234h | FFFEh | 1234h |
PUSH AX'in kopyasını yazar, AX değişmez. POP yığının üstündeki 1234h'yi geri yükler; FFFCh'deki değer silinmez, yalnızca yığının dışında kalır. Bir yazmacı bozmadan geçici olarak kullanmanın kalıbıdır.
Çıktı Sorusu · PUSH ve POP
Soru 7: Yığında Bayt Sırası
Program bittiğinde BX, CL, CH ve DX nedir? (.COM programında DS = SS olduğundan [BX] yığına erişir.)
ORG 100h MOV AX, 0ABCDh PUSH AX MOV BX, SP MOV CL, [BX] MOV CH, [BX+1] POP DX RET
Cevabı göster
BX = FFFCh (PUSH'tan sonraki SP).
[FFFCh] = CDh → CL; [FFFDh] = ABh → CH. Sözcük little-endian yazılır: düşük bayt düşük adrese.
DX = ABCDh: POP iki baytı yeniden sözcük olarak okur. emu8086'nın stack penceresi sözcükleri, memory penceresi baytları gösterir.
Not: 8086'da SP taban yazmacı olamaz (MOV CL, [SP] geçersiz); bu yüzden SP önce BX'e kopyalandı.
Çoktan Seçmeli · PUSH ve POP
Soru 8: Bayrakları Değiştiren
Aşağıdaki komutlardan hangisi bayrakları değiştirir?
C: POPF yığının üstündeki sözcüğü bayrak yazmacına yükler; bütün bayraklar değişebilir. PUSH, POP ve PUSHF bayraklara dokunmaz. Bu sayede bir CMP sonucu PUSH/POP arasında güvenle taşınabilir; bayrakları saklamak gerekirse PUSHF/POPF kullanılır.
Çıktı Sorusu · Örnekler
Soru 9: Aynı Sırayla POP
Kod çalıştıktan sonra AX, BX ve CX nedir? SP ne olur?
ORG 100h MOV AX, 2 MOV BX, 4 MOV CX, 8 PUSH AX PUSH BX PUSH CX POP AX POP BX POP CX RET
Cevabı göster
AX = 0008h, BX = 0004h, CX = 0002h.
En son itilen CX (8) ilk çıkar ve AX'e gider. Aynı sırayla PUSH ve POP değerleri ters çevirir; korumak için POP ters sırada yazılmalıdır (POP CX, POP BX, POP AX). Üç PUSH, üç POP: SP yeniden FFFEh, yığın dengeli.
Çoktan Seçmeli · Örnekler
Soru 10: Yığınla Takas
AX ile BX'in değerlerini yalnızca PUSH ve POP ile takas eden dizi hangisidir?
B: BX en son girdiği için ilk POP AX onu alır, ardından POP BX AX'in eski değerini alır. A ve D ayna sırasıdır: değerler yerinde kalır (yazmaç saklama kalıbı). C her değeri hemen geri aldığı için hiçbir şey değiştirmez. Takasın en kısa yolu yine de XCHG AX, BX'tir (1 bayt).
Adım Adım Çalıştırma · Örnekler
Soru 11: Üç Yazmacı Döndürmek
Üç yazmaç itilip farklı bir sırayla geri alınıyor. Sonunda AX, BX ve CX nedir? Yığın dengeli mi?
AX = 1111h, BX = 2222h, CX = 3333h. SP = FFFEh.
PUSH AX: SP = FFFCh, [FFFCh] = 1111h.
PUSH BX: SP = FFFAh, [FFFAh] = 2222h.
PUSH CX: SP = FFF8h. Üstte 3333h var.
POP AX: üstteki 3333h AX'e gelir, SP = FFFAh.
POP CX: sıradaki 2222h CX'e gelir.
POP BX: 1111h BX'e gelir, SP = FFFEh: üç PUSH, üç POP, yığın dengeli. Sonuç: AX = 3333h, BX = 1111h, CX = 2222h; değerler bir sıra kaydı.
ORG 100h MOV AX, 1111h MOV BX, 2222h MOV CX, 3333h PUSH AX PUSH BX PUSH CX POP AX POP CX POP BX RET
Kod Yazma · Örnekler
Soru 12: Dizgiyi Yerinde Ters Çevir
metin DB 'ABC' dizgisini yığın kullanarak bellekte yerinde ters çeviren (CBA) kodu yazın.
Cevabı göster
LEA SI, metin MOV CX, 3 koy: MOV AL, [SI] PUSH AX INC SI LOOP koy LEA SI, metin MOV CX, 3 geri: POP AX MOV [SI], AL INC SI LOOP geri
İlk döngü karakterleri sırayla iter (AH ile birlikte sözcük olarak; yığına bayt itilemez). İkinci döngü onları ters sırada alır ve baştan itibaren yazar: metin = 'CBA'. Üç PUSH, üç POP: yığın dengeli kalır.
Çoktan Seçmeli · CALL / RET
Soru 13: RET 4
İki parametre itilip yakın CALL ile çağrılan bir prosedür RET 4 ile dönüyor. RET 4 çalışırken SP toplam kaç artar?
A: RET önce dönüş adresini alır (SP + 2), sonra parametreler için SP'ye 4 daha ekler: toplam 6. Böylece çağıran ADD SP, 4 yazmak zorunda kalmaz; SP, iki PUSH ve CALL'dan önceki değerine (FFFEh) döner.
Adım Adım Çalıştırma · CALL / RET
Soru 14: Yığınla Parametre ve BP
FARK, yığındaki iki parametreyi BP ile okuyup birinciden ikinciyi çıkarıyor. [BP+4] ve [BP+6] neyi gösterir? Dönüşte SP kaç olur?
1. parametre (10 = 000Ah) yığında: [FFFCh].
2. parametre (4) yığında: [FFFAh], SP = FFFAh.
CALL: dönüş adresi 010Bh → [FFF8h], IP = 010Ch.
PUSH BP ve MOV BP, SP: BP = FFF6h sabit bir çerçeve noktası. [BP] = eski BP, [BP+2] = dönüş adresi, [BP+4] = son itilen parametre.
MOV AX, [BP+6]: [FFFCh] = 000Ah → AX = 10.
SUB AX, [BP+4]: 10 − 4 = 6.
POP BP; RET 4: IP = 010Bh, SP = FFF8h + 2 + 4 = FFFEh. Parametreler atıldı, yığın dengeli.
ORG 100h MOV AX, 10 PUSH AX MOV AX, 4 PUSH AX CALL FARK RET FARK PROC PUSH BP MOV BP, SP MOV AX, [BP+6] SUB AX, [BP+4] POP BP RET 4 FARK ENDP
Çoktan Seçmeli · CALL / RET
Soru 15: İlk Parametrenin Yeri
Çağıran üç parametre itip yakın CALL yapıyor; prosedür PUSH BP ve MOV BP, SP ile başlıyor. İlk itilen parametre nerededir?
B: [BP] eski BP, [BP+2] dönüş adresi, [BP+4] en son itilen (üçüncü) parametre, [BP+6] ikinci, [BP+8] ilk itilen parametredir. Parametreler pozitif, yerel değişkenler (SUB SP, n ile açılan alan) negatif BP konumundadır.
Adım Adım Çalıştırma · INT / IRET
Soru 16: INT ve IRET
Program INT 60h için kendi kesme yordamını kuruyor (vektör 60h × 4 = 180h). INT 60h yığına ne iter? IRET ne yapar? Sonunda BX nedir?
Kesme vektör tablosu 0000:0000'dadır. 0000:0180h'e isr'nin bağıl konumu, 0000:0182h'ye CS yazıldı.
BX = 5. SP = FFFEh; INT 60h (2 bayt) 0114h'de.
INT 60h: FLAGS, CS (0700h) ve dönüş IP'si (0116h) sırayla itildi: SP = FFF8h (6 bayt). IF = TF = 0 yapıldı; CS:IP vektörden yüklendi.
Kesme yordamı: BX = 10.
IRET: IP, CS ve FLAGS ters sırada geri alındı (IF yeniden 1), SP = FFFEh. Akış 0116h'den sürer.
ADD BX, 1 → BX = 11 (000Bh).
ORG 100h MOV AX, 0 MOV ES, AX MOV WORD PTR ES:[180h], OFFSET isr MOV ES:[182h], CS MOV BX, 5 INT 60h ADD BX, 1 RET isr: ADD BX, BX IRET
Hesap Sorusu · INT / IRET
Soru 17: INT 21h ve Yığın
0700:0103h adresindeki INT 21h (2 bayt) çalışıyor; SP = FFFEh. (a) INT'ten sonra SP ve yığındaki üç sözcük nedir? (b) Yordamın adresi hangi bellek konumlarından okunur? (c) IRET'ten sonra SP ve CS:IP?
Cevabı göster
(a) SP = FFFEh − 6 = FFF8h. [FFFCh] = FLAGS, [FFFAh] = CS = 0700h, [FFF8h] = IP = 0105h (INT'ten sonraki komut). Ardından IF = TF = 0.
(b) Vektör adresi 21h × 4 = 84h: IP ← [0000:0084h], CS ← [0000:0086h].
(c) IRET üç sözcüğü ters sırada alır: SP = FFFEh, CS:IP = 0700:0105h, bayraklar geri yüklenir.
Donanım kesmelerinde işlemci aynı üç sözcüğü kendisi iter; bu yüzden kesme yordamları kullandıkları yazmaçları PUSH/POP ile korur.
Hata Bulma · Yığın Güvenliği
Soru 18: 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; 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 yürütür; program çöker ya da öngörülemez davranır. MOV BX, 1 hiç çalışmaz.
Düzeltme: RET'ten önce POP AX. Kural: prosedürden çıkarken SP girişteki değerine eşit olmalı; her PUSH'un ters sırada bir POP'u bulunmalı (her dalda).
Çıktı Sorusu · Yığın Güvenliği
Soru 19: Boş Yığından POP
.COM programı SP = FFFEh ile başlıyor ve yığına hiç değer itmeden POP yapıyor. Her komuttan sonra AX ve SP nedir? Son RET nereye döner?
ORG 100h MOV BX, 7 POP AX PUSH BX RET
Cevabı göster
- POP AX: DOS'un koyduğu 0000h okunur → AX = 0000h; SP = FFFEh + 2 = 0000h (16 bitte sarar).
- PUSH BX: SP = 0000h − 2 = FFFEh; [FFFEh] = 0007h. DOS'un 0000h'si ezildi.
- RET: IP ← 0007h. PSP'nin ortasına atlanır; program düzgün sonlanmaz.
8086 alt taşmayı denetlemez: hata yoktur, yalnızca bozulma vardır. PUSH edilmemiş değer POP edilmemelidir.