Skip navigation

Paraméterátadás vermen keresztül

Mechanizmus

A paraméter átadás legfejlettebb módja a paraméterek vermen keresztül történő átadása. Ilyenkor az eljáráshívás előtt a verembe kell menteni ezeket az értékeket.

Ebben az helyzetben az adatok átadása az alábbi lépésekkel oldható meg.

  • A paramétereket elhelyezzük a veremben, és a sorrendjüket feljegyezzük.
  • Meghívjuk az eljárás.
  • Az eljárás hívás elején az EBP korábbi értékét elmentjük, és készítünk bele egy másolatot az ESP-ről. Ekkor az EBP egy fix pontként fogja mutatni, hogy az eljárás indulásakor hol volt a verem teteje.
  • Az eljárás törzsén belül elvégezzük a számítást. A paramétereket az EBP-hez képest relatív címzéssel tudjuk megtalálni.
  • A vermet továbbra is használhatjuk rendeltetés szerűen (akár újabb eljárások számára a paraméterek átadására is), mivel az ESP szabad, a paraméterek elérésére az EBP-t használjuk.
  • Az eljárás végén visszaállítjuk az EBP korábbi értékét. Ha a hívó kód hasonlóan a vermen keresztül kapta a paramétereit, akkor ezzel visszaállítjuk a paraméterlistáját.
  • Visszatérünk.
  • A bent maradt paramétereket kitakarítjuk a veremből.ú

A maximum vermet alkalmazó megoldása az alábbi kódban található. Most először az eljáráshívást nézzük meg.

Eljáráshívás

    MOV     EAX, 100    ; Egyik parameter
    PUSH    EAX         ; Mehet a verembe
    MOV     EAX, 42     ; Masik parameter
    PUSH    EAX         ; Ez is megy a verembe
    
    CALL    max
    
    ADD     ESP, 8      ; Az eljaras utan takaritunk
                        ; A verem tetejen van 8 byte adat, amik a paraméterek voltak.
                        ; A vere mutato 8-al való eltolása ugyanaz, mintha kivettünk volta két DWORD-ot.

Eljárás törzse

max PROC

    PUSH    EBP
    MOV     EBP, ESP

; A ket parameter a veremben. a megfelelő helyen

    ; Az EBP a jelenlegi legfelso elemre mutat (ez az EBP elozo erteke)
    ; Alatta (az [EBP+4]-ben) van a az EIP elozo erteke, a visszateresi cim.
    ; Azok alatt (az [EBP+8]-ban) viszont már a paraméterek vannak.

    MOV     EAX, [EBP+8]     ; Az egyik parametert kivesszuk a verembol
    CMP     EAX, [EBP+12]    ; Osszehasonlitjuk a masikkal
    JGE     tovabb           ; Ha az EAX alapbol nagyobb, akkor nincs dolgunk, megyunk tovabb.
    
    XCHG    EAX, [EBP+12]    ; Kulonben letaroljuk a nagyobb szamot.
tovabb:

    POP     EBP      ; ES kitisztijuk a vermet!!! FONTOS, e nélkül az EIP rosz helyre áll vissza!

    RET              ; Visszateres!
; Eredmeny az EAX-ben. max ENDP ; Eljaras vege