Contactos

Programación: lenguaje del ensamblador. Los fundamentos del lenguaje del ensamblador. Formato de datos y estructura de equipo ensamblador de lenguaje ensamblador

En el destino, puede seleccionar comandos (entre paréntesis son ejemplos de códigos Mnemotécnicos de operaciones de IBM PC Tipo Tipo de PC Operaciones de ensamblador):

l Realización de operaciones aritméticas (ADD y ADC - Adición y adiciones con transferencia, Sub y SBB - Resta y resta con préstamo, Mul e IMUL - Multiplicación sin signos y con signo, DIV e IDIV - División sin signo y con signo, CMP - Comparaciones etc.);

l Realización de operaciones lógicas (o, y, no, XOR, prueba, etc.);

l ENVÍO (MOV - Para enviar, XCHG - Intercambio, en entrar en el microprocesador, salida del microprocesador, etc.);

l Transmisión de control (ramas del programa: JMP - Transición incondicional, procedimiento de llamada, devolución de Ret, J * - Transición condicional, control de ciclo de bucle, etc.);

l Línea de caracteres de procesamiento (Movs - Envío, CMPS - Comparación, LODS - Descargas, SCA - Escaneo. Estos comandos se usan generalmente con el representante del prefijo (modificador de repetición);

l interrupciones del programa (interrupciones INT - programa, en - interrupción condicional al desbordamiento, IRT - Regreso de la interrupción);

l Control del microprocesador (ST * y CL * - Instalación y restablecimiento de banderas, HLT - Detener, Esperar - Expectativas, NOP - ROGING, etc.).

Con una lista completa de los comandos de ensamblador, puede familiarizarse en las obras.

Comandos de transferencia de datos

l MOV DST, SRC - Envío de datos (Mover - Enviar desde SRC a DST).

Envíos: un byte (si SRC y DST tienen un formato de byte) o una palabra (si SRC y DST tienen un formato de Word) entre registro o entre registro y memoria, y también registra el valor directo al registro o en la memoria.

Los operandos DST y SRC deben tener el mismo formato: bytes o palabra.

SRC puede ser Tipo: R (Registrarse) - Registrarse, M (Memoria) - Memoria, I (Impedancia) - Valor directo. DST puede ser tipo R, m. Es imposible usar los operandos en un comando: RSGM junto con I; Dos operandos tipo M y dos operandos tipo RSGM). Operando puedo ser una expresión simple:

hacha MOV, (152 + 101B) / 15

El cálculo de la expresión se realiza solo cuando se emite. Las banderas no cambian.

l Push SRC - Pila de revestimiento de la palabra (PUSH - apretado Registro en la pila de İSRC). Coloca los contenidos de SRC en la parte superior de la pila: cualquier registro de 16 bits (incluido el segmento) o dos celdas de memoria que contienen una palabra de 16 bits. Las banderas no cambian;

l Pop DST - Extraer palabras de la pila (POP - Empuje hacia afuera; Cuente de la pila en DST). Elimina la palabra de la parte superior de la pila y lo coloca en DST: cualquier registro de 16 bits (incluido el segmento) o en dos celdas de memoria. Las banderas no cambian.

Tema 1.4 Ensambler Mnemonic. Estructura y formatos de comandos. Tipos de direccionamiento. Sistema de equipo de microprocesador

Plan:

1 lenguaje del ensamblador. Conceptos básicos

2 Símbolos de los símbolos del lenguaje del ensamblador.

3 tipos de operadores de ensamblos

4 directivas de ensamblador

5 Sistema de Comando Procesador

1 J.ensamblador zyk. Conceptos básicos

Lenguaje del ensamblador - Esta es una presentación simbólica del lenguaje de la máquina. Todos los procesos en la máquina al nivel más bajo y de hardware son impulsados \u200b\u200búnicamente por los comandos (instrucciones) del lenguaje de la máquina. Está claro que, a pesar del nombre general, el lenguaje del ensamblador para cada tipo de computadora.

El programa del ensamblador es una combinación de bloques de memoria, llamados segmentos de memoria.El programa puede consistir en uno o más segmentos de bloques de este tipo. Cada segmento contiene un conjunto de sugerencias de idioma, cada una de las cuales ocupa una línea separada del código del programa.

Las ofertas del ensamblador son cuatro tipos:

1) comandos o instrucciones, Presentando análogos simbólicos de los comandos de la máquina. En el proceso de transmisión, las instrucciones del ensamblador se transforman en los comandos correspondientes del sistema de comandos del microprocesador;

2) macrocomands -decorada de cierta manera de las propuestas de texto del programa, reemplazadas durante la transmisión por otras propuestas;

3) directivasuna indicación del traductor del ensamblador para realizar ciertas acciones. Las directivas no tienen análogos en la representación de la máquina;

4) filas de comentario que contiene cualquier carácter, incluidas las letras del alfabeto ruso. Los comentarios son ignorados por el traductor.

­ Estructura del programa en el ensamblador. Sintaxis del ensamblador.

Las propuestas que conforman el programa pueden ser un diseño sintáctico, un equipo correspondiente, macrokomand, directiva o un comentario. Para que el traductor del ensamblador los reconozca, deben estar formados por ciertas reglas sintácticas. Para hacer esto, es mejor usar una descripción formal de la sintaxis del idioma como las reglas de la gramática. Las formas más comunes de tal descripción del lenguaje de programación. - Gráficos sintácticos y formas extendidas de Bakusa Naura. Para uso práctico más conveniente. gráficos sintácticos.Por ejemplo, la sintaxis de sugerencias de ensamblador se puede describir utilizando diagramas sintácticos que se muestran en las siguientes Figuras 10, 11, 12.

Figura 10 - Formato de oferta del ensamblador


­ Figura 11 - Directivas de formato

­ Figura 12 - Formato de equipo y macros.

En estos dibujos:

­ etiquetas de nombres - el identificador, cuyo valor es la dirección del primer byte de esa propuesta del texto de origen del programa, que denota;

­ nombre - El identificador que distingue la presente Directiva de otras directivas de los mismos nombres. Como resultado del ensamblador de procesamiento, se puede asignar una directiva específica a ciertas características;

­ código de Operación (CPA) y Directiva - Estas son las designaciones mnemónicas del equipo de máquinas relevantes, las macros o las directivas del traductor;

­ operandos - Partes del equipo, Macro Comandantes o Directivas de ensamblador que denotan objetos sobre los cuales se realizan acciones. Los operandos del ensamblador se describen mediante expresiones con constantes numéricos y de texto, marcas e identificadores de variables utilizando operaciones y algunas palabras reservadas.

Los diagramas sintácticos ayudan encuentre y luego pase por el camino desde el inicio de sesión de la tabla (izquierda) a su salida (derecha). Si existe este camino, la propuesta o el diseño es sintácticamente correcta. Si no hay tal camino, significa que el compilador no aceptará este diseño.

­ 2 símbolos de lenguaje del ensamblador

Símbolos permisibles al escribir textos de texto son:

1) todas las letras latinas: ARIZONA., ARIZONA.. En este caso, las letras mayúsculas y minúsculas se consideran equivalentes;

2) números de 0 antes de 9 ;

3) señales ? , @ , $ , _ , & ;

4) divisores , . () < > { } + / * % ! " " ? = # ^ .

Las ofertas de ensamblos están formadas a partir de lexemaRepresentando las secuencias sintácticamente inseparables de los símbolos permisibles del lenguaje que tienen sentido para el traductor.

Lexemes están:

1) identificadores - Secuencias de caracteres permisibles utilizados para designar objetos de objetos, como códigos de operación, nombres de variables y nombre de etiqueta. La regla de grabación del identificador es la siguiente: el identificador puede consistir en uno o más caracteres;

2) cadenas de símbolos - secuencias de símbolos encerrados en comillas simples o dobles;

3) BULWA entera de uno de los siguientes sistemas de recargo : binario, decimal, hexadecimal. La identificación de números al registrarlos en los programas del ensamblador se realiza de acuerdo con ciertas reglas:

4) Los números decimales no requieren caracteres adicionales para identificar caracteres adicionales, por ejemplo, 25 o 139. Para identificar en el texto de origen del programa numeros binarios Es necesario después de grabar ceros y unidades incluidas en su composición, ponga latín " b.", Por ejemplo 10010101 b..

5) los números hexadecimales tienen más convenciones en su registro:

Primero, consisten en números. 0...9 , minúsculas y letras mayúsculas del alfabeto latino. uNA., B., c., D., MI., F. o UNA., B., C., D., MI., F..

En segundo lugar, el traductor puede tener dificultades con el reconocimiento de los números hexadecimales debido al hecho de que pueden consistir en algunos números 0 ... 9 (por ejemplo, 190845), así que comienza con la letra del alfabeto latino (por ejemplo, eF15). Para "explicar" el traductor que este lexema no es un número o un identificador decimal, el programador debe asignar especialmente un número hexadecimal. Para hacer esto, al final de la secuencia de números hexadecimales, que conforman un número hexadecimal, escribe la letra latina " h.". Este es un requisito previo. Si el número hexadecimal comienza con la letra, el cero líder se registra ante él: 0 eF15 h.

