Bölüm 8: Yığın

Bölüm 8: Yığın · Çalışma Soruları
SS:SPLIFOPUSH / POPBayt sırasıSaklama ve takasCALL / RETBP ile parametreINT / IRETYığın güvenliği
Sercan KÜLCÜ

Ç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
KomutAXSP[FFFCh]
MOV AX, 1234h1234hFFFEh—
PUSH AX1234hFFFCh1234h
MOV AX, 5678h5678hFFFCh1234h
POP AX1234hFFFEh1234h

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?

AX1111hBX2222hCX3333hSPFFFEhYığınFFF8····FFFA····FFFC····FFFE0000h← SP

AX = 1111h, BX = 2222h, CX = 3333h. SP = FFFEh.

AX1111hBX2222hCX3333hSPFFFChYığınFFF8····FFFA····FFFC1111h← SPFFFE0000h

PUSH AX: SP = FFFCh, [FFFCh] = 1111h.

AX1111hBX2222hCX3333hSPFFFAhYığınFFF8····FFFA2222h← SPFFFC1111hFFFE0000h

PUSH BX: SP = FFFAh, [FFFAh] = 2222h.

AX1111hBX2222hCX3333hSPFFF8hYığınFFF83333h← SPFFFA2222hFFFC1111hFFFE0000h

PUSH CX: SP = FFF8h. Üstte 3333h var.

AX3333hBX2222hCX3333hSPFFFAhYığınFFF8····FFFA2222h← SPFFFC1111hFFFE0000h

POP AX: üstteki 3333h AX'e gelir, SP = FFFAh.

AX3333hBX2222hCX2222hSPFFFChYığınFFF8····FFFA····FFFC1111h← SPFFFE0000h

POP CX: sıradaki 2222h CX'e gelir.

AX3333hBX1111hCX2222hSPFFFEhYığınFFF8····FFFA····FFFC····FFFE0000h← SP

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?

AX000AhBP0000hSPFFFChYığınFFF6····FFF8····FFFA····FFFC000Ah← SPFFFE0000h

1. parametre (10 = 000Ah) yığında: [FFFCh].

AX0004hBP0000hSPFFFAhYığınFFF6····FFF8····FFFA0004h← SPFFFC000AhFFFE0000h

2. parametre (4) yığında: [FFFAh], SP = FFFAh.

AX0004hBP0000hSPFFF8hYığınFFF6····FFF8010Bh← SPFFFA0004hFFFC000AhFFFE0000h

CALL: dönüş adresi 010Bh → [FFF8h], IP = 010Ch.

AX0004hBPFFF6hSPFFF6hYığınFFF60000h← SPFFF8010BhFFFA0004hFFFC000AhFFFE0000h

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.

AX000AhBPFFF6hSPFFF6hYığınFFF60000h← SPFFF8010BhFFFA0004hFFFC000AhFFFE0000h

MOV AX, [BP+6]: [FFFCh] = 000Ah → AX = 10.

AX0006hBPFFF6hSPFFF6hYığınFFF60000h← SPFFF8010BhFFFA0004hFFFC000AhFFFE0000h

SUB AX, [BP+4]: 10 − 4 = 6.

AX0006hBP0000hSPFFFEhYığınFFF6····FFF8····FFFA····FFFC····FFFE0000h← SP

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?

BX0000hSPFFFEhIF1YığınFFF8····FFFA····FFFC····FFFE0000h← SP

Kesme vektör tablosu 0000:0000'dadır. 0000:0180h'e isr'nin bağıl konumu, 0000:0182h'ye CS yazıldı.

BX0005hSPFFFEhIF1YığınFFF8····FFFA····FFFC····FFFE0000h← SP

BX = 5. SP = FFFEh; INT 60h (2 bayt) 0114h'de.

BX0005hSPFFF8hIF0YığınFFF80116h← SPFFFA0700hFFFCFLAGSFFFE0000h

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.

BX000AhSPFFF8hIF0YığınFFF80116h← SPFFFA0700hFFFCFLAGSFFFE0000h

Kesme yordamı: BX = 10.

BX000AhSPFFFEhIF1YığınFFF8····FFFA····FFFC····FFFE0000h← SP

IRET: IP, CS ve FLAGS ters sırada geri alındı (IF yeniden 1), SP = FFFEh. Akış 0116h'den sürer.

BX000BhSPFFFEhIF1YığınFFF8····FFFA····FFFC····FFFE0000h← SP

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.

Son

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