Red de conocimiento informático - Problemas con los teléfonos móviles - El ensamblado Win32 utiliza una matriz de estructura

El ensamblado Win32 utiliza una matriz de estructura

El siguiente ejemplo combina sus requisitos y espero que le ayude.

;Ejemplo de aplicación de estructura Ex8.asm(e:\masm\base).

.386

.model flat, stdcall

opción casemap :none

incluye windows.inc

incluir kernel32.inc

includeelib kernel32.lib

incluir user32.inc

includeelib user32.lib

.data

;COORD STRUCT ;Definido en el archivo windows.inc

; x WORD ?

y WORD ?

;COORD ENDS

buffer db 80 dup(0)

CapMsg db 'Output',0

szFmt db 'suma de stPos.x = %d, suma de stPos.y = % d ',0

stPos1 COORD <4,8& gt; Definir e inicializar variables de estructura

stPos2 COORD <> ;Definir variables de estructura (tomar el valor inicial original de la estructura)

p>

stPos3 COORD {2,4}; Definir e inicializar variables de estructura

stPos4 COORD {,40}; Definir e inicializar variables de estructura

stPos4 COORD { ,40} ;Definir e inicializar la matriz de estructura

stPos COORD 10 dup(<0,0>) ;Definir la matriz de estructura

.

Código

Inicio:

mov stPos2.x, 10 ; usar campos

mov stPos2.y, 20

mov ecx,10

mov edi,offset stPos ;edi apunta a la variable de estructura

mov eax,1

mov ebx,11

@:

mov (COORD ptr[edi]).x, ax

mov (COORD ptr[edi]).y, bx

agregar edi,tipo COORD ;tamaño de la estructura

inc ax

inc bx

bucle corto @B

xor eax,eax

xor ebx,ebx

xor ebx,ebx

mov ecx,10

mov edi,offset stPos ;edi apunta a la variable de estructura

@@:

agregar ax,(COORD ptr[edi]).x

agregar bx,(COORD ptr[edi]).y

agregar edi, escriba COORD ; Tamaño de la estructura

bucle corto @B

invocar wsprintf,; Formatear cadena de mensaje

addr buffer,; La posición de la cadena del mensaje

addr szFmt, ; El formato de la cadena del mensaje

eax,

ebx

;;; ; ;;; Formatear la cadena del mensaje. p>

invocar cuadro de mensaje, ;mostrar cuadro de mensaje

NULL, ;identificador de ventana principal

búfer de desplazamiento, ;cadena de cuerpo

desplazamiento CapMsg , ;Cadena de encabezado

MB_OK ;Botón "OK"

INVOKE ExitProcess,0 ;Finalizar proceso

fin inicio

Referencias:

1. Definición del tipo de estructura

Utilizando STRUC y ENDS, puede incluir una serie de declaraciones de definición de datos como un nuevo tipo de estructura definido por el usuario. Su formato de descripción general es el siguiente:

Nombre de la estructura STRUC [alineación][, NONUNIQUE]

Secuencia de declaración de definición de datos

Nombre de la estructura ENDS

Explicación: El nombre de la estructura es un identificador legal y es único. El nombre de la estructura representa todo el tipo de estructura y los dos nombres de estructura antes y después deben ser iguales. Las variables definidas en la estructura son campos de estructura y los nombres de las variables son los nombres de los campos.

La estructura puede contener cualquier número de campos, cada campo puede ser de cualquier tipo y ocupar cualquier número de bytes. Si un campo tiene un nombre de campo, el nombre del campo debe ser único. Se puede acceder a cada campo de forma independiente.

Alineación: puede utilizar 1, 2 o 4 para especificar los límites de bytes de los campos en la estructura. El valor predeterminado es 1. Consulte la Sección 4.3.2 para obtener una descripción;

NO ÚNICO: Requiere acceso a los campos en una estructura por sus nombres completos, consulte la subsección "Referencias de campos de tipo de estructura".

Por ejemplo:

CURSO

ESTRUC En el ejemplo superior izquierdo, CURSO es el nombre de la estructura, que contiene tres campos: NO, CNAME y PUNTUACIÓN, Los tipos son DD, DB y DW respectivamente.

CNAME DB 'Assember'

PUNTUACIÓN DW 0

CURSO

FINALIZA

En el ejemplo anterior, COURSE es el nombre de la estructura, que contiene tres campos:

El tipo de estructura COURSE*** ocupa 14 bytes, y los desplazamientos de sus campos NO, CNAME y SCORE son 0, 4 y 12 respectivamente. .

Los campos de la estructura pueden tener nombres de campo o no. Se puede acceder a los campos con un nombre de campo directamente usando el nombre del campo, mientras que a los campos sin un nombre de campo se puede acceder usando el desplazamiento del campo en la estructura.

Por ejemplo:

PEASON

STRUC

NO DD ?La compensación es 0

NOMBRE DB 10 dup (?) ; el desplazamiento es 4

DB 1 ; el desplazamiento es 14

PEASOM

ENDS

en la estructura En el cuerpo PEASON, Hay dos campos con nombres de campo y un campo no tiene nombre de campo, pero independientemente de si hay un nombre de campo, podemos acceder a él a través del desplazamiento del campo.

2. Definición de variables de tipo de estructura

Después de definir el tipo de estructura, el programador puede especificar las variables de memoria del tipo de estructura. Su forma de descripción es básicamente la misma que la de la variable de tipo de datos simple descrita anteriormente. El formato de definición es el siguiente:

[Nombre de la variable] Nombre de la estructura <[Tabla de valores de campo]>

Explicación: 1),

El nombre de la variable es del tipo de estructura El nombre de la variable se puede omitir. Si se omite, no se puede acceder a la unidad de almacenamiento a través del nombre simbólico;

2) La tabla de valores de campo asigna valores iniciales a los campos, separados por comas ','. los valores deben ser consistentes con la descripción Los campos en esta estructura son consistentes

3) Si un campo en la variable de estructura usa un valor predeterminado al describirlo, se puede expresar con una coma; ; si este es el caso para todos los campos, la tabla de valores de campo se puede omitir, pero se deben conservar un par de corchetes angulares "<", ">".

Por ejemplo:

CURSO1

CURSO <> ;Usar valor inicial predeterminado

CURSO2 CURSO <1, 'Pascal', 60 >

CURSO3 CURSO <2, , 84> ;;Usar nombre de curso predeterminado

PEASON1 PEASON <1000, 'Zhang San', 34>

3. Sí Referencia a campos de tipo estructura

Después de definir una variable de tipo estructura, si desea acceder a un campo en su estructura, puede utilizar el siguiente formulario:

Nombre de la variable de estructura. Nombre de campo

Esto es exactamente lo mismo que una referencia de campo en un lenguaje de alto nivel. También podemos usar compensaciones para acceder a uno de los campos, pero este método no es intuitivo y tiene muchas variables, por lo que. Generalmente no se recomienda utilizar este método.

Por ejemplo:

EXAM1 STRUC

F1 DW ?

F2 DB ?

PAR ;alineación par

F3 DW ?

EXAM1 ENDS

E1 EXAM1 <1234H,'A',8765H> ;Define la variable E1 de la estructura EXAM1

Los dos métodos siguientes asignan el contenido de los campos en la variable de estructura E1 al registro AX, pero si se agregan o restan campos de la estructura antes del campo F3, ¿es necesario cambiar estas referencias?

(1) Referencia directa mediante nombre de campo

MOV AX, E1.F3

(2) Referencia indirecta mediante desplazamiento de campo

p>

LEA SI, E1

MOV AX, [SI+4] ; donde 4 es el desplazamiento del campo F3

;