Casi todas las propuestas contienen una descripción del objeto sobre el cual o con el que se realiza cierta acción. Estos objetos se llaman operanda. Pueden ser identificados así: operandos. Estos son objetos (algunos valores, registros o células de memoria) a las que operan instrucciones o directivas, o estos objetos que definen o especifican el funcionamiento de las instrucciones o las directivas.

Es posible realizar la siguiente clasificación de los operandos:

­ operandos constantes o directos;

­ operandos de dirección;

­ operandos transferidos;

medidor de dirección;

­ registrarse operando;

­ operandos básicos e índice;

­ operandos estructurales;

Entradas.

Los operandos son componentes elementales a partir de los cuales se forma parte del comando de la máquina, denotando objetos sobre los cuales se realiza la operación. En un caso más general, los operandos pueden incluir como parte de la educación más compleja, llamada expresiones.

Expresiones hay combinaciones de operandos y operadores considerados en su conjunto. El resultado del cálculo de la expresión puede ser la dirección de una cifra de memoria determinada o algún valor constante (absoluto).

­ 3 tipos de operadores de ensamblos

Listamos los tipos posibles. operadores de ensambladores y reglas sintácticas para la formación de expresiones de ensamblador:

­ operadores aritméticos;

­ operadores de turnos;

­ operadores de comparación;

­ operadores logicos;

­ operador de índice;

­ tipo de operador de redefinición;

­ redefinición del operador del segmento;

­ nombramiento de operador tipo de estructura;

­ operador de obtención del componente del segmento de la dirección de la expresión;

­ operador para obtener un desplazamiento de expresión.

1 Directivas del ensamblador

­ Las directivas del ensamblador son:

1) Directivas de segmentación. Durante la discusión anterior, encontramos todas las reglas básicas para registrar equipos y operandos en el programa del ensamblador. La pregunta siguió siendo la cuestión de cómo crear una secuencia de comandos correctamente, de modo que el traductor pueda procesarlos, y el microprocesador es ejecutar.

Al considerar la arquitectura del microprocesador, aprendimos que tiene seis registros de segmentos, a través de los cuales puede funcionar simultáneamente:

­ con un segmento de código;

­ con un segmento de pila;

­ con un segmento de datos;

­ con tres segmentos de datos adicionales.

Un segmento físico es un área de memoria, ocupada por comandos y (o) datos, cuyas direcciones se calculan en relación con el valor en el registro correspondiente del segmento. La descripción sintáctica del segmento en el ensamblador es un diseño que se muestra en la Figura 13:


­ Figura 13 - Sintaxis Descripción del segmento en el ensamblador

Es importante tener en cuenta que el propósito funcional del segmento es algo más ancho que la simple rotura del programa en bloques de código, datos y pila. La segmentación es parte de un mecanismo más general asociado con concepto de programación modular. Implica la unificación del diseño de los módulos de objetos creados por el compilador, incluso de diferentes lenguajes de programación. Esto le permite combinar programas escritos en diferentes idiomas. Se destina a la implementación de diversas opciones para dicha asociación y operandos en la Directiva del segmento.

2) Listado de directivas de gestión. Las directivas de administración de la lista se dividen en los siguientes grupos:

­ directivas de gestión de listado general;

­ directivas de salida en la lista de archivos incluidos;

­ directivas de bloqueo de montaje condicional;

­ directivas de salida en el listado de Macrocomand;

­ información de listado sobre la lista de referencias cruzadas;

­ listado de directivas de cambio de formato.

2 Sistema de comandos del procesador

El sistema de comandos del procesador se presenta en la Figura 14.

Considere los principales grupos de equipos.

­ Figura 14 - Clasificación de los comandos del ensamblador

Los equipos son:

1 Comandos de transferencia de datos. Estos comandos ocupan un lugar muy importante en el sistema de los comandos de cualquier procesador. Realizan las siguientes funciones principales:

­ ahorrar en memoria del contenido de los registros de procesadores internos;

­ copiar contenido de un área de memoria a otra;

­ escribiendo a dispositivos de E / S y lea de dispositivos de E / S.

En algunos procesadores, todas estas funciones son realizadas por un solo equipo.Mov. (para envíos de bytes -Movb. ) pero con varios métodos para abordar los operandos.

En otros procesadores, además del equipo.Mov. Hay varios comandos más para realizar funciones enumeradas. Además, los comandos de transferencia de datos incluyen comandos de intercambio de información (su designación se basa en una palabraIntercambio ). Puede haber un intercambio de información entre los registros internos, entre dos medias de un registro (Intercambio ) o entre el registro y la celda de memoria.

2 equipos aritméticos. Los equipos aritméticos consideran los códigos de operandos como códigos binarios numéricos o binarios decimales. Estos comandos se pueden dividir en cinco grupos principales:

­ semicolonos fijos (adición, resta, multiplicación, división);

­ seméjuelos flotantes (adición, resta, multiplicación, división);

­ comandos de limpieza;

­ comandos de incremento y decremento;

­ comparar comando.

3 Los comandos de operación de semicolones fijos funcionan con códigos en registros de procesadores o en la memoria como códigos binarios convencionales. Comunicaciones de operaciones de comunión flotante (punto) Utilice el formato de representación de números con Orden y Mantissa (generalmente estos números ocupan dos celdas de memoria consecutivas). En los potentes procesadores modernos, un conjunto de semiconos semiconos flotantes no se limita a cuatro aritmos, y contiene muchos otros comandos más complejos, por ejemplo, el cálculo de las funciones trigonométricas, las funciones logarítmicas, así como las funciones complejas necesarias al procesar sonido e imágenes.

4 Los comandos de limpieza están diseñados para escribir un código cero en un registro o una celda de memoria. Estos comandos pueden reemplazarse por comandos de envío de código cero, pero los comandos de limpieza especiales suelen ser más rápidos que los comandos de envío.

5 equipos de incremento (aumento por unidad) y decremento

(Reducir por unidad) también son muy cómodos. En principio, pueden estar en principio para reemplazar los comandos de suma con una unidad o resta de una unidad, pero el incremento y la disminución son más rápidos que la suma y la resta. Estos comandos requieren un operando de entrada, que es tanto el operando de salida.

6 El comando de comparación está diseñado para comparar dos operandos de entrada. En esencia, calcula la diferencia de estos dos operandos, pero el operando de salida no se forma, sino que solo cambia los bits en el registro del estado del procesador de acuerdo con el resultado de esta resta. El siguiente comando al comando de comparación (generalmente este es un comando de transición) analizará los bits en el registro de estado del procesador y realizará acciones dependiendo de sus valores. Algunos procesadores proporcionan comandos de comparación de la cadena de dos secuencias de operandos en la memoria.

7 comandos lógicos. Los comandos lógicos se realizan en las operaciones lógicas de operandas (bitwise), es decir, consideran que los códigos de operandos no son como un solo número, sino como un conjunto de bits individuales. Difieren de los equipos aritméticos. Los comandos lógicos realizan las siguientes operaciones básicas:

­ lógico y lógico o, adición del módulo 2 (excluyendo o);

­ cambios lógicos, aritméticos y cíclicos;

­ revisar bits y operandos;

­ instalación y limpieza de bits (banderas) de un registro de estado de procesador (PSW).

Los comandos de la operación lógica le permiten calcular bridly las funciones de lógica básicas de dos operandos de entrada. Además, la operación y se utiliza para la limpieza forzada de los bits especificados (como uno de los operandos, se usa el código de máscara, en el que las descargas que requieren la limpieza se establecen en cero). Operación o aplicada a la instalación forzada de bits especificados (como uno de los operandos, se usa el código de máscara en el que las descargas que requieren la instalación por unidad son iguales a una). Operación "ExcelleGing o" se usa para invertir los bits especificados (como uno de los operandos, se usa el código de máscara, en el que los bits que están sujetos a inversiones se establecen por unidad). Los comandos requieren dos operandos de entrada y forme un operando de salida.

8 Los comandos de turnos le permiten combinar el código del operando a la derecha (hacia las descargas más jóvenes) o hacia la izquierda (en la dirección de las descargas superiores). El tipo de cambio (lógico, aritmético o cíclico) determina que será el nuevo valor de la broca más antigua (cuando el cambio a la derecha) o el bit más joven (durante el turno a la izquierda), y también determina si el valor más antiguo de El bit más antiguo (cuando el cambio hacia la izquierda) se guarda en algún lugar o un bit más joven (cuando se cambia a la derecha). Los turnos cíclicos le permiten mover los bits del código del operando en un círculo (en el sentido de las agujas del reloj cuando el turno es correcto o hacia la izquierda, cuando salga el turno). Al mismo tiempo, el anillo de cambios puede ingresar o no ingresar al indicador de transferencia. En la broca de la bandera de transmisión (si se usa), el valor del bit más viejo se registra durante el cambio cíclico a la izquierda y el bit más joven durante el cambio cíclico a la derecha. Por consiguiente, el valor de la broca de la bandera de transferencia corresponderá a la descarga más baja durante el cambio cíclico a la izquierda y en la descarga superior durante el cambio cíclico a la derecha.

