Skip navigation

Pataméter átadások eljárások számára

Keret a gyakorláshoz

Az órai anyaghoz és a gyakorláshoz az alábbi linken található kódkezdemény:

gy_proc.asm

Áttekintés

Az assembly is szükségünk lehet arra, hogy az általunk használt eljárásoknak paramétereket adjunk át. A megszokott nyelvekkel (C, C++, Java, C#) ellentétben viszont itt a paramétereket nem egy paraméterlistán keresztül adjuk át. E-helyett azt használjuk, ki, hogy eljáráshíváskor a a tárolt adatok nagy része - a legtöbb regiszter, a verembe korábban beletett, az adat szegmensben tárolt adatok - érintetlenül maradnak.

A paraméterek átadása tehát úgy fog működni, hogy az eljáráshívás előtt az adatokat egy megfelelő tárolóba tesszük, amiből az eljárás futása közben kivehetjük azokat.

Mindemellett az paraméterátadásnak több formája van attól függően, hogy milyen tárolót használunk az átadásra. A különböző tárolók használatának vannak előnyei, hátrányai, amik szintén fontosak.

Emlékeztető

A tárgyalt technikákhoz szükség van az eljáráshívások mechanizmusának pontos ismeretére is.

Egy eljárás szerkezete az alábbi módon néz ki:

ELJARAS PROC
    
    ; ...
    ; Eljárás törzse
    ; ...
    
    RET         ; Visszateres a hivohoz

ELJARAS ENDP

Az eljárásunkat a "CALL ELJARAS" utasítással hívhatjuk meg. Ennek működése:

  • A futó eljárásban a következő utasítás memóriacímét (EIP regiszter) kimentjük a verembe,
  • Az EIP-t átállítjuk az eljárás elő utasítására.

Az eljárásból történő visszatérés a RET utasítással történik. Ennek működése:

  • A verem tetején levő 4 byte-ot kivesszük és az EIP-be töltjük. (Ezzel remélhetőleg oda tér vissza az EIP ahova az eljáráshívás előtt mutatott.)

FONTOS :

  • A RET utasítás hiányában az eljárásunk nem tér vissza. A processzor olvassa tovább és végrehajtja a memóriában az eljárás után levő számsorozatot. (Ez lehet a következő eljárás, az adat szegmens, vagy csak random parancskódok.)
  • A RET utasítás a verem tetejét tölti be az EIP-be. Ha a verem tartalmát megváltoztatjuk, és a verem felső eleme nem a visszatérési érték, akkor véletlenszerű címre ugrik a vezérlés.