Skip navigation

Invoke direktíva

Működés

Az INVOKE direktíva csak a 32 bites módban érhető el. Argumentumokat helyez el a veremben, majd meghív egy eljárást. Az INVOKE egy kényelmes helyettesítése a CALL utasításnak, mivel lehetőséget ad több argumentum elhelyezésére egyetlen programkód soron belül. Az alap szintaxis:

     INVOKE eljárásNév [, paraméterLista]

A paraméterLista egy opcionális, vesszővel elválasztott listája az argumentumoknak, melyeket átadunk az eljárásnak.

PROC direktíva: A PROC direktíva használatával hozhatunk létre saját eljárásokat.

     név PROC [attribútumok] [USES regiszterLista], paraméterLista

          ...

     név ENDP

A megadható attribútumokkal most nem foglalkozunk.

USES direktíva: Az adott eljárás fejlécében a USES direktíva használatával lehetőségünk van megadni regiszterek egy listáját (vessző nélkül, egymás után felsorolva), melyek az eljárás meghívásakor lementésre kerülnek a verembe, végrehajtódik az eljárás, majd visszatéréskor a veremből visszaállításra kerülnek. Természetesen azon regiszter(ek) lementése nem szükséges, amely(ek) eredményt ad(nak) vissza.

A paraméterlistában megadhatunk tetszőleges számú és típusú paramétert vesszővel elválasztva, melyeknek az eljárás hívásakor van lehetőségünk értéket adni és az eljárás futásakor felhasználni. Az alap szintaxis:

            ..., elsőParamNev:típus1, másodikParamNev:típus2, ...

 

PROTO direktíva: A PROTO direktíva készíti el egy létező eljárás prototípusát. A prototípus deklarálja az eljárás nevét és paraméterlistáját. Lehetővé teszi, hogy az adott eljárást a definiálása előtt meghívjuk és leellenőrizzük a paramétereinek nevét és típusát, hogy megegyeznek-e az eljárás definíciójával.  Meglévő eljáráshoz prototípust készíteni úgy lehet a legegyszerűbben, hogy lemásoljuk az eljárás fejlécét és a PROC kulcsszót lecseréljük a PROTO kulcsszóra, valamint ha használtuk a USES direktívát, akkor az csak az eljárás fejlécében szerepelhet, a prototípusban nem.

Példa

Egy egyszerű példa, melyben egy összeadó eljárást valósítottunk meg:


INCLUDE Irvine32.inc
.data
    A_val   DWORD   10
    B_val   DWORD   5

.code

main PROC

    ; NINCS SZUKSEG PROTO-ra HA AZ ELJARAS A HIVASA ELOTT VAN MEGVALOSITVA!
    Osszeg PROTO, param1:DWORD, param2:DWORD  ; Az "Osszeg" nevu eljaras prototipusa
    
    MOV EAX, 123    ; beletesszuk a 123 erteket, hogy az eljarashivas utan
                    ; leellenorizzuk, hogy valaban kimentettuk-e az erteket 
    
    INVOKE Osszeg, A_val, B_val ; Az "Osszeg" nevu eljaras meghivasa.
                         ; Ket parametere van: az osszeadando ket szam
    
    Call WriteInt   ; ellenorzo kiiratas
    Call Crlf       ; ujsor beszurasa
    
    INVOKE  ExitProcess,0
main ENDP
    
; Egy osszeado eljaras, melynek ket bemeneti parametere van: az osszeadando ket szam
; Ezeket a parametereket jeloltuk param1 es param2 nevekkel, es tipusuk DWORD
; USES direktiva hasznalataval az EAX regisztert mentjuk ki hivas utan
Osszeg PROC USES EAX, param1:DWORD, param2:DWORD

    MOV EAX, param1 ; az elso parameter regiszterbe helyezese   
    ADD EAX, param2 ; a masodik parameter hozzaadasa    
    Call WriteInt   ; az eredmeny kiiratasa 
    Call Crlf       ; ujsor beszurasa   
    
    RET         ; visszateres az eljarashivashoz
Osszeg ENDP

end main