ZÁSOBNÍK
Zásobník je kus paměti sloužící k odkládání údajů. Hlavní
použití bude asi pro uchovávání návratových adres při skoku do
podprogramu. Jestliže je někde v programu instrukce CALL (volání
podprogramu) provede procesor následující akce:
1. Uloží si do zásobníku návratovou adresu, tedy adresu
instrukce, která následuje po instrukci call.
2. Skočí do podprogramu, tento provádí, až narazí na instrukci RET
3. Vytáhne ze zásobníku návratovou adresu a skočí na ni, tedy
pokračuje ve vykonávání za instrukcí call.
Zásobník je paměť typu LIFO (Last In First Out), to znamená,
že to, co tam dáte naposledy, vytáhnete jako první. Představte si to
jako hromadu hliněných destiček. Tu, kterou položíte jako poslední na
hromadu, musíte zvednout jako první. V paměti je to ale tak, že
destičky přidáváte dospodu stohu. Takto vypadá zjednodušeně Stack
Segment (SS), tedy část paměti, kde se nachází zásobník. Na vršek
hromady ukazuje SP (Stack Pointer).
FFFFh
X5 nejstarší položka zásobníku
X4 druhá nejstarší
X3
X2
X1 <---- Sem ukazuje SP
0000
Jestliže něco do zásobníku přidáte, vrazí se to dospodu a SP
se SNÍŽÍ. Po vytažení ze zásobníku se SP opět ZVÝŠÍ.
Pro uložení hodnoty na zásobník slouží instrukce PUSH. Jejím
argumentem je většinou šestnáctibitový registr. Takže třeba PUSH AX
uloží obsah AX do zásobníku. Opakem PUSH je POP, která hodnotu
vyjme, takže POP AX vezme poslední hodnotu, která byla uložena na
zásobník a uloží ji do AX. Takže finta pro prohození dvou registrů:
PUSH AX ;na vrsku zasobniku je AX
PUSH BX ;na vrsku zasobniku je BX
POP AX ;BX z vrsku jsem presunul do AX
POP BX ;vyjmutim BX se na vrsek dostalo AX a to dam do BX
Zásobník je svině a pokud s ním chcete kouzlit, buďte hodně
opatrní, je to jedna z lehčích cest, jak si resetnout počítač.
výheň