Ugrás a tartalomhoz

Assembly/Függvények írása

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

Hívás és visszatérés

[szerkesztés]

Korábban is láttuk, hogy lehet cimkék segítségével elemi részekre szabdalni egy programot. Egy jóldefiniált tevékenységet megjelölünk egy cimkével, utánaírjuk a kódot, és a végén gondoskodunk róla, hogy a következő tevékenységnél folytatódjon a végrehajtás. Igen ám, de ez a módszer statikus: ha újrafelhasználható kódrészletet szeretnénk írni, honnan tudjuk, hogy a végén hová ugorjunk vissza? Ennek a megállapítására szolgál a korábban bemutatott verem. Az olyan cimkével ellátott kódrészletet, ami a verem alapján határozza meg, hogy a lefutása után hol folytatódjon a végrehajtás, függvénynek hívjuk.

Egy függvény hívásakor az utasításmutató (eip) értéke bekerül a verembe. Az assembly kódban a függvényhívás a call utasításnak a függvény elejét jelző cimkével mint paraméterrel való meghívását jelenti. Visszatérni a ret utasítással lehet. A ret a verem tetején lévő címre ugrik, és végrehajt egy pop műveletet.

Etimológia: call = hív

Használat:

call mem

Megjegyzések: A

call label

a

"push      eip
 jmp       label"

utasításokkal "ekvivalens". Azonban a push eip utasítás önmagában illegális.

Etimológia: ret<-return = visszatér

Használat:

ret

A

ret

utasítás a

"pop eip"

utasítást valósítja meg, azonban önmagában a pop eip is illegális utasítás. A ret-et lehet paraméterezni is, erről később.

Példa

[szerkesztés]

Írjunk olyan függvényt, ami nem csinál semmit!

nooperation:
      ret

      call      nooperation        ; Hívás.

Paraméterátadás, visszatérési érték

[szerkesztés]

Az előző példánál persze általában bonyolultabb a helyzet. Egy függvény kaphat paremétereket, használhat lokális változókat, és lehet visszatérési értéke. Ezeknek a dolgoknak a kezeléséhez érdemes szemügyre venni egy olyan általános vázat, ami alapján meg tudjuk írni a saját függvényeinket.

A függvények váza

[szerkesztés]
push      ebp
mov       ebp, esp
sub       esp, k            ; Hely lefoglalása lokális változók számára.

mov       eax, [ebp + 8]    ; Utolsó 4 bájtos paraméter elérése.
mov       ebx, [ebp + 12]   ; Utolsó előtti 4 bájtos paraméter elérése.

mov       eax, [ebp]        ; Első 4 bájtos lokális változó.
mov       ebx, [ebp - 4 ]   ; Második 4 bájtos lokális változó.

; Tevékenységek.

mov       esp, ebp
pop       ebp
ret