9 comandos de transiciones. Los equipos de Comblaus están diseñados para organizar todo tipo de ciclos, ramas, llamadas a las subrutinas, etc., es decir, violan el progreso de la serie. Estos comandos se registran en el comando Registre un nuevo significado y, por lo tanto, llame a la transición del procesador, no al siguiente comando, sino a cualquier otro comando en la memoria de los programas. Algunos comandos de las transiciones proporcionan más regreso al punto desde el cual se realizó la transición, otros no proporcionan esto. Si se proporciona el reembolso, entonces los parámetros de procesador actuales se almacenan en la pila. Si no se proporciona el reembolso, entonces los parámetros de procesador actuales no se guardan.

Comparar comandos sin reembolso se dividen en dos grupos:

­ transiciones incondicionales;

­ equipos de cruce comunes.

En las designaciones de estos comandos se usan palabras.Rama (ramificación) y saltar (saltar).

Los comandos de transiciones incondicionales causan la transición a una nueva dirección, independientemente de cualquier cosa. Pueden llamar a la transición al valor de desplazamiento especificado (hacia adelante o hacia atrás) o a la dirección de memoria especificada. El valor de desplazamiento o el nuevo valor de dirección se indica como un operando de entrada.

Comandos de transición condicionales Causa La transición no siempre es, sino solo cuando realiza las condiciones especificadas. Como tales condiciones, los valores de bandera en el registro del Estado del procesador generalmente están actuando.PSW. ). Es decir, la condición de transición es el resultado de la operación anterior que cambia los valores de las banderas. Las condiciones totales de transición pueden ser de 4 a 16. Varios ejemplos de equipos de transición condicionales:

­ transición, si cero;

­ transición, si no cero;

­ transición si hay un desbordamiento;

­ transición si no hay desbordamiento;

­ transición si es más cero;

­ transición, si es menor o igual a cero.

Si se ejecuta la condición de transición, se descarga en el nuevo Registro de comandos de valor. Si no se ejecuta la condición de transición, el medidor de comandos simplemente está aumentando, y el procesador selecciona y realiza el siguiente comando en orden.

Especialmente para verificar las condiciones de transición, se aplica el comando de comparación (SMR) que precede al comando de transición condicional (o incluso varios equipos de transición convencionales). Pero las banderas se pueden instalar y cualquier otro comando, como un comando de transferencia de datos, cualquier comando aritmético o lógico. Cabe señalar que los comandos de transición de la bandera a sí mismos no cambian de que hace posible colocar varios comandos de transición uno tras otro.

Un lugar especial entre los equipos de transición está ocupado por comandos de interrupción. Estos comandos como operando de entrada requieren un número de interrupción (dirección vectorial).

Producción:

El lenguaje del ensamblador es una presentación simbólica del lenguaje de la máquina. Idioma del ensamblador para cada tipo de computadora. El programa del ensamblador es un conjunto de bloques de memoria llamados segmentos de memoria. Cada segmento contiene un conjunto de sugerencias de idioma, cada una de las cuales ocupa una línea separada del código del programa. Las sugerencias del ensamblador son cuatro tipos: equipos o instrucciones, macros, directivas, líneas de comentarios.

Todas las letras latinas están permitidas al escribir el texto de los programas: ARIZONA., ARIZONA.. En este caso, las letras mayúsculas y minúsculas se consideran equivalentes; Figuras ot 0 antes de 9 ; señales ? , @ , $ , _ , & ; divisores , . () < > { } + / * % ! " " ? = # ^ .

Se utilizan los siguientes tipos de operadores de ensambladores y reglas sintácticas para la formación de expresiones de ensamblador. Operadores aritméticos, declaraciones de cambio, operadores de comparación, operadores lógicos, operador de índice, operador de redefinición tipo, operador de redefinición de segmento, operador de nombres de tipo de estructura, operador de obtención de un componente de segmento de una dirección de expresión, un operador de desplazamiento de expresión.

El sistema de comando se divide en 8 grupos principales.

­ Preguntas de control:

1 ¿Qué es un lenguaje de ensamblador?

2 ¿Qué caracteres se pueden usar para grabar comandos en el ensamblador?

3 ¿Cuáles son las etiquetas y su cita?

4 Calcule la estructura de los comandos del ensamblador.

5 Lista 4 tipos de sugerencias de ensamblos.

Universidad Nacional de Uzbekistán nombrada después de Mirzo Ulugbek

Facultad de la tecnología informática.

Sobre el tema: Análisis semántico del archivo EXE.

Realizado:

Tashkent 2003.

Prefacio.

Idioma del ensamblador y estructura del equipo.

Estructura exe -file (análisis semántico).

La estructura del archivo COM.

El principio de acción y propagación del virus.

Desmontaje.

Programas.

Prefacio

La profesión del programador es increíble y única. Hoy en día, la ciencia y la vida no pueden presentarse sin la tecnología más nueva. Todo lo que está asociado con la actividad humana no lo hace sin tecnología de computación. Y esto contribuye a su alto desarrollo y perfección. Deje que el desarrollo de computadoras personales comience hace tanto tiempo, pero durante este tiempo hubo pasos colosales en los productos de software y durante mucho tiempo estos productos serán ampliamente utilizados. El área asociada con el conocimiento de las computadoras ha sufrido una explosión, así como la tecnología correspondiente. Si no toma una fiesta comercial en consideración, entonces podemos decir que no hay actividades profesionales en esta área de actividad profesional. Muchos están desarrollando programas no por el bien de los beneficios o las ganancias, pero según su propia voluntad, por pasión. Por supuesto, esto no debería afectar la calidad del programa, y \u200b\u200ben este asunto, por lo tanto, hablar "negocio", existe una competencia y demanda de la calidad de ejecución, en el trabajo estable y cumple con todos los requisitos de la modernidad. Aquí también vale la pena señalar la apariencia de los microprocesadores en los años 60, que vinieron a reemplazar la gran cantidad de lámparas. Hay algunas variedades de microprocesadores que son muy diferentes entre sí. Estos microprocesadores son diferentes entre sí de la descarga y los equipos de sistema incorporados. Los más comunes, tales como: Intel, IBM, Celeron, AMD, etc. Todos estos procesadores están relacionados con la arquitectura desarrollada de los procesadores Intel. La propagación de los microcomputadores fue la razón para revisar la actitud hacia el lenguaje del ensamblador por dos razones principales. Primero, los programas escritos en el lenguaje del ensamblaje requieren un tiempo de recuerdo y ejecución significativamente menos. En segundo lugar, el conocimiento del lenguaje del ensamblador y el código de máquina resultante brinda una comprensión de la arquitectura de la máquina, que es poco probable que se proporcione al trabajar en un lenguaje de alto nivel. Aunque la mayoría de los especialistas en software se están desarrollando en idiomas de alto nivel, como Pascal, C o Delphi, lo que es más fácil al escribir programas, el software más potente y eficiente está completamente escrito o parcialmente escrito en el lenguaje del ensamblador. Los idiomas de alto nivel fueron diseñados para evitar características técnicas especiales de computadoras específicas. Y el lenguaje del ensamblador, a su vez, está diseñado para específicos específicos de procesadores. En consecuencia, para escribir un programa en el lenguaje del ensamblaje para una computadora en particular, debe conocer su arquitectura. En la actualidad, el tipo de software principal es el archivo EXE. Dados los aspectos positivos de esto, el autor del programa puede confiar en su integridad. Pero a menudo a veces no es así. También hay un desmontaje. Con la ayuda de un desasmador, puede aprender interrupciones y códigos de programas. Una persona que desmontada en el ensamblador no será difícil rehacer el programa completo a su gusto. Tal vez, por ahí el problema más no resuelto, el virus. ¿Por qué la gente escribe un virus? Algunos hacen esta pregunta con sorpresa, algunas con las personas conojadas, pero sin embargo, las personas continúan existiendo, que están interesadas en esta tarea, no desde el punto de vista de causar cierto daño, sino como interés para la programación sistémica. Recoge la escritura por varias razones. Uno como los desafíos del sistema, otros mejoran su conocimiento en el ensamblador. Intentaré salir todo esto en el trabajo de mi curso. También dijo que no solo acerca de la estructura del archivo EXE, sino también sobre el lenguaje del ensamblador.

^ Idioma del ensamblador.

Es interesante rastrear, a partir del momento de la aparición de las primeras computadoras y finalizar con el día de hoy, para la transformación de las ideas sobre el lenguaje del ensamblador de los programadores.

