Skip navigation

Paraméterátadás adat szegmensen keresztül

Áttekintés

A paraméterek regisztereken keresztül történő átadásával csak annyi probléma van, hogy a regiszterek száma véges. Az átadásra használhatjuk az EAX, EBX, ECX, EDX általános regisztereket, az ESI-t, EDI-t, és végszükség esetén akár az EBP-t, de ha hétnél több paramétert kell átadnunk, akkor más megoldást kell találnunk.

Erre adhat egy lehetséges megoldást, ha a paramétereket az eljáráshívás előtt az adat szegmensben helyezzük el, és az eljárás belsejében onnan vesszük ki azokat.

A Maximum példa ezen módosulatát mutatja be az alábbi kód.

A lenti módon definiált eljárás már tetszőleges számú értéket képes megkapni, és tetszőleges adatokon képes műveleteket végezni.

Ha a paraméter átadás az adatszegmensben történik, akkor érdemes az eljáráshívás előtt a használandó regiszterek értékét a verembe menteni, majd onnan visszamenteni az eljáráshívás után.

Adat szegmens

.data

; Az elokeszuletek most az adat szegmensben kezdodnek
    param1      DWORD       0   ; egyik parameter
    param2      DWORD       0   ; masik parameter

    ; ...

Eljárás

.code

; es a kod szegmensben:
max PROC

    ; A ket parameter most a param1 es param2 változokon keresztul erkezik az adat szegmensben.
    
    MOV     EAX, param1     ; De igy a parametereket eloszor ki kell venni

    CMP     EAX, param2     ; Osszehasonlitjuk a ket parametert
    JGE     tovabb          ; Ha az EAX alapbol nagyobb, akkor nincs dolgunk, megyunk tovabb.
    
    MOV     EAX, param2     ; Kulonben attesszuk a masik szamot az EAX-be.
tovabb:

    RET                 ; Visszateres!
                        ; Eredmeny az EAX-ben.

max ENDP                ; Eljaras vege

Eljáráshívás

    MOV     param1, 100     ; Most a parameterek az adat szegmensbe kerulnek
    MOV     param2, 42
    
    CALL    max