Assembly/Veremkezelés
Összefoglalás
[szerkesztés]A verem adatszerkezetről algoritmusok tárgyból már tanultunk. Szemléletesen a verem egy olyan adatszerkezet, amin a következő három művelet van értelmezve:
- Egy elem rátolása a verem tetejére (push).
- Nem üres verem tetején lévő elem lekérdezése (top).
- Nem üres verem tetején lévő elem eltávolítása (pop).
Amikor operációs rendszerről beszélünk, akkor verem alatt egy ennél konkrétabb dolgot értünk. A verem az a része a memóriának, ahová a függvények meghívásakor az utasításmutató aktuális értéke kerül (verem alatt ezután ezt értjük). Azért van rá szükség, hogy a függvény végrahajtásának befejeztével tudni lehessen, hogy hol kell folytatni a végrehajtást. Az operációs rendszerek verme a fent leírt verem adatszerkezetként valósul meg.
A verem tetejét a veremmutató, az esp regiszter jelzi. A nagyobb érték az adat korábbi bekerülését jelzi, tehát a verem "fejjel lefelé" van a memóriában, a magasabb memóriacímektől az alacsonyabbak irányába töltődik föl.
A vermet NASM-ból az alábbi műveletek segítségével tudjuk manipulálni.
push
[szerkesztés]Etimológia: push=lök, tol
Cél: Egy adatot rátenni a verem tetejére.
Használat:
push reg/mem/konst
Megjegyzések: Csak 2 vagy 4 bájtot lehet rátolni a veremre (legalábbis a mostani architektúrákon).
Példa:
push eax push ebx
pop
[szerkesztés]Etimológia: ?
Cél: A verem tetején lévő adat kinyerése.
Használat:
pop reg/mem
Megjegyzések: Szintén csak 2 vagy 4 bájtot lehet egyszerre manipulálni. A
pop eax
hatására a következő történik:
"mov eax, [esp] add esp, 4"
Nincs explicit top művelet. A top műveletet úgy szimuláljuk, hogy pop-pal betöltjük a verem tetejét, aztán push-sal visszaírjuk a verembe.
Kidolgozott példák
[szerkesztés]A következő részben megtanuljuk, hogy hogy használjuk a vermet függvények kezelésére, azonban a vermet az eredeti funkciójára is lehet használni, azaz lehet adatszerkezetként kezelni.
Sztring megfordítása
[szerkesztés]Feladat: Fordítsuk meg a txt címen lévő 5 hosszúságú karakterláncot.
Megoldás: A megoldáshoz a vermet használjuk. Először sorban rátoljuk a veremre a sztring karaktereit, majd sorban visszaolvasva őket visszaírjuk őket a sztringbe.
xor ecx, ecx beginread: cmp ecx, 5 je endread mov al, [txt + ecx] push ax ; Nem tudjuk az ah-t a verembe tenni, mert csak 1 bájtos. inc ecx jmp beginread endread: xor ecx, ecx beginwrite: cmp ecx, 5 je endwrite pop ax ; Lásd feljebb. mov [txt + ecx], al inc ecx jmp beginwrite endwrite: