Assembly/Veremkezelés

A Wikikönyvekből, a szabad elektronikus könyvtárból.

Ö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: