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

Bölüm 8.1: Yığın · Çalışma Soruları
SS:SPLIFOPUSH / POPBayt sırasıSaklama ve takasPUSHF / POPFYığın güvenliği
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Ç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
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.

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?

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 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.

Son

Bölüm 8.1: 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.