Una vez que el ensamblador fue lengua, sin conocimiento de lo que era imposible hacer una computadora para hacer algo útil. Gradualmente, la situación cambió. Apareció más medios para comunicarse con una computadora. Pero, a diferencia de otros idiomas, el ensamblador no murió, por lo que no podía hacerlo en principio. ¿Por qué? En busca de la respuesta, trataremos de entender qué tipo de lenguaje del ensamblador es en general.

Si es brevemente, el lenguaje del ensamblador es una presentación simbólica del lenguaje de la máquina. Todos los procesos en la máquina al nivel más bajo y de hardware son impulsados \u200b\u200búnicamente por los comandos (instrucciones) del lenguaje de la máquina. Está claro que, a pesar del nombre general, el lenguaje del ensamblador para cada tipo de computadora. Esto se aplica a la aparición de programas escritos en el ensamblador, e ideas, la reflexión de la cual es este idioma.

Para resolver verdaderamente los problemas asociados con el equipo (o incluso, además, dependiendo del equipo, como, por ejemplo, mejorando la velocidad del programa), es imposible sin el conocimiento del ensamblador.

Un programador o cualquier otro usuario puede usar cualquier herramienta de alto nivel, hasta los programas para construir mundos virtuales y, quizás, ni siquiera sospeche que la computadora realmente no realice los comandos de idioma en los que se escribe su programa y su presentación transformada En forma de secuencias de comunicación aburridas y tristes de un lenguaje completamente diferente: la máquina. Y ahora imaginaremos que un usuario de este tipo tiene un problema no estándar o simplemente no sostenía algo. Por ejemplo, su programa debe trabajar con algún dispositivo inusual o realizar otras acciones que requieren conocimiento de los principios de los equipos informáticos. No importa cuán inteligente sea un programador, sin importar la buena lengua en la que escribió su maravilloso programa, sin conocer el ensamblador, no pudo hacerlo. Y no es casual que casi todos los compiladores de idiomas de alto nivel contienen los medios de comunicación de sus módulos con módulos en el ensamblador o admiten el acceso al nivel de programación del ensamblador.

Por supuesto, la época de la computadora universal ya ha pasado. Como dicen, es imposible discutir lo inmenso. Pero hay algo en común, un tipo de fundamento en el que se está construyendo cualquier educación informática grave. Este conocimiento de los principios de la computadora, su arquitectura y el lenguaje del ensamblador como reflexión y encarnación de estos conocimientos.

Una computadora típica moderna (basada en I486 o Pentium) consiste en los siguientes componentes (Fig. 1).

Higo. 1. Computadora y dispositivos periféricos.

Higo. 2. Esquema estructural de una computadora personal.

De la figura (Fig. 1) se puede ver que la computadora está formada por varios dispositivos físicos, cada uno de los cuales está conectado a un bloque llamado el sistema. Si discute lógicamente, está claro que desempeña el papel de un determinado dispositivo de coordinación. Veamos dentro de la unidad del sistema (no necesita intentar penetrar dentro del monitor: no hay nada interesante, además de que es peligroso): abra la caja y vea algunas tablas, bloques, conectando cables. Para entender su propósito funcional, veamos el esquema estructural de una computadora típica (Fig. 2). No afirma la precisión incondicional y está destinada a mostrar el propósito, la relación y la composición típica de los elementos de la computadora personal moderna.

Vamos a discutir el esquema en la FIG. 2 en varios estilo no convencional.
Es típico, reunirse con algo nuevo, busque algunas asociaciones que puedan ayudarlo a saber lo desconocido. ¿Qué asociaciones es una computadora? Por ejemplo, tengo, la computadora a menudo se asocia con la persona misma. ¿Por qué?

Hombre creando una computadora en algún lugar en las profundidades de sí misma pensó que él crearía algo como él. La computadora tiene la percepción de la información del mundo exterior: es un teclado, un mouse, dispositivos de almacenamiento en discos magnéticos. En la Fig. 2 Estos órganos se encuentran a la derecha de los neumáticos del sistema. La computadora tiene los órganos "digestivos", la información recibida es un procesador central y RAM. Y, finalmente, la computadora tiene órganos de habla que destacan los resultados del procesamiento. Estos son también algunos de los dispositivos a la derecha.

Computadoras modernas, por supuesto, lejos de una persona. Pueden compararse con las criaturas que interactúan con el mundo exterior a nivel de un conjunto grande, pero limitado de reflejos incondicionales.
Este conjunto de reflejos forma un sistema de comandos de máquinas. En cualquier alto nivel, no se comunique con la computadora, en última instancia, todo se reduce a la secuencia aburrida y monótona de los comandos de la máquina.
Cada equipo de máquina es un tipo de irritante para excitar uno u otro reflejo incondicional. La reacción a este estímulo es siempre inequívoca y "cosida" en el bloque de microcomáticos en forma de firmware. Este firmware implementa acciones para implementar el comando de la máquina, pero ya en el nivel de señal enviado a ciertos circuitos lógicos de la computadora, conduciendo así varios subsistemas informáticos. Este es el llamado principio de gestión de firmware.

Continuando con la analogía con una persona, notamos: Para que la computadora coma correctamente, se inventan muchos sistemas operativos, compiladores de cientos de lenguajes de programación, etc. Pero todos ellos son, de hecho, solo un plato, en qué comida (Programas) se entrega por reglas definitivas del estómago (computadora). Solo el estómago de la computadora ama la alimentación dietética y monótona, le da información estructurada, en forma de secuencias estrictamente organizadas de ceros y unidades cuyas combinaciones y conforman el lenguaje de la máquina.

Así, externamente, siendo un políglota, la computadora entiende solo un idioma: el idioma de los comandos de la máquina. Por supuesto, para comunicarse y trabajar con una computadora, no es necesario conocer este idioma, pero casi cualquier programador profesional tarde o temprano enfrenta la necesidad de estudiar. Afortunadamente, el programador no necesita intentar comprender el valor de varias combinaciones de números binarios, ya que en los años 50, los programadores comenzaron a utilizar el análogo simbólico del lenguaje de la máquina para la programación, que se llamaba el lenguaje del ensamblador. Este idioma refleja con precisión todas las características del lenguaje del motor. Es por eso que, en contraste con los idiomas de alto nivel, el lenguaje del ensamblador para cada tipo de computadora es suyo.

De todo lo anterior, podemos concluir que, dado que el lenguaje del ensamblador para la computadora "nativo", entonces el programa más efectivo solo se puede escribir en él (siempre que escriba un programador calificado). Hay una pequeña "pero": es muy laboriosa, que requiere mucha atención y experiencia práctica en el proceso. Por lo tanto, de hecho, el ensamblador está escrito en el programa principal que debe garantizar un trabajo eficiente con el hardware. A veces, el ensamblador está escrito por el tiempo de ejecución o memoria de gasto. Posteriormente, se elaboran en forma de subrutinas y se combinan con el código en el lenguaje de alto nivel.

Para estudiar el lenguaje del ensamblador de cualquier computadora tenga sentido comenzar solo después de descubrir qué parte de la computadora se deja visible y accesible para programar en este idioma. Este es el llamado modelo de software de computadora, parte del cual es un modelo de software de microprocesador que contiene 32 registros de una forma u otra disponible para su uso por el programador.

Estos registros se pueden dividir en dos grupos grandes:

^ 16 registros de usuarios;

16 Registros del sistema.

En los programas en el lenguaje del ensamblador, los registros se utilizan muy intensamente. La mayoría de los registros tienen un propósito funcional definitivo.

A medida que sigue el nombre, se llaman los registros de usuarios porque el programador puede usarlos al escribir sus programas. Estos registros incluyen (Fig. 3):

Ocho registros de 32 bits que pueden ser utilizados por programadores para almacenar datos y direcciones (también se llaman registros de propósito general (RON)):

seis registros de segmentos: CS, DS, SS, ES, FS, GS;

registros de estado y gestión:

Registro de banderas de Eflags / banderas;

Registro de puntero de puntero EIP / IP.

Higo. 3. Registros de usuarios de microprocesadores I486 y Pentium.

¿Por qué muchos de estos registros se muestran con una característica de separación inclinada? No, estos no son registros diferentes son partes de un registro grande de 32 bits. Se pueden utilizar en el programa como objetos individuales. Esto se hace para garantizar el rendimiento de los programas escritos para los modelos más jóvenes de 16 bits de microprocesadores Intel, comenzando con I8086. Los microprocesadores I486 y Pentium tienen principalmente registros de 32 bits. Su número, con la excepción de los registros de segmentos, los mismos que en I8086, pero la dimensión es más grande, que se refleja en sus designaciones, tienen
prefijo E (extendido).

^ Registros generales
Todos los registros de este grupo le permiten contactar a nuestras partes "más jóvenes" (ver Fig. 3). Teniendo en cuenta este dibujo, observe que es posible usar para autonedora solo las partes menores de 16 y 8 bits de estos registros. Los 16 bits anteriores de estos registros como objetos independientes no están disponibles. Esto se hace como señalamos anteriormente, para la compatibilidad con los modelos más jóvenes de 16 bits de microprocesadores Intel.

Enumeramos los registros pertenecientes al Grupo de Registros de Propósito General. Dado que estos registros están ubicados físicamente en un microprocesador dentro de un dispositivo aritmético y lógico (ALLU), también se les llama Registros por Allu:

eAX / AX / AH / AL (Registro de Acumulador) - Batería.
Se utiliza para almacenar datos intermedios. En algunos equipos, se requiere el uso de este registro;

eBX / BX / BH / BL (registro base) - Registro Básico.
Se utiliza para almacenar la dirección básica de algún objeto en la memoria;

eCX / CX / CH / CL (Conteo Register) es un medidor de registro.
Se utiliza en los comandos que producen algunas acciones repetibles. Su uso a menudo es implícitamente y oculto en el algoritmo del equipo relevante.
Por ejemplo, la organización del ciclo de bucle, además de transmitir la administración del comando, ubicada en alguna dirección, analiza y reduce el valor del registro ECX / CX;

eDX / DX / DH / DL (Registro de datos) - Registro de datos.
Al igual que el registro EAX / AX / AH / AL, almacena datos intermedios. En algunos equipos, su uso es obligatorio; Para algunos comandos, esto es implícitamente.

Los siguientes dos registros se utilizan para respaldar las llamadas operaciones de la cadena, es decir, las operaciones que producen el procesamiento secuencial de cadenas de los elementos, cada uno de los cuales puede tener una longitud de 32, 16 u 8 bits:

eSI / SI (Registro de índice de origen) - Índice de origen.
Este registro en las operaciones de la cadena contiene la dirección actual del elemento en la cadena de origen;

eDI / DI (Registro de índice de destino) - Índice del receptor (destinatario).
Este registro en las operaciones de la cadena contiene la dirección actual en la cadena del receptor.

En la arquitectura del microprocesador, dicha estructura de datos se admite en el nivel de software y hardware como la pila. Para trabajar con una pila en el sistema de comandos de microprocesador, hay comandos especiales, y en el modelo de software de microprocesador hay registros especiales:

eSP / SP (Registro de puntero de la pila) - Registro de puntero de la pila.
Contiene el vértice de pila en el segmento de pila actual.

eBP / BP (registro de puntero base) - Registro de puntero de la base del marco de la pila.
Diseñado para organizar el acceso arbitrario a los datos dentro de la pila.

La pila se llama el área del programa para el almacenamiento temporal de datos arbitrarios. Por supuesto, los datos también se pueden guardar en el segmento de datos, pero en este caso es necesario iniciar una celda de memoria con nombre separada durante este tiempo, lo que aumenta el tamaño del programa y el número de nombres utilizados. La conveniencia de la pila es que su área se usa repetidamente y ahorrándolos desde allí utilizando comandos eficientes de empuje y pop sin especificar ningún nombre.
La pila se usa tradicionalmente, por ejemplo, para guardar los contenidos de los registros utilizados por el programa, antes de llamar a la subrutina, que, a su vez, utilizará los registros del procesador "para sus propósitos personales". El contenido inicial de los registros se proyecta desde la pila después de regresar de la subrutina. Otra recepción común es la transferencia del subprograma de los parámetros requeridos por ella a través de la pila. La subrutina, sabiendo, en qué orden se coloca en la pila de parámetros, puede elegirlos desde allí y usarlo cuando lo realice. Una característica distintiva de la pila es el orden peculiar de la muestra de los datos contenidos en ella: solo el elemento superior está disponible en la pila en cualquier momento, es decir, El elemento cargado en la pila del último. La descarga desde la pila del elemento superior hace que el siguiente elemento esté disponible. Los elementos de la pila están ubicados en el área de memoria asignados debajo de la pila, a partir de la parte inferior de la pila (es decir, desde su dirección máxima) en las direcciones disminuyendo constantemente. La dirección del elemento superior, disponible se almacena en el registro indicador de pila SP. Al igual que cualquier otra área de la memoria del programa, la pila debe ingresar algún segmento o formar un segmento separado. En cualquier caso, la dirección del segmento de este segmento se coloca en el registro de segmentos de pila SS. Por lo tanto, un par de registros SS: SP Describa la dirección de una célula de pila asequible: la dirección del segmento de la pila se almacena en SS, y en SP: el desplazamiento de este último almacenado en la pila de esto (Fig. 4, A ). Tenga en cuenta que en el estado inicial, el puntero de la pila SP indica una celda debajo de la parte inferior de la pila y no se incluye en él.

Figura 4. Organización de pila: A - Estado inicial, B - Después de cargar un elemento (en este ejemplo, el contenido del Registro AH), IN - después de cargar el segundo elemento (el contenido del registro DS), G, después de la descarga Un elemento, D - después de descargar dos elementos y volver a su estado original.

Cargar la pila se realiza mediante un comando especial de trabajar con pila PULS (PUSH). Este comando primero reduce los contenidos del puntero de la pila a 2, y luego coloca el operando en la dirección en SP. Si, por ejemplo, queremos guardar temporalmente los contenidos del registro AH en la pila, debe ejecutar el comando

La pila va al estado que se muestra en la FIG. 1.10, b. Se puede ver que el puntero de la pila se desplaza a dos bytes hacia arriba (hacia las direcciones más pequeñas) y esta dirección registra el comando de empuje del operando. Siguiente comando de descarga en la pila, por ejemplo,

será la pila en el estado mostrada en la FIG. 1.10, c. La pila ahora almacenará dos elementos, y solo la parte superior será asequible, lo que indica el puntero de la pila SP. Si, después de algún tiempo, necesitábamos restaurar los contenidos originales guardados en la pila de registros, debemos ejecutar comandos de descarga de la pila POP (Push Out):

pop Ds.
hacha pop.

¿De qué tamaño debe ser la pila? Depende de la intensiva que se utilice en el programa. Si, por ejemplo, está previsto almacenar una matriz de 10,000 bytes en la pila, entonces la pila no debe ser inferior a este tamaño. Al mismo tiempo, debe tenerse en cuenta que, en algunos casos, la pila es utilizada automáticamente por el sistema, en particular, al ejecutar el comando INT 21H Interrupción. Según este comando, el procesador primero coloca la dirección de retorno en la pila, y luego DOS envía el mismo contenidos de registro y otra información relacionada con el programa interrumpido. Por lo tanto, incluso si el programa no usa la pila en absoluto, aún debería estar presente en el programa y no tener menos de varias decenas de palabras. En nuestro primer ejemplo, tomamos bajo la pila de 128 palabras, lo cual es definitivamente suficiente.

^ Estructura del programa en el ensamblador

El programa del ensamblador es un conjunto de bloques de memoria llamados segmentos de memoria. El programa puede consistir en uno o más segmentos de bloques de este tipo. Cada segmento contiene un conjunto de sugerencias de idioma, cada una de las cuales ocupa una línea separada del código del programa.

Las ofertas del ensamblador son cuatro tipos:

comandos o instrucciones que son análogos simbólicos de los comandos de la máquina. En el proceso de transmisión, las instrucciones del ensamblador se transforman en los comandos correspondientes del sistema de comandos del microprocesador;

macrocomands: la propuesta definitiva de las propuestas de texto del programa que se reemplazan durante la transmisión por otras propuestas;

directivas que son una indicación de un traductor de ensamblador para realizar ciertas acciones. Las directivas no tienen análogos en la representación de la máquina;

filas de comentarios que contienen cualquier carácter, incluidas las letras del alfabeto ruso. Los comentarios son ignorados por el traductor.

^ Sintaxis del ensamblador

Las propuestas que conforman el programa pueden ser un diseño sintáctico, un equipo correspondiente, macrokomand, directiva o un comentario. Para que el traductor del ensamblador los reconozca, deben estar formados por ciertas reglas sintácticas. Para hacer esto, es mejor usar una descripción formal de la sintaxis del idioma como las reglas de la gramática. Las formas más comunes de tal descripción del lenguaje de programación son gráficos sintácticos y formas extendidas de Bakusa Naur. Para uso práctico, los diagramas sintácticos son más convenientes. Por ejemplo, la sintaxis de sugerencias de ensamblador se puede describir utilizando diagramas sintácticos que se muestran en las siguientes figuras.

Higo. 5. Formato de oferta del ensamblador

Higo. 6. Directiva de formato

Higo. 7. Formato de comando y macros

En estos dibujos:

el nombre de la etiqueta es el identificador, cuyo valor es la dirección del primer byte de la propuesta del texto de origen del programa, que denota;

el nombre es un identificador que distingue esta directiva de otras directivas del mismo nombre. Como resultado del ensamblador de procesamiento, se puede asignar una directiva específica a ciertas características;

el Código de Operación (CPC) y la Directiva son las denominaciones mnemónicas del equipo de máquinas relevantes, las macros o las directivas de traductores;

operands: partes del equipo, comandantes macro o directivas de ensamblador que denotan objetos sobre los cuales se realizan acciones. Los operandos del ensamblador se describen mediante expresiones con constantes numéricos y de texto, marcas e identificadores de variables utilizando operaciones y algunas palabras reservadas.

^ ¿Cómo utilizar los gráficos sintácticos? Es muy simple: para esto, solo necesita encontrar y luego pasar por el camino desde el inicio de sesión de la tabla (izquierda) a su salida (derecha). Si existe este camino, la oferta o diseño es sintácticamente correcta. Si no hay tal camino, significa que el compilador no aceptará este diseño. Cuando se trabaja con las gráficas sintácticas, prestamos atención a la dirección del bypass, indicado por las flechas, ya que entre los caminos puede haber aquellos para los que puede ir a la derecha a la derecha. En esencia, las gráficas sintácticas reflejan la lógica del traductor cuando se aíslan las propuestas de entrada del programa.

Símbolos permisibles al escribir textos de texto son:

Todas las letras latinas: A-Z, A-Z. En este caso, las letras mayúsculas y minúsculas se consideran equivalentes;

Números de 0 a 9;

¿Señales?, @, $, _, &;

Divisores ,. ()< > { } + / * % ! " " ? \ = # ^.

Las sugerencias del ensamblador se forman a partir del Lexema, que son secuencias sintácticamente inseparables de símbolos permisibles del lenguaje que tienen sentido para el traductor.

Lexes son:

identificadores: secuencias de caracteres permisibles utilizados para referirse a tales objetos de objetos, tales como códigos de operación, nombres de variables y nombre de etiqueta. La regla de grabación del identificador es la siguiente: el identificador puede consistir en uno o más caracteres. Como caracteres, puede usar las letras del alfabeto latino, los números y algunas señales especiales: _,?, $, @. El identificador no puede iniciar el símbolo del dígito. La longitud del identificador puede ser de hasta 255 caracteres, aunque el traductor percibe solo los primeros 32, y el resto ignora. Puede ajustar la longitud de los posibles identificadores utilizando la opción de solicitud de sistema MV. Además, existe la oportunidad de especificar el traductor para distinguir entre las letras mayúsculas y minúsculas o ignoró su diferencia (que se realiza de forma predeterminada).

^ Comandos de ensamblador.

Los comandos del ensamblador revelan la capacidad de transferir sus requisitos a la computadora, el mecanismo de gestión en el programa (ciclos y transiciones) para comparaciones lógicas y organización de software. Sin embargo, las tareas programables rara vez son tan fáciles. La mayoría de los programas contienen una serie de ciclos en los que se repiten varios comandos hasta que se realicen cierto requisito para lograr, y se deben realizar diversos controles que determinan cuál de las varias acciones se debe realizar. Algunos comandos pueden transmitir el control cambiando la secuencia normal de pasos Modifique directamente el valor de offset en el puntero de comandos. Como se mencionó anteriormente, hay varios equipos para varios procesadores, consideraremos una serie de algunos comandos para los procesadores 80186, 80286 y 80386.

Para describir el estado de las banderas después de realizar algún equipo, usaremos la muestra de la tabla que refleja la estructura de la bandera de EFLAGS:

En la línea de fondo de esta tabla, los valores de las banderas se administran después de ejecutar el comando. Al mismo tiempo, se utiliza la siguiente notación:

1 - Después de ejecutar el comando, la bandera está configurada (igual a 1);

0 - Después de ejecutar el comando, la bandera se restablece (igual a 0);

r - El valor de la bandera depende del resultado del trabajo del equipo;

Después de ejecutar el comando, la bandera no está definida;

espacio - Después de ejecutar el comando, la bandera no cambia;

Para representar operandos en diagramas sintácticos, se utiliza la siguiente notación:

r8, R16, R32 - Operando en uno de los registros de tamaño byte, palabra o doble palabra;

m8, M16, M32, M48 - Operando en tamaño de bytes de memoria, palabra, palabra doble o 48 bits;

i8, I16, I32 - Tamaño de bytes de operandos directos, palabra o palabra doble;

a8, A16, A32 - Dirección relativa (offset) en el segmento de código.

EQUIPOS (orden alfabético):

* Estos comandos se describen en detalle.

Agregar.
(Adición)

Adición

^ Diagrama del equipo:

añadir el receptor, fuente

Propósito: Adición de dos operandos fuente y byte receptor, palabra o doble palabra.

Algoritmo de trabajo:

doblar la fuente de los operandos y el receptor;

registrar el resultado de agregar al receptor;

instalar banderas.

Estado de la bandera después de ejecutar el comando:

Solicitud:
El comando Agregar se usa para agregar dos operandos de enteros. El resultado de la adición se coloca a la dirección del primer operando. Si el resultado de la adición está sobre la frontera del receptor del operando (desbordamiento), considere esta situación al analizar la bandera del CF y la posterior aplicación posible del comando ADC. Por ejemplo, laica los valores en el registro AX y el área de memoria CH. Al agregar, debe considerar la posibilidad de desbordamiento.

Registrar más registro o memoria:

| 000000DW | MODREGR / RM |

Registrarse AX (AL) Plus Valor directo:

| 0000010W | --data-- | Datos, si w \u003d 1 |

Registro o Memoria Plus Valor directo:

| 100000sw | mod000r / m | --data-- | Datos, si BW \u003d 01 |

Llamada
(Llamada)

Procedimiento de llamada o tarea

^ Diagrama del equipo:

Propósito:

transferencia del control de un procedimiento cercano o a largo plazo con memorización en la pila de direcciones de punto de retorno;

tareas de conmutación.

Algoritmo de trabajo:
determinado por el tipo de operando:

Etiqueta Messenger: los contenidos del puntero de comandos EIP / IP se ingresan en la pila y el nuevo valor de dirección se carga en el mismo registro, la dirección correspondiente a la etiqueta;

Etiqueta de la etiqueta: los contenidos del puntero de comandos EIP / IP y CS se ingresan en la pila. Luego, los mismos registros están cargados con nuevos valores de direcciones correspondientes a la etiqueta larga;

R16, 32 o M16, 32: determine el registro o la celda de memoria que contiene compensaciones en el segmento de comando actual donde se transmite el control. Al controlar el control, se ingresa los contenidos del puntero de comandos EIP / IP;

Puntero de memoria: define una celda de memoria que contiene un puntero de 4 o 6 bytes al procedimiento llamado. La estructura de tal puntero 2 + 2 o 2 + 4 bytes. La interpretación de dicho puntero depende del modo de funcionamiento del microprocesador:

^ Statla de la bandera después de ejecutar el comando (excepto la tarea de conmutación):

la ejecución del equipo no afecta a las banderas.

Cuando cambia la tarea, los valores de la bandera se cambian de acuerdo con la información del registro de EFLAGS en el segmento de estado de TSS de la tarea a la que cambia.
Solicitud:
El comando de llamada le permite organizar un control flexible y multivariado a la subrutina mientras se guarda la dirección del punto de retorno.

Acerca de D (cuatro formatos):

Dirección directa en el segmento:

| 11101000 | DISP-MAY | DIEP-ALTO |

Dirección indirecta en el segmento:

| 11111111 | MOD010R / M |

Dirección indirecta entre los segmentos:

| 11111111 | MOD011R / M |

Dirección directa entre los segmentos:

| 10011010 | offset-low | offset-high | seg-low | seg-altura |

Cmp
(Comparar operandos)

Comparación de operandos

^ Diagrama del equipo:

cMP OPERAND1, OPERAND2

Propósito: Comparación de dos operandos.

Algoritmo de trabajo:

realizar la resta (Operand1 Operand2);

dependiendo del resultado, instale banderas, operand1 y operand2 para no cambiar (es decir, el resultado no se memoriza).

Solicitud:
Este comando se usa para comparar los dos operandos restando, mientras que los operandos no cambian. Según los resultados del comando, las banderas están instaladas. El comando CMP se aplica a los comandos de transición condicional y el comando de instalación de BYTE mediante el valor SETCC.

Acerca de K O D (Tres formatos):

Registrarse o registrar la memoria:

| 001110DW | MODREGR / M |

Valor directo con registro AX (AL):

| 0011110W | --data-- | Datos, si w \u003d 1 |

Valor directo con registro o memoria:

| 100000sw | mod111r / m | --data-- | Datos, si SW \u003d 0 |

DIC
(Disminución del operando por 1)

Reduciendo el operando por unidad.

^ Diagrama del equipo:

operando de diciembre.

PROPÓSITO: Reducir el valor del operando en la memoria o registrarse por 1.

Algoritmo de trabajo:
el comando deduce 1 del operando. Estado de la bandera después de ejecutar el comando:

Solicitud:
El comando DE DEC se usa para reducir el valor de los bytes, las palabras, las palabras dobles en la memoria o el registro por unidad. Al mismo tiempo, observe que el comando no afecta la bandera del CF.

Registrarse: | 01001reg |

^ Registro o Memoria: | 1111111W | MOD001R / M |

Div
(Divida sin firmar)

Decisión insaltable

Diagrama del equipo:

diviver divisora

Propósito: realizar el funcionamiento de dividir dos valores no firmados binarios.

^ Algoritmo de trabajo:
Para el comando, es necesario especificar dos operandos, división y divisor. El dividendo se define implícitamente y su tamaño depende del tamaño del divisor, que se especifica en el comando:

si un divisor en los bytes, entonces el dividendo debe estar ubicado en el Registro Axe. Después de la operación, el privado se coloca en AL y el residuo en ah;

si el divisor es el tamaño de la palabra, entonces el dividendo debe estar ubicado en el par de registros DX: AX, y la parte más joven del dividendo está en AX. Después de la operación, el privado se coloca en el hacha, y el residuo en DX;

si un divisor de doble palabra, el divisible debe estar ubicado en el par de registros EDX: EAX, y la parte más joven de la división está en EAX. Después de la operación, el privado se coloca en EAX, y el residuo está en EDX.

^ Statla de la bandera después de ejecutar el comando:

Solicitud:
El equipo realiza una división entera de operandos con la emisión del resultado de dividir en forma de un privado y residuo de la división. Al realizar una operación de división, puede ocurrir una situación excepcional: 0 - Error de división. Esta situación ocurre en uno de los dos casos: el divisor es 0 o privado demasiado grande para su ubicación en el registro EAX / AX / AL.

Oh k acerca de D:

| 1111011w | MOD110R / M |

En t.
INTERRUMPIR)

Llamar al subprograma de servicio de interrupción

^ Diagrama del equipo:

iNT NUMERO_NAME

Propósito: Llamar a una subrutina de servicio de interrupción con un número de interrupción especificado por el comando operando.

^ Algoritmo de trabajo:

escriba en las banderas de Eflags / Flags y la dirección de retorno. Al recuperar la dirección de retorno, los contenidos del registro de segmentos CS se registran por primera vez, luego los contenidos del puntero de comandos EIP / IP;

restablecer si y tf en banderas cero;

transferir el control al programa de procesamiento de interrupciones con el número especificado. El mecanismo de control depende del modo de funcionamiento del microprocesador.

^ Statla de la bandera después de ejecutar el comando:

Solicitud:
Como se puede ver en la sintaxis, hay dos formas de este comando:

iNT 3: tiene su propio código individual de la operación de 0cch y toma un byte. Esta circunstancia lo hace muy conveniente para su uso en varios depuradores de software para instalar puntos de interrupción reemplazando el primer byte de cualquier comando. El microprocesador, encontrado en el comando de secuencia de comandos con el código de operación de 0cch, provoca un programa de procesamiento de interrupciones con un vector número 3, que sirve para comunicarse con el depurador del programa.

La segunda forma del comando ocupa dos bytes, tiene un código de operación 0CDH y le permite iniciar una llamada de la rutina de procesamiento de interrupciones con un número de vector en el rango de 0-255. Las características de la gestión de la gerencia, como se señalan, dependen del modo de operación del microprocesador.

Sobre los (dos formatos):

Registrarse: | 01000reg |

^ Registro o memoria: | 1111111W | MOD000R / M |

JCC.
JCXZ / JECXZ.
(Saltar si la condición)

(Salte si cx \u003d cero / salte si ECX \u003d cero)

Transición si se cumple una condición

Transición si CX / ECX es cero

^ Diagrama del equipo:

etiqueta jcc
etiqueta JCXZ
etiqueta jecxz

Propósito: la transición dentro del segmento de comando actual dependiendo de alguna condición.

^ Algoritmo de comandos (excepto JCXZ / JECXZ):
Comprobación del estado de las banderas dependiendo del código de la operación (refleja la condición verificable):

si la condición de prueba es verdaderamente cierta, continúe con la celda designada por el operando;

si la condición válida es falsa, luego transfiera el siguiente comando.

JCXZ / JECXZ Equipo de trabajo Algoritmo:
Verifique las condiciones de igualdad cero los contenidos del registro ECX / CX:

si la condición verificable

Trabajo de curso

Bajo la disciplina "Programación del sistema"

Tema №4: "Resolver tareas para procedimientos"

Opcion 2.

Universidad Estatal de Siberia Oriental

Tecnología y gestión.

____________________________________________________________________

Colegio tecnológico

LA TAREA

para los cursos

Disciplina:
Tema: Resolver tareas para procedimientos.
Artista (s): Glavinskaya Arina Aleksandrovna
Líder: Dambaevaseegma Viktorovna
Resumen del trabajo: estudio de subprogramas en el lenguaje del ensamblador,
Resolviendo tareas utilizando subrutinas.
1. Parte teórica: información básica sobre el lenguaje del ensamblador (conjunto
Equipos, etc.), organización de subprogramas, métodos de transmisión de medicamentos.
en subrutinas
2. Parte práctica: desarrolle dos subprogramas, uno de los cuales convierte cualquier carta dada al título (incluidas las letras rusas), y el otro convierte la letra a la línea.
Convierte cualquier carta dada al título, y el otro convierte la letra a la línea.
Convierte la letra a la línea.
Términos de ejecución del proyecto a través:
1. La parte teórica es del 30% en 7 semanas.
2. Parte práctica - 70% a las 11 semanas.
3. Protección - 100% a las 14 semanas.
Requisitos para el registro:
1. El cálculo y la nota explicativa del proyecto de intercambio deben presentarse en
Copias electrónicas y sólidas.
2. El informe del informe debe tener al menos 20 páginas de escritura a máquina sin aplicaciones contables.
3. RPZ se emite de acuerdo con GOST 7.32-91 y firmado por el gerente.

Gerente __________________

Artista __________________

Fecha de emisión " 26 " septiembre 2017 GRAMO.


Introducción 2.

1.1 Información básica sobre el lenguaje del ensamblador. 3.

1.1.1 Conjunto de comandos. cuatro

1.2 Organización de subrutinas en el lenguaje del ensamblador. cuatro

1.3 Métodos para transferir parámetros en subrutinas. 6.

1.3.1 Transferencia de parámetros a través de registros .. 6

1.3.2 Transferencia de parámetros a través de la pila. 7.

2 sección práctica .. 9

2.1 Configuración del problema. nueve

2.2 Descripción del problema del problema. nueve

2.3 Prueba del programa .. 7

Conclusión. ocho

Referencias .. 9


Introducción

Es bien sabido que es difícil programar en el ensamblador. Como saben, hay muchos idiomas diferentes. nivel altoEso le permite pasar mucho menos esfuerzo al escribir programas. Naturalmente, la pregunta surge cuando el programador puede necesitar usar el ensamblador al escribir programas. Actualmente, puede especificar dos áreas en las que el uso del lenguaje del ensamblador está justificado, y con frecuencia es necesario.

Primero, estos son los llamados programas del sistema dependientes de la máquina, generalmente administran varios dispositivos informáticos (dichos programas se denominan controladores). Estos programas del sistema utilizan comandos especiales de máquinas que no necesitan aplicarse en ordinarias (o como dicen aplicado) Programas. Estos comandos son imposibles o muy difíciles de establecer en el lenguaje de alto nivel.

El segundo área de aplicación del ensamblador se asocia con la optimización de la ejecución del programa. Muy a menudo, los traductores de programas (compiladores) con lenguajes de alto nivel dan un programa muy ineficiente en la máquina. Esto generalmente se relaciona con un programa computacional, en el que la mayoría del tiempo se realiza muy pequeño (alrededor del 3-5%) del programa (ciclo principal). Para resolver este problema, se pueden usar los llamados sistemas de programación multilingüe que le permiten registrar partes del programa en diferentes idiomas. Normalmente, la parte principal del programa se registra en el lenguaje de programación de alto nivel (Fartran, Pascal, C, etc.), y el tiempo de ejecución crítico del programa está en el ensamblador. La velocidad de todo el programa puede aumentar significativamente. A menudo, esta es la única forma de hacer que el programa dé el resultado para un tiempo aceptable.

El propósito de este curso de curso es obtener habilidades prácticas para trabajar la programación en el lenguaje del ensamblador.

Tareas de trabajo:

1. Estudiar la información básica sobre el lenguaje del ensamblaje (estructura y componentes del programa del ensamblador, formato del equipo, la organización de las subrutinas, etc.);

2. Examine los tipos de operaciones de bits, el formato y la lógica de la operación de los comandos de ensamblaje lógico;

3. Resuelva la tarea individual de aplicar subrutinas en el ensamblador;

4 .. Formule la conclusión sobre el trabajo realizado.

1 sección teórica

Información básica sobre Assmbler

El ensamblador es un lenguaje de programación de bajo nivel, que es un formato para los comandos de la máquina de grabación, conveniente para la percepción humana.

Los comandos de lenguaje del ensamblador son uno de uno en uno correspondientes a los equipos del procesador y, de hecho, son una forma simbólica conveniente de grabación (mnemokode) de los comandos y sus argumentos. Además, el lenguaje del ensamblador proporciona abstracciones básicas de software: vinculando las partes del programa y los datos después de las etiquetas con nombres y directivos simbólicos.

Las directivas del ensamblador le permiten incluir bloques de datos en el programa (descrito explícitamente o leído del archivo); repetir un cierto fragmento del número especificado de veces; compilar un fragmento por condición; Establecer la dirección de ejecución del fragmento, cambie los valores de las etiquetas durante el proceso de compilación; Use definiciones macro con parámetros y otros.

Ventajas y desventajas

· La cantidad mínima de código redundante (uso de un número menor de comandos y referencias a la memoria). Como resultado, tamaño de alta velocidad y programas más pequeños;

· Grandes volúmenes de código, una gran cantidad de tareas menores adicionales;

· Código de falta de lectura, dificultad para respaldar (depuración, agregar características);

· La dificultad de implementar paradigmas de programación y cualquier otra convención compleja, la complejidad del desarrollo conjunto;

· Menos cantidades de bibliotecas disponibles, su pequeña compatibilidad;

· Acceso inmediato al equipo: Puertos de E / S, Registros de Procesadores Especiales;

· Máximo "FIT" para la plataforma deseada (el uso de instrucciones especiales, características técnicas de "hierro");

· Infecciones a otras plataformas (excepto compatibles con binarias).

Además de las instrucciones, el programa puede contener directivas: comandos que no se envían directamente a las instrucciones de la máquina y los administradores del compilador. El conjunto y la sintaxis diferirán significativamente y dependerán de la plataforma de hardware, sino del compilador utilizado (generando dialectos de idiomas dentro de una familia de arquitecturas). Como conjunto, las directivas se pueden asignar:

· Determinación de datos (constantes y variables);

· Gestión del programa del programa en memoria y parámetros del archivo de salida;

· Configuración del modo compilador;

· Todo tipo de abstracción (es decir, elementos de lenguajes de alto nivel), desde los procedimientos y funciones de registro (para simplificar la implementación del paradigma de la programación de procedimientos) a las estructuras y ciclos condicionales (para el estructigm de la programación estructural);

· Macros.

Conjunto de comandos

Los comandos típicos del lenguaje del ensamblador son:

· Comandos de transferencia de datos (MOV, etc.)

· Equipos aritméticos (agregar, sub, imul, etc.)

· Operaciones lógicas y lotes (o, y, XOR, SHR, etc.)

· Equipos de gestión de ejecución del programa (JMP, Loop, Ret, etc.)

· Comandos de llamadas de interrupción (a veces se refieren a comandos de control): int

· Comandos de E / S en Puertos (IN, OUT)

Para microcontroladores y microcomputadores también se caracterizan por el control de los comandos y la transición por condición, por ejemplo:

· JNE - Ir si no es igual;

· JGE - Ir, si es más o igual.

Para que la máquina realice los equipos de una persona en el nivel de hardware, es necesario especificar una cierta secuencia de acciones en el idioma de "Nolikov y unidades". El asistente en este negocio será un ensamblador. Esta es una utilidad que funciona con la transferencia de comandos al lenguaje de la máquina. Sin embargo, la escritura del programa es un proceso tan lento y complejo. Este idioma no está destinado a crear pulmones y acciones simples. En este momento, cualquier lenguaje de programación utilizado (el ensamblador funciona bien) le permite escribir tareas especiales efectivas que afectan fuertemente la operación del hardware. El propósito principal es crear un microcom y un pequeño códigos. Este lenguaje da más oportunidades que, por ejemplo, Pascal o C.

Breve descripción de los idiomas del ensamblador

Todos los lenguajes de programación se dividen de los niveles: bajo y alto. Cualquiera del sistema sintáctico de la "familia" del ensamblador es diferente en que se une a la vez algunas ventajas de los idiomas más comunes y modernos. Con otros, sus familiares y el hecho de que el sistema informático se pueda utilizar completamente.

Una característica distintiva del compilador es la simplicidad para usar. Se diferencia de aquellos que funcionan solo con altos niveles. Si tiene en cuenta cualquier idioma de programación, el ensamblador funcione dos veces más rápido y mejor. Para escribir un programa de luz, demasiado tiempo no será necesario.

Brevemente sobre la estructura del idioma.

Si hablamos en general sobre el trabajo y la estructura del funcionamiento del idioma, puede decir seguro de que sus comandos corresponden plenamente a los equipos del procesador. Es decir, el ensamblador usa MneMokodes, la persona más conveniente para grabar.

A diferencia de otros idiomas de programación, el ensamblador utiliza ciertas etiquetas para registrar las celdas de memoria en lugar de las direcciones. Se traducen a las llamadas directivas. Estas son direcciones relativas que no afectan el funcionamiento del procesador (no se traduce en el lenguaje de la máquina), y es necesario reconocer el propio entorno de programación.

Para cada línea del procesador, existe la suya con esta situación correcta será cualquier proceso, incluido el traducido.

El lenguaje del ensamblador tiene varias sintiones que se discutirán en el artículo.

Ventajas de idioma

La adaptación más importante y conveniente del lenguaje del ensamblador será que sea posible escribir cualquier programa para un procesador que sea muy compacto. Si el código resulta ser enorme, entonces algunos procesos se redirigen a RAM. Al mismo tiempo, lo hacen todo rápido y sin fallas, a menos que, por supuesto, controlan a un programador calificado.

Conductores, sistemas operativos, BIOS, compiladores, intérpretes, etc. - Este es todo el programa en el lenguaje del ensamblaje.

Cuando se utiliza un desmontaje, lo que hace una traducción de la máquina en una, es posible comprender fácilmente cómo funciona una u otra tarea del sistema, incluso si no hay explicación. Sin embargo, esto es posible solo si los programas son ligeros. Desafortunadamente, en códigos no triviales, es bastante difícil de entender.

Cons Que Idiomas

Desafortunadamente, los programadores novatos (y, a menudo, los profesionales) son difíciles de desmontar el idioma. El ensamblador requiere una descripción detallada del comando necesario. Debido al hecho de que necesita usar comandos de la máquina, la probabilidad de acciones erróneas y la complejidad de la ejecución está creciendo.

Para escribir incluso el programa más simple, el programador debe estar calificado, y su nivel de conocimiento es lo suficientemente alto. El especialista promedio, desafortunadamente, a menudo escribe códigos malos.

Si se actualiza la plataforma para la cual se crea el programa, entonces todos los comandos deben copiarse manualmente, esto requiere el idioma en sí. El ensamblador no admite la función de la regulación automática del funcionamiento de los procesos y reemplaza a ningún elemento.

Equipos de lenguaje

Como ya se mencionó anteriormente, cada procesador tiene su propio conjunto de comandos. Los elementos más simples que son reconocidos por cualquier tipo son los siguientes códigos:


Uso de directivas

Programación de microcontroladores en el idioma (ensamblador Esto permite y perfectamente se copia con el funcionamiento) del nivel más bajo en la mayoría de los casos que finaliza con éxito. Es mejor usar los procesadores con un recurso limitado. Para técnicas de 32 bits, este lenguaje es adecuado. A menudo en los códigos puede ver las directivas. ¿Qué es ésto? ¿Y para qué se usa?

Para empezar, es necesario enfatizar el hecho de que las directivas no se transfieren al lenguaje de la máquina. Regulan el rendimiento del compilador. A diferencia de los comandos, estos parámetros, que tienen varias funciones, difieren no debido a diferentes procesadores, sino a expensas de otro traductor. Entre las principales directivas se pueden asignar de la siguiente manera:


Origen del nombre

Debido al nombre del idioma - "ensamblador"? Estamos hablando del traductor y el compilador, que también producen cifrado de datos. Desde el ensamblador inglés no significa nada más que un colector. El programa no se recolectó manualmente, se utilizó una estructura automática. Además, en este momento, los usuarios y los especialistas han borrado la diferencia entre los términos. A menudo, el ensamblaje llame a los lenguajes de programación, aunque es solo una utilidad.

Debido al nombre de recolección generalmente aceptado, algunos tienen una solución errónea que existe un solo idioma de bajo nivel (o normas estándar para ello). Para que el programador comprenda de qué se trata la estructura, es necesario especificar, para qué plataforma se usa uno u otro lenguaje ensamblador.

Macrofs

Los idiomas del ensamblador que se crean relativamente recientemente tienen macrosis. Facilitan tanto la ortografía como la ejecución del programa. Gracias a su presencia, el traductor ejecuta el código escrito a veces más rápido. Al crear una opción condicional, puede escribir un gran bloque de equipos, y es más fácil usar macros. Cambiarán rápidamente entre acciones, si la condición o la incumplimiento se realizan.

Al utilizar las directivas de lenguaje macro, el programador recibe macros de ensamblaje. A veces, se puede usar ampliamente, y a veces sus características funcionales se reducen a un comando. Su presencia en el código facilita el trabajo con él, lo hace más comprensible y visual. Sin embargo, debe ser atento para ser atento, en algunos casos, los macros, por el contrario, empeoran la situación.



¿Te gustó el artículo? Compártelo