Bölüm 8.1: 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.
Ç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.
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 · PUSH ve POP
Soru 9: PUSHF ve POPF
Başlangıçta IF = 1, diğer bayraklar 0. RET'e gelindiğinde AX, CF ve ZF nedir? POPF yerine POP BX yazılsaydı BX ve bayraklar ne olurdu?
ORG 100h MOV AX, 0FFFFh ADD AX, 1 PUSHF ADD AX, 1 POPF RET
Cevabı göster
- İlk ADD: AX = 0000h, CF = 1, ZF = 1 (PF = AF = 1). PUSHF bayrak sözcüğünü (F257h) yığına koyar.
- İkinci ADD: AX = 0001h, CF = 0, ZF = 0.
- POPF: bayraklar geri gelir → CF = 1, ZF = 1; AX = 0001h kalır, POPF yalnız bayrakları yükler.
POP BX ile: BX = F257h (saklanan bayrak sözcüğü), bayraklar ikinci ADD'deki gibi CF = 0, ZF = 0 kalır.
Çıktı Sorusu · Örnekler
Soru 10: 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 11: 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 12: Üç 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 13: 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.
Çıktı Sorusu · Yığın Güvenliği
Soru 14: 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.
Çoktan Seçmeli · Yığın Güvenliği
Soru 15: SP Kaç Olur?
SP = FFFEh iken sırasıyla PUSH AX, PUSH BX, PUSHF, POP CX, PUSH DS, POP DX, POP BX yürütülüyor. SP kaç olur?
B: Dört itme (AX, BX, FLAGS, DS) SP'yi 8 azaltır, üç çekme 6 artırır: FFFEh − 8 + 6 = FFFCh. Yığında AX'in kopyası kalmıştır; bu durumda son RET o değeri dönüş adresi sanar. CX bayrak sözcüğünü, DX DS'yi alır; BX eski değerine döner.