Red de conocimiento informático - Conocimiento sistemático - Instrucciones generales para lenguaje ensamblador

Instrucciones generales para lenguaje ensamblador

Análisis de las causas de los errores de ensamblaje en el lenguaje ensamblador de microcontroladores

Actualmente, existen dos estándares diferentes para los formatos de instrucción en lenguaje ensamblador: el lenguaje ensamblador en Windows sigue básicamente una sintaxis de estilo Intel, como MASM y NASM en Unix; /Linux El lenguaje ensamblador básicamente sigue la sintaxis del tipo AT&T;

1 El formato general de las declaraciones en lenguaje ensamblador

[Nombre[:]]Script[primer operando][, No. Dos. operandos]; Anotar...

Los operandos del código de instrucción en lenguaje ensamblador pueden ser 0, 1, 2 cuando el número de operandos es 2, la declaración tiene dos formatos diferentes:

El formato de declaración del lenguaje ensamblador estilo Intel en Windows es:

[Nombre [:]] El operando DST del código de instrucción, el operando fuente SRC anota...

En Unix/Linux; el formato de la declaración en lenguaje ensamblador tipo t es:

[Nombre [:]]Script fuente operando SRC, operando destino DST anotar...

Por ejemplo: Ciclo: Agregar AX, 02H (AX) El "nombre" en el formato de declaración en lenguaje ensamblador no es necesario para todas las declaraciones. Sin embargo, si hay un "nombre" en la declaración, en la mayoría de los casos, el "nombre" representa la dirección de una determinada unidad de almacenamiento en la memoria, es decir, la dirección de la primera unidad de almacenamiento almacenada en la memoria después de " nombre" (incluido "La dirección del segmento y la dirección de desplazamiento del segmento donde se encuentra "nombre", por ejemplo, en la instrucción anterior, CYCLE es el nombre de la declaración y CYCLE representa la primera dirección donde se encuentra el código de instrucción de la máquina detrás); se almacena en la memoria; "nombre" y El delimitador entre códigos de instrucción puede ser dos puntos ":" o un carácter de espacio "" cuando está separado por dos puntos, el nombre representa una etiqueta cuando está separado por un espacio; representa una etiqueta o una variable cuando el código de instrucción tiene múltiples Cuando hay dos operandos, dos operandos adyacentes deben estar separados por una coma "," el código de instrucción y el operando deben estar separados por un espacio; la declaración del lenguaje debe comenzar con punto y coma ";";

En segundo lugar, los elementos que componen la declaración

1. Constantes:

Las constantes en lenguaje ensamblador son enteros y cadenas; binario, octal, decimal, hexadecimal; el lenguaje ensamblador se distingue por diferentes sufijos:

b: número binario; o: número octal; d: número decimal; >

Cuando un valor numérico no tiene sufijo, el valor predeterminado es un número decimal;

Una constante de cadena es una cadena encerrada entre un par de comillas simples ("");

2. Expresión:

Consta de operandos y operadores;

Operadores aritméticos: , -, *, /, MOD, etc. La operación de módulo MOD consiste en tomar el resto después de dividir dos números;

Operadores de operación lógica: AND (AND lógico), OR (OR lógico), NOT (NO lógico), XOR (XOR lógico); p>

Nota: Los operadores lógicos también pueden ser códigos de instrucción de instrucciones de operación lógica. Son operadores solo si aparecen en la parte del operando de la instrucción, por ejemplo:

Agregar AL, 0CH agregar; 0FH Una adición es el código de instrucción y la segunda adición es el operador.

Operadores relacionales: EQ (igual), NE (no igual), LT (menor que), GT (mayor que), LE (menor o igual que), GE (mayor o igual que) ;

Las expresiones en lenguaje ensamblador no pueden constituir una declaración por sí solas, sino que solo pueden ser parte de una declaración;

Nota: La evaluación de las expresiones en una declaración no se completa cuando la declaración es ejecuta, pero al ensamblar y vincular el programa fuente se completa.

Por lo tanto, el valor de cada expresión en la declaración debe determinarse en el momento del ensamblaje o vinculación, es decir, el valor de cada identificador en la expresión debe determinarse en el momento del ensamblaje o vinculación;

3.

El número de referencia es el nombre de la instrucción representada por el identificador, que se utiliza para indicar la ubicación (dirección) de la instrucción correspondiente;

La etiqueta tiene tres atributos: segmento dirección, dirección de desplazamiento y tipo

Los atributos de dirección de segmento y dirección de desplazamiento de la etiqueta se refieren a la dirección de segmento y la dirección de desplazamiento dentro del segmento de la instrucción correspondiente a la etiqueta

Hay dos tipos de etiquetas: definición de etiqueta cercana y lejana. Es un tipo cercano, que indica que la etiqueta se usa dentro de un segmento, y la etiqueta se define como un tipo lejano, que indica que la etiqueta se puede usar entre segmentos;

Definición de etiqueta: agregue un identificador y dos puntos ":" antes del código de instrucción;

Por ejemplo: Inicio: Push DS

En esta oración, INICIO es la etiqueta que definimos, que representa la dirección de la instrucción PUSH, por lo que la etiqueta se puede usar como la operación del número de instrucción de transferencia del programa (es decir, la dirección a la que se transferirá la etiqueta también se puede definir mediante pseudo-etiquetas); instrucciones; por ejemplo, usando instrucciones de etiqueta e instrucciones de definición de procesos;

4. Variables:

y lenguajes de alto nivel De manera similar, no todos los operandos son constantes. variables, y los valores de las variables se pueden cambiar mientras el programa se está ejecutando.

A. Definir variables: En lenguaje ensamblador la definición de variables se completa con pseudoinstrucciones el formato de las pseudoinstrucciones para definir variables es el siguiente:

Nombre de variable; expresión DB; definición de variable de byte, también llamada variable de un solo byte (1 byte consecutivo), DB->;byte

Nombre de variable expresión DW, también llamada variable de palabra de doble byte (2 bytes continuos; ), dw->; palabra

Nombre de variable Expresión DD; define una variable de doble palabra, también llamada variable de cuatro bytes (cuatro bytes consecutivos), DD->DWORD

La expresión DF del nombre de la variable define una variable de seis bytes, también llamada variable de seis bytes (seis bytes consecutivos), df-> FWORD

Expresión DQ de la definición de nombre de variable Variable de palabra larga, también llamada; variable de ocho bytes (8 bytes consecutivos), dq-> QWORD

nombre de variable expresión DT; define una variable de sección transversal (10 bytes consecutivos), dt->TBYTE;

Entre ellos, el nombre de la variable es un identificador legal y no se pueden agregar dos puntos ":" después del nombre de la variable, solo se pueden usar espacios. El nombre de la variable no es obligatorio y el tipo de variable se define mediante palabras clave; DB, DW, DD, DQ y DT.

La "expresión" en la declaración de definición de variable se utiliza para inicializar la variable. Hay varias situaciones:

(1). Una o más constantes o expresiones; cuando hay varias constantes o expresiones, los puntos deben estar separados por comas, como datos 1-datos

;

(2). Cadena con comillas simples;

Para variables de tipo byte (DB), el tamaño de cada variable es 1 byte y el valor de cada variable no puede exceder 1 carácter, cada byte se almacena. el valor del código ASCII de un carácter. La cadena completa se puede dar entre el mismo par de comillas simples, lo que equivale a definir una matriz de caracteres, como DATA5

Para variables de tipo palabra (DW), el tamaño de cada variable es de 2 bytes. cada uno El valor de una variable no puede exceder los 2 caracteres. Si son 2 caracteres, también sigue la regla de que el bit alto se almacena en el byte alto y el bit bajo se almacena en el byte bajo. Si es 1 carácter, el valor del código ASCII del carácter se almacena en el byte de orden inferior y el byte de orden superior es 00, como DATA6

Para variables de tipo de doble palabra (DD) , el tamaño de cada variable es de 4 palabras Sección, el valor de cada variable no puede exceder los 2 caracteres. Si son 2 caracteres, también sigue la regla de que el bit alto se almacena en el byte alto y el bit bajo se almacena en el byte bajo. Sin embargo, el valor de 2 caracteres se almacena en los 2 bytes más bajos de la variable de palabra doble, y el valor de 1 carácter se almacena en el 1 byte más bajo de la variable de palabra doble;

Durante mucho tiempo Variables de tipo palabra (DQ), el tamaño de cada variable es de 8 bytes y el valor de cada variable no puede exceder los 2 caracteres.

Si son 2 caracteres, también sigue la regla de que el bit alto se almacena en el byte alto y el bit bajo se almacena en el byte bajo. Sin embargo, el valor de 2 caracteres se almacena en los 2 bytes más bajos de la variable de palabra larga, y el valor de 1 carácter se almacena en el 1 byte más bajo de la variable de palabra larga;

(3). Signo de interrogación "?", Indica que el valor de la variable es incierto, es decir, el contenido en la unidad de almacenamiento representada por la variable es incierto, o cuando la expresión es un signo de interrogación, el área de almacenamiento correspondiente a la variable no almacene nuevos valores, solo el espacio de almacenamiento correspondiente; por ejemplo, datos 7, datos 8

(4) El formato en este momento es: número de repeticiones DUP (expresión); El valor de la expresión se puede almacenar repetidamente en el área de memoria de la variable correspondiente. El número de repeticiones viene dado por la pseudoinstrucción, que equivale a definir una matriz como los datos 9 y los datos 10.

Ejemplo de definición de variables:

datos 1 DB 20H; variable de 1 byte

DATA2 DW 0204H, 1000h variable de 2 bytes

DATA3 DB (-1*3), (15/3); variable de 1 byte

datos 4 DD 123456h; variable de 4 bytes

Datos 5 DB ' 0123 ' ;Variable de cadena, equivalente a una matriz de caracteres.

Datos 6 DW 'AB', 'C', 'D'; variable de cadena, equivalente a una matriz de cadenas

Datos 7 DB? ;Variable de 1 byte, no inicializada

DATA8 DD? ; variable de 4 bytes, no inicializada

datos 9 DB 5 DUP(0); variable de 1 byte, inicializada con 50, equivalente a una matriz de 5 elementos DB.

Datos 10 DW 3 DUP(?); una variable de 2 bytes no inicializada equivale a una matriz que contiene 3 elementos DW.

La función de la pseudoinstrucción en la declaración de definición de variable es almacenar el valor de la expresión en el área de memoria a partir de la dirección correspondiente al nombre de la variable y el número de bytes de memoria ocupados por cada valor. en la expresión corresponde al tipo de la variable;

Resumen: el nombre de la variable de una variable en realidad representa la dirección efectiva (dirección de desplazamiento) del área de memoria correspondiente a la variable en el segmento de memoria a; la dirección alta indica que el valor de la dirección es relativamente grande, y la dirección baja indica que el valor de la dirección es relativamente pequeño, y la dirección alta y la dirección baja son relativas;

5. /p>

(1). Introducción a los atributos

Las variables tienen los siguientes atributos:

Dirección del segmento (seg): la dirección del segmento donde se encuentra la variable.

B. Dirección de desplazamiento: La dirección de desplazamiento del segmento donde se encuentra la variable.

C. Tipo: El tipo de la variable define el número de bytes de memoria que ocupa cada una; variable El número de bytes de memoria ocupados por las variables definidas por DB, DW, DD, DQ y DT son 1, 2, 4, 8 y 10 respectivamente, generalmente DB Las variables definidas por los tipos, DW y DD son BYTE, WORD y DWORD respectivamente.

Lista de valores de tipo de identificadores públicos:

Tipo de identificador byte variable palabra variable doble palabra variable cerca de la etiqueta cerca de la etiqueta lejana

El valor de TYPE es 1 ^2 ^4-1-2.

D LONGITUD: El número de variables definidas por un nombre de variable al definir una variable cuando se utiliza el operador DUP para definir una variable, el número de variables definidas por el nombre de variable es el número de repeticiones en la formato de definición; en otras variables En la definición, el número de variables definidas por cada nombre de variable es 1;

E.SIZE: el número total de bytes asignados a todas las variables con el mismo nombre de variable en la variable declaración de definición, y su valor es el resultado de tipo y longitud de la variable;

Entre ellos, la dirección de segmento, la dirección de desplazamiento y el atributo de tipo son los atributos principales de la variable, y los atributos de longitud y tamaño son los atributos auxiliares de la variable;

(2). Operador de atributo:

Significado de la expresión del operador

SEG El nombre o etiqueta de la variable SEG extrae la dirección del segmento de el segmento donde se encuentra el nombre o etiqueta de la variable.

La etiqueta o el nombre de la variable de compensación recupera la dirección de compensación del segmento donde se encuentra el nombre o la etiqueta de la variable.

Escribir nombre de variable o etiqueta recupera el tipo de nombre o etiqueta de variable (el número de bytes ocupados por la variable).

El nombre de la variable de longitud elimina la longitud de la variable.

TAMAÑO El nombre de la variable TAMAÑO obtiene el tamaño de la variable.

Estos operadores no pueden formar declaraciones por sí solos, solo pueden usarse como parte de una expresión. La evaluación de la expresión también se completa durante el proceso de ensamblaje.

6. operador PTR

Formato: expresión de dirección PTR del tipo de datos

El "tipo de datos" en el formato puede ser BYTE, WORD, DWORD, NEAR y FAR. de variables, y los últimos tres son los tipos de variables. Ambos son tipos de etiquetas; las expresiones en el formato pueden ser expresiones de dirección como variables y etiquetas;

La función del operador PTR es redefinir. el tipo de variable o etiqueta definida, y su alcance está solo dentro de la declaración actual, por ejemplo:

Datos 1 DW 02H

Datos de puntero de byte MOV 1, AL

p>

En esta instrucción, convierte el tipo de DATOS1 en byte, luego almacena el contenido de AL en el byte más bajo de DATOS1, el rango está dentro de esta declaración MOV únicamente. Después de esta declaración, DATA1 sigue siendo de tipo DW, es decir, el tipo original de DATA1 no ha sido modificado;