Bölüm 8 · Simülatör

Yığın, CALL ve RET

← Bölüm 8
Kaynak kod · bağıl konum
    Yığın (SS = 0700h)

    Yığın, CALL ve RET

    Amaç: 8086 yığınının SS:SP ile nasıl yönetildiğini komut komut görmek. Yığın aşağı doğru büyür: her PUSH, SP'yi 2 azaltıp sözcüğü SS:SP adresine yazar; her POP, SS:SP'deki sözcüğü okuyup SP'yi 2 artırır. CALL dönüş adresini yığına iter, RET onu IP'ye geri alır.

    Nasıl kullanılır?

    1. Soldan bir program seçin; bazı programlarda başlangıç değerleri değiştirilebilir.
    2. Adım ▶ / ◀ Geri (klavyede → / ←), Oynat, Sıfırla. Mikro adımlar açıkken PUSH, POP, CALL ve RET iç adımlarına bölünür (önce SP azalır, sonra yazılır…).
    3. Sağdaki yığında küçük adresler yukarıdadır. SP→ yığının üstünü, BP→ çerçeve işaretçisini gösterir. Kesik çizgili hücreler SP'nin altında kalmıştır: değerleri silinmez, ama artık yığına ait değildir.
    4. Kendini dene: yığın komutlarından önce SP'nin, alınan değerin ya da dönüş adresinin ne olacağını tahmin edin.

    Hatırlatma

    KomutSPYaptığı
    PUSH kaynak−2SP ← SP − 2, [SS:SP] ← kaynak
    POP hedef+2hedef ← [SS:SP], SP ← SP + 2
    PUSHF / POPF−2 / +2FLAGS yığına / yığından
    CALL (yakın)−2dönüş IP'si yığına, IP ← hedef
    RET / RET n+2 / +2+nIP ← [SS:SP]; RET n ayrıca n bayt parametreyi atar
    • Parametreler yığınla geçirilince prosedür PUSH BP / MOV BP, SP ile sabit bir çerçeve kurar: [BP+0] eski BP, [BP+2] dönüş adresi, [BP+4] son itilen parametre.
    • 8086'da FLAGS yazmacının 12–15. bitleri her zaman 1 okunur; bu yüzden PUSHF yığına F2xxh biçiminde bir değer yazar.
    • .COM programı başlarken DOS yığına 0000h iter; programın son RET'i bu değeri IP'ye alır ve PSP'deki INT 20h programı bitirir.

    Programlar emu8086 sözdizimiyle yazılmıştır; bağıl konumlar, yazmaç, bayrak ve yığın değerleri 8086 kurallarına göre hesaplanır ve ortak 8086 yorumlayıcısıyla karşılaştırılarak doğrulanmıştır.

    İlgili sunumlar: Bölüm 8 · Yığın, Bölüm 7 · Prosedürler.