Sintaxis estructural de win32
Primero echemos un vistazo al ensamblador Win32 más simple:
.386
.model flat, stdcall
option casemap: ninguno; distingue entre mayúsculas y minúsculas
incluir windows.inc incluir kernel32.inc incluir usuario32.inc
incluirlib kernel32.lib incluirlib usuario32.lib
.data
szCaption db 'Ejemplo de ensamblado de Win32',0
szText db 'Ensamblado de Win32, ¡simple y potente!',0
.code
start :
invocar MessageBox,NULL,addr szText,addr szCaption,MB_OK
invocar ExitProcess,NULL
finalizar inicio
Esto es El programa ensamblador Win32 más simple que se puede ejecutar. Permítanme presentarles brevemente las funciones de cada parte: .model le dice al compilador el modo del programa. Las personas que han compilado el ensamblador Dos pueden saber que los modos de los programas Dos incluyen pequeño, pequeño,. ... enorme, etc., que especifica el modo de direccionamiento de la memoria del programa. En los modos enorme y otros, el direccionamiento de memoria y las llamadas a subrutinas usarán el formato Far, pero en el ensamblaje Win32, solo puede usar un modo, el modo plano, porque para programas Win32. , la memoria es un segmento continuo de 4 GB y no hay modo pequeño ni grande. Y stdcall le dice al compilador cómo se pasan los parámetros. Cuando se llama a una subrutina, los parámetros se pasan a través de la pila. Hay tres formas de pasar parámetros, stdcall, cy pascal especifica que los parámetros se envían a la pila de derecha a izquierda. Por ejemplo, para una API de Windows como MessageBox, se define de la siguiente manera en el manual:
int MessageBox(
HWND hWnd, // identificador de la ventana del propietario
LPCTSTR lpText, // dirección del texto en el cuadro de mensaje
LPCTSTR lpCaption, // dirección del título del cuadro de mensaje
UINT uType // estilo del cuadro de mensaje
);
Entonces podemos llamarlo en ensamblador así:
push uType
push lpCaption
push lpText p>
push hWnd
call MessageBox
Todos deben tener en cuenta que el parámetro más a la derecha es el último que se coloca en la pila. Por supuesto, no es necesario. Tome tantas molestias para llamar a una API, porque Masm Una declaración macro no solo nos ayuda a completar todas las operaciones de inserción, sino que también nos ayuda a verificar si la cantidad de parámetros es correcta, es decir, la declaración de invocación. Podemos reemplazar la declaración anterior con. invocar MessageBox,hWnd,lpText,lpCaption,uType Eso es todo. Por ejemplo, si los parámetros reales se sustituyen en este programa, se invocará MessageBox, NULL, addr szText, addr szCaption, MB_OK.
Independientemente de la programación en Dos o Windows, siempre necesitamos utilizar muchos otros datos además de los archivos ejecutables, como datos de sonido, datos gráficos, texto, etc. Al programar en Dos, podemos definir estos formatos nosotros mismos, pero esto. Ha causado muchos problemas para compartir recursos. Quizás aún recuerde que muchos juegos en Dos tienen sus gráficos almacenados en su propio formato. Tampoco hay forma de guardarlo en otro formato. Aunque todavía podemos hacer esto en la programación Win32, la programación Win32 nos brinda una solución: un archivo de recursos con un formato unificado, que define cadenas, gráficos, cuadros de diálogo, incluidos los botones anteriores, texto, etc., en un archivo de recursos. Úselo fácilmente en diferentes archivos. Lo más importante es que si usamos nuestro propio formato de archivo, las operaciones de lectura y escritura de estos archivos estarán involucradas al usarlo, lo cual es más complicado. Pero cuando se usan archivos de recursos, Windows proporciona una. Serie de API para cargar recursos. Muy conveniente. .rc, cuando se compila con el compilador de recursos para generar un archivo .res, se puede conectar al archivo .exe al vincular:
#include
# definir DLG_MAIN 1
DLG_MAIN DIALOGEX 0, 0, 236, 185
ESTILO DS_MODALFRAME | WS_POPUP | p >
FUENTE 9, Dinastía Song
COMENZAR
DEFPUSHBUTTON Salir,IDOK,177,163,50,14
CONTROL,-1,Estático,SS_ETCHEDHORZ ,7,155,222 ,1
END
La sintaxis del archivo .rc:
#include
#define DLG_MAIN 1: similar a la declaración equ del archivo .asm, e igual que la programa fuente ensamblador, estas definiciones son para la legibilidad del programa.
DLG_MAIN DIALOGEX 0,0,236,185
El archivo .rc de Windows puede definir BITMAP (mapa de bits), CURSOR (cursor), ICON (icono), ACCELERATORS (teclas de aceleración), DIALOG (cuadro de diálogo ), MENU (menú), STRINGTABLE (tabla de cadenas), RCDATA (recurso personalizado) y otros 8 recursos Para obtener descripciones detalladas, consulte los libros sobre MFC En la sintaxis del compilador de recursos en Win32ASM, el formato general El método de definición. de estos recursos es:
Definición de mapa de bits: nameID BITMAP [load-mem] nombre de archivo
Definición de cursor: nameID CURSOR [load-mem] nombre de archivo
Definición de icono : nameID ICONO [load-mem] nombre de archivo
Definición de clave del acelerador:
acctablename ACELERADORES [declaraciones-opcionales]
Evento BEGIN, valor de id, [tipo] [ opciones]
.
END
etc. Para definiciones y parámetros específicos, consulte el archivo de ayuda Rc.hlp en Masm32v5.
(Se puede descargar en la herramienta de programación), podemos usar el editor de recursos para editar recursos WYSIWYG, o podemos usar las declaraciones anteriores para definir los recursos nosotros mismos en un editor de texto. En un programa, los recursos deben cargarse en la memoria antes de que puedan usarse. Windows define una serie de API para cargar recursos, como LoadMenu, LoadString, LoadBitmap, etc., como la definición de LoadBitmap:
HBITMAP LoadBitmap(
HINSTANCE hInstance, // identificador de la instancia de la aplicación
LPCTSTR lpBitmapName // dirección del nombre del recurso de mapa de bits
);
These Load El valor de retorno de la función es un identificador y los parámetros de llamada generalmente incluyen al menos dos elementos: hInstance y ResouceName. Este ResouceName (como BitmapName, MenuName) es el valor especificado por #define en el archivo de recursos. Si usa #define MY_ICON 10/ MY_ICON ICON Main.ico define un ícono, entonces si desea usar el ícono Main.ico en el programa, puede usar LoadIcon(hInstance,10) para cargar el archivo de ícono que se ha definido como el número 10. Otro parámetro, hInstance, es el identificador del archivo de ejecución, que corresponde al nombre del archivo donde se encuentra el recurso. Puede usar invocar GetModuleHandle, NULL para obtener hInstance cuando el programa comience a ejecutarse. Otros recursos no se cargan explícitamente, como los recursos del cuadro de diálogo, que el propio Windows carga en la función que crea el cuadro de diálogo, como invocar DialogBoxParam, hInstance, DLG_MAIN, NULL, offset _ProcDlgMain en el siguiente ejemplo, 0, es para muestra un cuadro de diálogo que se ha definido en el archivo de recursos en la pantalla. No hay ninguna API como LoadDialogBox para cargar el cuadro de diálogo primero.