You are on page 1of 3

INVOKE

Encabezados de 32 bits de Windows proporcionan cuatro macroinstrucciones para llamar
procedimientos con parámetros pasados en la pila . El stdcall llama directamente al procedimiento
especificado por el primer argumento con el STDCALL convención de llamada . El resto de los
argumentos que se pasan a la macro de unir los parámetros al procedimiento y se almacenan en la
pila en orden inverso. La macro invocación hace lo mismo, sin embargo, llama al procedimiento
indirectamente , a través del puntero marcado por el primer argumento . Por lo tanto invocar se
puede utilizar para llamar a los procedimientos a través de los punteros de nidos en las tablas de
importación. Esta línea :
invocar MessageBox , 0, szText , szCaption , MB_OK
es equivalente a :

stdcall [ MessageBox ] , 0, szText , szCaption , MB_OK
y ambos generan este código:
empujar MB_OK
empujar szCaption
empujar szText
presione 0
call [ MessageBox ]
El ccall y cinvoke son análogos al stdcall e invocan, pero deben ser utilizados para llamar a los
procedimientos que utilizan la convención de llamada de C, donde el marco de la pila tiene que ser
restaurado por el llamador.
Para de nir el procedimiento que utiliza la pila de parámetros y locales las variables, debe utilizar el
macroinstrucción proc. En su forma más simple, tiene que ser seguido por el nombre para el
procedimiento y luego nombres para el todo los parámetros que se necesita, como:
WindowProc proc, hwnd , WMSG , wparam , lparam
La coma entre el nombre del procedimiento y el parámetro de primera es opcional. Las
instrucciones del procedimiento deben seguir en las siguientes líneas, que terminaron con la
macroinstrucción endp . El marco de pila se configura automáticamente en la entrada al
procedimiento, el registro EBP se utiliza como una base para acceder a los parámetros, por lo que
debe evitar el uso de este registro para otros fines. Los nombres especificado para los parámetros
se utilizan para des etiquetas basado en EBP necesario, que puede utilizar para acceder a los
parámetros como variables regulares. Por ejemplo, la mov eax , [ hwnd ] la instrucción dentro del
procedimiento de nido como en el ejemplo anterior , es equivalente a mov eax , [ ebp 8 ] . El
alcance de esas etiquetas se limita a el procedimiento, por lo que puede utilizar los mismos
nombres para otros fines fuera el procedimiento dado.
Dado que todos los parámetros son empujados en la pila como dobles palabras cuando llamar a
estos procedimientos, las etiquetas de los parámetros son de nidas para marcar el palabra de
datos dobles por defecto, sin embargo puede que especificar el tamaño de la parámetros si lo
desea, a continuación del nombre del parámetro con dos puntos y el operador de tamaño. El
ejemplo anterior se puede reescribir de esta forma, que es nuevo equivalente:
WindowProc proc, hwnd : DWORD , WMSG : DWORD , \
wparam : DWORD , lparam : DWORD

Si especifica un tamaño menor que la doble palabra, la etiqueta dada se aplica a la pequeña
porción de toda la palabra doble almacenada en la pila. Si se especifica un tamaño más grande,
como puntero lejos de la palabra de cuatro, los dos parámetros de palabra doble son de nido para
mantener este valor, pero se etiquetan como una variable.
El nombre del procedimiento puede ser también seguida por ya sea el stdcall o c palabra clave
para de nir la convención de llamada que utiliza. Cuando existe tal tipo es especificado, se utiliza el
valor predeterminado, que es equivalente a STDCALL. Entonces también la palabra clave usos
puede seguir, y después de que la lista de registros (separados sólo con espacios) que se
almacenará automáticamente en la entrada al procedimiento y restaurado al salir. En este caso, la
coma después de la lista de los registros y antes Se requiere el parámetro RST. Así que la sentencia
de procedimiento con todas las funciones podría tener este aspecto:
stdcall WindowProc proc utiliza ebx esi edi , \
hwnd : DWORD , WMSG : DWORD , wparam : DWORD , lparam : DWORD
Para declarar la variable local se puede utilizar el macroinstrucción locales, seguido de uno o más
declaraciones separados por comas , cada uno que consiste en el nombre de la variable seguido de
dos puntos y el tipo de variable , ya sea uno de los tipos estándar ( debe estar en mayúsculas ) o el
nombre de los datos estructura . Por ejemplo:
hDC local: DWORD , rc: RECT
Para declarar un array local , puede seguir el nombre de la variable por el tamaño de array entre
corchetes , como :
str locales [ 256 ] : BYTE
La otra forma de definir las variables locales es declararlas dentro del bloque comenzó con
"locales" macroinstrucción y terminó con " endl “, en este caso que puedan ser de nido como
datos regulares. Esta declaración es el equivalente de la muestra anterior locales
dd hDC?
rc RECT
endl

Las variables locales pueden ser declaradas en cualquier lugar dentro del procedimiento, con la
única limitación de que tienen que ser declaradas antes de ser utilizadas. El alcance de las
etiquetas de las variables de ne como local, se limita a dentro del procedimiento, se pueden
utilizar los mismos nombres para otros fines ajenos al procedimiento. Si dan algunos valores
inicializados a las variables declaradas como local, el macroinstrucción genera las instrucciones
que inicializar estas variables con lo dado valores y pone estas instrucciones en la misma posición
en el procedimiento, donde se coloca la declaración. El ret colocar en cualquier lugar dentro del
procedimiento, genera la completa código necesario para salir correctamente el procedimiento, la
restauración del marco de pila y los registros utilizados por procedimiento. Si usted necesita para
generar el retorno de prima instrucción, utilice la tecla de acceso retn, o seguir el ret con el
número parámetro, lo que también hace que se puede interpretar como una sola instrucción.
Para recapitular, el total de nici on del procedimiento puede tener este aspecto

WindowProc proc utiliza ebx esi edi, hwnd, WMSG, wparam, lparam
hDC local: DWORD, rc: RECT
; las instrucciones
enriar
endp