Assembly/Függvények írása
Hívás és visszatérés
szerkesztésKorá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.
call
szerkesztésEtimoló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.
ret
szerkesztésEtimoló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ésAz 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éspush 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