¿Qué tipo de comando tiene en lenguaje ensamblador? Estructura de comandos en programación a nivel de lenguaje ensamblador. Segmentos del programa. asumir directiva

Introducción.

Idioma en el que está escrito. programa original, llamado entrada idioma, y ​​el idioma al que se traduce para su ejecución por el procesador es en los días libres lengua. El proceso de convertir el lenguaje de entrada en lenguaje de salida se llama transmisión. Dado que los procesadores son capaces de ejecutar programas en lenguaje de máquina binario, que no se utiliza para programación, es necesaria la traducción de todos los programas fuente. Conocido dos caminos emisiones: recopilación e interpretación.

En Compilacion Primero, el programa fuente se traduce completamente a un programa equivalente en el lenguaje de salida, llamado objeto programa y luego ejecutado. Este proceso se implementa utilizando un especial programas, llamado compilador. Un compilador para el cual el lenguaje de entrada es una forma simbólica de representar el lenguaje de máquina (salida) de códigos binarios se llama ensamblador.

En interpretaciones Cada línea de texto en el programa fuente se analiza (interpreta) y el comando especificado en él se ejecuta inmediatamente. La implementación de este método está encomendada a programa de intérprete. La interpretación lleva mucho tiempo. Para aumentar su eficiencia, en lugar de procesar cada línea, el intérprete primero convierte todas equipo cadenas a caracteres (

). La secuencia de símbolos generada se utiliza para realizar las funciones asignadas al programa original.

El lenguaje ensamblador que se analiza a continuación se implementa mediante compilación.

Características del idioma.

Características principales del ensamblador:

● en lugar de códigos binarios, el lenguaje utiliza nombres simbólicos - mnemotécnica. Por ejemplo, para el comando de suma (

) se utilizan mnemónicos

Restas (

multiplicación (

Divisiones (

etc. Los nombres simbólicos también se utilizan para direccionar las celdas de memoria. Para programar en lenguaje ensamblador, en lugar de códigos binarios y direcciones, solo necesita conocer nombres simbólicos que el ensamblador traduce a códigos binarios;

cada declaración corresponde un comando de máquina(código), es decir, existe una correspondencia uno a uno entre los comandos de la máquina y los operadores en un programa en lenguaje ensamblador;

● el idioma proporciona acceso a todos los objetos y equipos. Idiomas nivel alto no tengo esta habilidad. Por ejemplo, el lenguaje ensamblador le permite verificar bits del registro de banderas y el lenguaje de alto nivel (por ejemplo,

) no tiene esta habilidad. Tenga en cuenta que los lenguajes de programación de sistemas (por ejemplo, C) suelen ocupar una posición intermedia. En términos de accesibilidad, se acercan más al lenguaje ensamblador, pero tienen la sintaxis de un lenguaje de alto nivel;

● lenguaje ensamblador No es un lenguaje universal. Cada grupo específico de microprocesadores tiene su propio ensamblador. Los lenguajes de alto nivel no tienen este inconveniente.

A diferencia de los lenguajes de alto nivel, escribir y depurar un programa en lenguaje ensamblador lleva mucho tiempo. A pesar de esto, el lenguaje ensamblador ha recibido amplio uso debido a las siguientes circunstancias:

● un programa escrito en lenguaje ensamblador es significativamente más pequeño y se ejecuta mucho más rápido que un programa escrito en un lenguaje de alto nivel. Para algunas aplicaciones, estos indicadores desempeñan un papel principal, por ejemplo, muchos programas de sistemas (incluidos los compiladores), programas de tarjetas de crédito, celulares, controladores de dispositivos, etc.;

● algunos procedimientos requieren Acceso completo al hardware, lo que normalmente es imposible de hacer en un lenguaje de alto nivel. Esto incluye interrupciones y controladores de interrupciones en sistemas operativos, así como controladores de dispositivos en sistemas integrados en tiempo real.

En la mayoría de los programas, sólo un pequeño porcentaje del código total es responsable de un gran porcentaje del tiempo de ejecución del programa. Normalmente, el 1% del programa es responsable del 50% del tiempo de ejecución y el 10% del programa es responsable del 90% del tiempo de ejecución. Por tanto, para escribir un programa específico en condiciones reales se utiliza tanto ensamblador como uno de los lenguajes de alto nivel.

Formato de operador en lenguaje ensamblador.

Un programa en lenguaje ensamblador es una lista de comandos (declaraciones, oraciones), cada uno de los cuales ocupa una línea separada y contiene cuatro campos: un campo de etiqueta, un campo de operación, un campo de operando y un campo de comentario. Cada campo tiene una columna separada.

Campo de etiqueta.

La columna 1 está asignada para el campo de etiqueta. La etiqueta es un nombre simbólico o identificador. direcciones memoria. Es necesario para que puedas:

● realizar una transición condicional o incondicional al comando;

● obtener acceso a la ubicación donde se almacenan los datos.

Estas declaraciones van acompañadas de una etiqueta. Para indicar un nombre se utilizan letras (mayúsculas) del alfabeto inglés y números. El nombre debe tener una letra al principio y dos puntos como separador al final. La etiqueta con dos puntos se puede escribir en una línea separada y el código de operación se puede escribir en Proxima linea en la columna 2, lo que simplifica el trabajo del compilador. La ausencia de dos puntos no permite distinguir una etiqueta de un código de operación si están ubicados en líneas separadas.

En algunas versiones del lenguaje ensamblador, los dos puntos se colocan solo después de las etiquetas de instrucciones, no después de las etiquetas de datos, y la longitud de la etiqueta puede limitarse a 6 u 8 caracteres.

No debe haber nombres idénticos en el campo de etiqueta, ya que la etiqueta está asociada con direcciones de comando. Si durante la ejecución del programa no es necesario llamar un comando o datos de la memoria, entonces el campo de etiqueta permanece vacío.

Campo de código de operación.

Este campo contiene el código mnemotécnico para un comando o pseudocomando (ver más abajo). El código mnemotécnico del comando lo eligen los desarrolladores del lenguaje. En lenguaje ensamblador

Se selecciona el mnemotécnico para cargar un registro desde la memoria.

), y para guardar el contenido del registro en la memoria - un mnemotécnico

). En lenguajes ensambladores

para ambas operaciones puedes usar el mismo nombre, respectivamente

Si la elección de los nombres mnemotécnicos puede ser arbitraria, entonces la necesidad de utilizar dos instrucciones de máquina está determinada por la arquitectura del procesador.

La mnemónica de los registros también depende de la versión del ensamblador (Tabla 5.2.1).

Campo de operando.

aquí se encuentra información adicional, necesario para realizar la operación. En el campo de operando para comandos de salto se indica la dirección a la que se debe realizar el salto, así como las direcciones y registros que son operandos para el comando de la máquina. Como ejemplo, damos operandos que se pueden utilizar para procesadores de 8 bits.

● datos numéricos,

presentados en diferentes sistemas numéricos. Para indicar el sistema numérico utilizado, la constante va seguida de una de las letras latinas: B,

Respectivamente binario, octal, hexadecimal, sistema decimal notación (

No es necesario que lo escribas). Si el primer dígito de un número hexadecimal es A, B, C,

Luego se añade un insignificante 0 (cero) delante;

● códigos de registros internos del microprocesador y celdas de memoria

M (fuentes o receptores de información) en forma de las letras A, B, C,

M o sus direcciones en cualquier sistema numérico (por ejemplo, 10B - dirección de registro

V sistema binario);

● identificadores,

para pares de aeronaves registrados,

Las primeras letras son B,

NORTE; para un par de acumulador y registro de características -

; para el contador de programa -

;para el puntero de la pila -

● etiquetas que indican las direcciones de los operandos o instrucciones siguientes en el condicional

(si se cumple la condición) y transiciones incondicionales. Por ejemplo, el operando M1 en el comando

significa necesidad sin salto condicional al comando cuya dirección en el campo de etiqueta está marcada con el identificador M1;

● expresiones,

que se construyen vinculando los datos discutidos anteriormente utilizando operadores aritméticos y lógicos. Tenga en cuenta que el método para reservar espacio de datos depende de la versión del idioma. Desarrolladores de lenguaje ensamblador para

Defina la palabra), y luego ingresó Opción alternativa.

que estuvo en el lenguaje para procesadores desde el principio

En versión lingüística

usado

Definir una constante).

Los procesadores procesan operandos de diferentes longitudes. Para definirlo, los desarrolladores del ensamblador tomaron diferentes decisiones, por ejemplo:

Los registros II de diferentes longitudes tienen diferentes nombres: EAX - para colocar operandos de 32 bits (tipo

); AX - para 16 bits (tipo

y AN - para 8 bits (tipo

● para procesadores

Se agregan sufijos a cada código de operación: sufijo

Para tipo

; sufijo ".B" para tipo

Se utilizan diferentes códigos de operación para operandos de diferentes longitudes, por ejemplo, para cargar un byte, media palabra (

) y palabras en un registro de 64 bits usando códigos de operación

respectivamente.

Campo de comentarios.

Este campo proporciona explicaciones sobre las acciones del programa. Los comentarios no afectan el funcionamiento del programa y están destinados a humanos. Pueden ser necesarios para modificar un programa, que sin dichos comentarios puede resultar completamente incomprensible incluso para programadores experimentados. Un comentario comienza con un símbolo y se utiliza para explicar y documentar programas. El carácter inicial de un comentario puede ser:

● punto y coma (;) en idiomas para los procesadores de la empresa

● signo de exclamación (!) en idiomas para

Cada línea de comentario separada está precedida por un carácter principal.

Pseudocomandos (directivas).

En lenguaje ensamblador existen dos tipos principales de comandos:

básico instrucciones que son equivalentes al código de máquina del procesador. Estos comandos realizan todo el procesamiento previsto por el programa;

pseudo-comandos o directivas, diseñado para dar servicio al proceso de traducción de un programa a un lenguaje de combinación de códigos. Como ejemplo en la tabla. 5.2.2 muestra algunos pseudocomandos del ensamblador

para la familia

.

Al programar, hay situaciones en las que, según el algoritmo, la misma cadena de comandos debe repetirse muchas veces. Para salir de esta situación puedes:

● escribir la secuencia requerida de comandos cada vez que ocurra. Este enfoque conduce a un aumento en el volumen del programa;

● organizar esta secuencia en un procedimiento (subrutina) y llamarla si es necesario. Esta salida tiene sus inconvenientes: cada vez es necesario ejecutar un comando de llamada a un procedimiento especial y un comando de retorno, lo que, si la secuencia es corta y se usa con frecuencia, puede reducir en gran medida la velocidad del programa.

El más simple y método efectivo La repetición repetida de una cadena de comandos consiste en utilizar macro, que se puede representar como un pseudocomando diseñado para volver a traducir un grupo de comandos que se encuentran a menudo en un programa.

Una macro, o macrocomando, se caracteriza por tres aspectos: macrodefinición, macroinversión y macroextensión.

Definición de macros

Esta es una designación para una secuencia repetida repetidamente de comandos de programa, utilizada como referencia en el texto del programa.

La definición de macro tiene la siguiente estructura:

Lista de expresiones; Definición de macros

En la estructura dada de macrodefinición, se pueden distinguir tres partes:

● título

macro, incluido el nombre

Pseudocomando

y un conjunto de parámetros;

● marcado con puntos cuerpo macro;

● equipo

graduación

definiciones de macros.

El conjunto de parámetros de definición de macro contiene una lista de todos los parámetros proporcionados en el campo de operando para el grupo de instrucciones seleccionado. Si estos parámetros se proporcionaron anteriormente en el programa, no es necesario indicarlos en el encabezado de definición de macro.

Para volver a ensamblar el grupo de comandos seleccionado, se utiliza una apelación que consta del nombre.

comandos macro y lista de parámetros con otros valores.

Cuando el ensamblador encuentra una definición de macro durante el proceso de compilación, la almacena en la tabla de definición de macro. En apariciones posteriores en el programa del nombre (

) de una macro, el ensamblador la reemplaza con el cuerpo de la macro.

Usar un nombre de macro como código de operación se llama macro-reversión(llamada de macro) y reemplazándolo con el cuerpo de la macro - expansión macroeconómica.

Si un programa se representa como una secuencia de caracteres (letras, números, espacios, signos de puntuación y retornos de carro para pasar a una nueva línea), entonces la macro expansión consiste en reemplazar algunas cadenas de esta secuencia por otras cadenas.

La expansión de macros ocurre durante el proceso de ensamblaje, no durante la ejecución del programa. Los métodos para manipular cadenas de caracteres se asignan a medios macro.

El proceso de montaje se lleva a cabo. en dos pases:

● En la primera pasada, se conservan todas las definiciones de macros y se expanden las llamadas de macros. En este caso, el programa original se lee y se convierte en un programa en el que se eliminan todas las definiciones de macro y cada llamada de macro se reemplaza por el cuerpo de la macro;

● la segunda pasada procesa el programa resultante sin macros.

Macros con parámetros.

Para trabajar con secuencias repetidas de comandos, cuyos parámetros pueden tomar diferentes valores, se proporcionan definiciones de macro:

● con actual parámetros que se colocan en el campo operando de la llamada de macro;

● con formal parámetros. Durante la expansión de la macro, cada parámetro formal que aparece en el cuerpo de la macro se reemplaza por el parámetro real correspondiente.

usando macros con parámetros.

El programa 1 contiene dos secuencias similares de comandos, diferenciándose en que la primera intercambia P y

Y el segundo

El programa 2 incluye una macro con dos parámetros formales P1 y P2. Durante la expansión de la macro, cada carácter P1 dentro del cuerpo de la macro se reemplaza por el primer parámetro real (P,

), y el símbolo P2 se reemplaza por el segundo parámetro real (

) del programa No. 1. En la llamada de macro

el programa 2 está marcado: P,

El primer parámetro real,

Segundo parámetro real.

Programa 1

Programa 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Capacidades ampliadas.

Veamos algunas características avanzadas del lenguaje.

Si se llama dos o más veces a una macro que contiene un comando de salto condicional y una etiqueta a la que saltar, la etiqueta se duplicará (problema de etiqueta duplicada), lo que provocará un error. Por lo tanto, cada llamada asigna una etiqueta separada como parámetro (por parte del programador). en idioma

la etiqueta se declara local (

) y gracias a capacidades avanzadas, el ensamblador genera automáticamente una etiqueta diferente cada vez que se expande la macro.

le permite definir macros dentro de otras macros. Esta característica avanzada es muy útil en combinación con el enlace condicional de un programa. Consideremos

SI TAMAÑO DE PALABRAS GT 16 M2 MACRO

La macro M2 se puede definir en ambas partes de la declaración.

Sin embargo, la definición depende del procesador en el que esté ensamblado el programa: 16 bits o 32 bits. Si no se llama a M1, la macro M2 no se definirá en absoluto.

Otra característica avanzada es que las macros pueden llamar a otras macros, incluidas ellas mismas. recursivo llamar. En el último caso, para evitar un bucle sin fin, la macro debe pasarse un parámetro a sí misma que cambia con cada expansión, y también controlar este parámetro y finaliza la recursividad cuando el parámetro alcanza un cierto valor.

Sobre el uso de medios macro en ensamblador.

Cuando se utilizan macros, el ensamblador debe poder realizar dos funciones: guardar definiciones de macros Y ampliar los desafíos macro.

Guardar definiciones de macros.

Todos los nombres de las macros se almacenan en una tabla. Cada nombre va acompañado de un puntero a la macro correspondiente para poder llamarla si es necesario. Algunos ensambladores tienen una tabla separada para los nombres de las macros, otros tienen una tabla general en la que, junto con los nombres de las macros, se encuentran todas las instrucciones y directivas de la máquina.

Al encontrar una macro durante el ensamblaje es creado:

nuevo elemento mesas con el nombre de la macro, el número de parámetros y un puntero a otra tabla de definición de macros donde se almacenará el cuerpo de la macro;

● lista formal parámetros.

Luego, el cuerpo de la macro, que es simplemente una cadena de caracteres, se lee y se almacena en la tabla de definición de macro. Los parámetros formales que ocurren en el cuerpo del bucle están marcados. personaje especial.

Representación interna de una macro.

del ejemplo anterior para el programa 2 (p. 244) es:

MOV EAX, MOV EBX, MOV MOV &

donde el punto y coma se utiliza como carácter de retorno de carro y el signo & se utiliza como carácter de parámetro formal.

Ampliación de llamadas de macro.

Siempre que se encuentra una definición de macro durante el ensamblaje, se almacena en la tabla de macros. Cuando se llama a una macro, el ensamblador deja temporalmente de leer los datos de entrada del dispositivo de entrada y comienza a leer el cuerpo de la macro almacenada. Los parámetros formales extraídos del cuerpo de la macro se reemplazan por parámetros reales y los proporciona la llamada. Los parámetros ampersand & before permiten que el ensamblador los reconozca.

Aunque existen muchas versiones de ensamblador, los procesos de ensamblaje tienen características comunes y son similares en muchos aspectos. A continuación se analiza el funcionamiento de un ensamblador de dos pasadas.

Ensamblador de dos pasadas.

Un programa consta de una serie de declaraciones. Por lo tanto, parecería que a la hora de realizar el montaje se puede utilizar la siguiente secuencia de acciones:

● traducirlo al lenguaje de máquina;

● transferir el código de máquina resultante a un archivo y la parte correspondiente del listado a otro archivo;

● repita los procedimientos enumerados hasta que se traduzca todo el programa.

Sin embargo, este enfoque no es eficaz. Un ejemplo es el llamado problema. enlace directo. Si la primera declaración es un salto a la declaración P, ubicada al final del programa, entonces el ensamblador no puede traducirla. Primero debe determinar la dirección del operador P y, para ello, debe leer el programa completo. Cada lectura completa del programa fuente se llama paso. Vamos a mostrar cómo se puede resolver el problema del enlace de anticipación usando dos pasos:

en la primera pasada deberías recolectar y almacene todas las definiciones de símbolos (incluidas las etiquetas) en la tabla y, en la segunda pasada, lea y ensamble cada operador. Este método es relativamente simple, pero una segunda pasada por el programa original requiere tiempo adicional dedicado a las operaciones de E/S;

● en la primera pasada debes convertir el programa en una forma intermedia y lo guarda en una tabla, y realiza la segunda pasada no según el programa original, sino según la tabla. Este método de ensamblaje ahorra tiempo, ya que la segunda pasada no realiza operaciones de E/S.

Primer pase.

Gol del primer pase- construir una tabla de símbolos. Como se señaló anteriormente, otro objetivo del primer paso es preservar todas las definiciones de macros y expandir las llamadas a medida que aparecen. En consecuencia, tanto la definición de símbolo como la expansión macro ocurren en una sola pasada. El símbolo puede ser etiqueta, o significado, al que se le asigna un nombre específico mediante la directiva -you:

;Valor - tamaño del búfer

Al asignar significado a los nombres simbólicos en el campo de etiqueta del comando, el ensamblador esencialmente especifica las direcciones que tendrá cada comando durante la ejecución del programa. Para ello, el ensamblador almacena durante el proceso de montaje contador de direcciones de instrucciones(

) como variable especial. Al comienzo del primer paso, el valor de la variable especial se establece en 0 y se incrementa después de cada comando procesado por la longitud de ese comando. Como ejemplo en la tabla. 5.2.3 muestra un fragmento de programa que indica la longitud de los comandos y los valores de los contadores. En la primera pasada, se generan tablas. nombres simbólicos, directivas Y códigos de operación, y si es necesario literal mesa. Un literal es una constante para la cual el ensamblador reserva memoria automáticamente. Observemos de inmediato que los procesadores modernos contienen instrucciones con direcciones inmediatas, por lo que sus ensambladores no admiten literales.

Tabla de nombres de símbolos

contiene un elemento para cada nombre (Tabla 5.2.4). Cada elemento de la tabla de nombres simbólicos contiene el nombre en sí (o un puntero a él), su valor numérico y, a veces, información adicional, que puede incluir:

● la longitud del campo de datos asociado con el símbolo;

● bits de reasignación de memoria (que indican si el valor de un símbolo cambia si el programa se carga en una dirección diferente a la prevista por el ensamblador);

● información sobre si se puede acceder al símbolo desde fuera del procedimiento.

Los nombres simbólicos son etiquetas. Se pueden especificar mediante operadores (por ejemplo,

Mesa directiva.

Esta tabla enumera todas las directivas, o pseudocomandos, que se encuentran al ensamblar un programa.

Tabla de códigos de operación.

Para cada código de operación, la tabla tiene columnas separadas: designación del código de operación, operando 1, operando 2, valor hexadecimal del código de operación, longitud del comando y tipo de comando (Tabla 5.2.5). Los códigos de operación se dividen en grupos según la cantidad y el tipo de operandos. El tipo de comando determina el número de grupo y especifica el procedimiento que se llama para procesar todos los comandos de ese grupo.

Segundo pase.

Gol del segundo pase- creación de un programa objeto e impresión, si es necesario, del protocolo de montaje; información de salida necesaria para que el enlazador vincule los procedimientos que se ensamblaron en diferente tiempo, en un archivo ejecutable.

En la segunda pasada (como en la primera), las líneas que contienen las declaraciones se leen y procesan una por una. El operador original y el operador de salida derivado de él en hexadecimal. objeto El código se puede imprimir o colocar en un búfer para su posterior impresión. Después de restablecer el contador de direcciones de instrucciones, se llama a la siguiente declaración.

El programa fuente puede contener errores, por ejemplo:

el símbolo dado no está definido o está definido más de una vez;

● el código de operación está representado por un nombre no válido (debido a un error tipográfico), no tiene suficientes operandos o tiene demasiados operandos;

● sin operador

Algunos ensambladores pueden detectar un símbolo indefinido y reemplazarlo. Sin embargo, en la mayoría de los casos, cuando encuentra una declaración de error, el ensamblador muestra un mensaje de error en la pantalla e intenta continuar con el proceso de ensamblaje.

Artículos dedicados al lenguaje ensamblador.

Tema 2.5 Conceptos básicos de la programación del procesador.

A medida que aumenta la duración del programa, se vuelve cada vez más difícil recordar los códigos. varias operaciones. Los mnemónicos proporcionan cierta ayuda a este respecto.

El lenguaje de codificación de comandos simbólicos se llama ensamblador.

lenguaje ensamblador Es un lenguaje en el que cada expresión corresponde exactamente a un comando de máquina.

Asamblea Se llama conversión de un programa desde lenguaje ensamblador, es decir, preparar un programa en lenguaje de máquina reemplazando los nombres simbólicos de las operaciones con códigos de máquina y las direcciones simbólicas con números absolutos o relativos, así como la inclusión. programas de biblioteca y generar secuencias de instrucciones simbólicas especificando parámetros específicos en microinstrucciones. Este programa generalmente se encuentra en la ROM o se ingresa en la RAM desde algún medio externo.

El lenguaje ensamblador tiene varias características que lo distinguen de los lenguajes de alto nivel:

1. Ésta es una correspondencia uno a uno entre declaraciones en lenguaje ensamblador e instrucciones de máquina.

2. Un programador en lenguaje ensamblador tiene acceso a todos los objetos e instrucciones presentes en la máquina de destino.

Comprender los conceptos básicos de programación en lenguajes orientados a máquinas es útil para:



Mejor comprensión de la arquitectura de las PC y uso más competente de las computadoras;

Desarrollar estructuras más racionales de algoritmos para programas de resolución de problemas aplicados;

La capacidad de ver y corregir programas ejecutables con la extensión .exe y .com, compilados desde cualquier lenguaje de alto nivel, en caso de pérdida de los programas fuente (llamando a los programas especificados en el depurador de programas DEBUG y descompilando su visualización en ensamblador). idioma);

Compilación de programas para resolver los problemas más críticos (un programa escrito en un lenguaje orientado a máquina suele ser más eficaz: entre un 30 y un 60 por ciento más corto y más rápido que los programas obtenidos como resultado de la traducción de lenguajes de alto nivel)

Implementar procedimientos incluidos en el programa principal en el formulario fragmentos individuales en el caso de que no puedan implementarse ni en el lenguaje de alto nivel utilizado ni utilizando los procedimientos de servicio del sistema operativo.

Un programa en lenguaje ensamblador sólo puede ejecutarse en una familia de computadoras, mientras que un programa escrito en un lenguaje de alto nivel puede ejecutarse potencialmente en diferentes máquinas.

El alfabeto del lenguaje ensamblador se compone de caracteres ASCII.

Los números son sólo números enteros. Hay:

Los números binarios terminan con la letra B;

Números decimales que terminan en la letra D;

Los números hexadecimales terminan con la letra H.

RAM, registros, presentación de datos.

Para una determinada serie de MP, se utiliza un lenguaje de programación individual: el lenguaje ensamblador.

El lenguaje ensamblador ocupa una posición intermedia entre los códigos de máquina y los lenguajes de alto nivel. Programar en este lenguaje es más fácil. Un programa en lenguaje ensamblador hace un uso más eficiente de las capacidades de una máquina específica (más precisamente, un MP) que un programa en un lenguaje de alto nivel (que es más simple para un programador que para un ensamblador). Veamos los principios básicos de la programación en lenguajes orientados a máquina usando el ejemplo del lenguaje ensamblador para el MP KR580VM80. Se utiliza una metodología general para programar en el lenguaje. Las técnicas técnicas específicas para grabar programas están asociadas con las características de la arquitectura y el sistema de comando del MP objetivo.

Modelo de software de un sistema de microprocesador basado en MP KR580VM80

Modelo de software del MPS según la figura 1

Memoria de puertos MP

S z C.A. PAG C

Foto 1

Desde el punto de vista del programador, el MP KR580VM80 tiene los siguientes registros accesibles al programa.

A– Registro acumulador de 8 bits. Es el registro principal del MP. Cualquier operación realizada en una ALU implica colocar uno de los operandos a procesar en el acumulador. El resultado de una operación en la ALU también suele almacenarse en A.

B, C, D, E, H, L– Registros de 8 bits propósito general(RON). memoria interior Diputado. Diseñado para almacenar información procesada, así como los resultados de la operación. Al procesar palabras de 16 bits, los registros forman pares BC, DE, HL y el registro doble se llama primera letra: B, D, H. En un par de registros, el más alto es el primer registro. Los registros H y L tienen una propiedad especial que se utiliza tanto para almacenar datos como para almacenar direcciones de 16 bits de celdas RAM.

Florida– registro de bandera (registro de signos) Registro de 8 bits en el que cinco signos del resultado de la aritmética y operaciones lógicas en MP. Formato FL según la imagen.

Bit C (CY - acarreo): acarreo, establecido en 1 si hubo un acarreo del orden superior del byte al realizar operaciones aritméticas.

Bit P (paridad): paridad, establecida en 1 si el número de unos en los bits del resultado es par.

El dígito AC es un acarreo adicional, diseñado para almacenar el valor de acarreo de la tétrada de orden inferior del resultado.

Bit Z (cero): se establece en 1 si el resultado de la operación es 0.

Bit S (signo): se establece en 1 si el resultado es negativo y en 0 si el resultado es positivo.

SP– puntero de pila, un registro de 16 bits, diseñado para almacenar la dirección de la celda de memoria donde se escribió el último byte insertado en la pila.

RS– contador de programa (contador de programa), un registro de 16 bits, diseñado para almacenar la dirección de la siguiente instrucción a ejecutar. El contenido del contador del programa se incrementa automáticamente en 1 inmediatamente después de recuperar el siguiente byte de instrucción.

En el área de memoria inicial de la dirección 0000Н – 07FF hay programa de control y programas de demostración. Esta es el área ROM.

0800 – 0AFF - área de direcciones para grabar los programas en estudio. (RAM).

0В00 – 0ВВ0 - área de dirección para escribir datos. (RAM).

0ВВ0 – dirección inicial de la pila. (RAM).

Una pila es un área de RAM especialmente organizada destinada al almacenamiento temporal de datos o direcciones. El último número escrito en la pila aparece primero. El puntero de la pila almacena la dirección de la última celda de la pila en la que se escribe información. Cuando se llama a una subrutina, la dirección de retorno al programa principal se almacena automáticamente en la pila. Como regla general, al comienzo de cada subrutina, el contenido de todos los registros involucrados en su ejecución se guarda en la pila y al final de la subrutina se recupera de la pila.

Formato de datos y estructura de comando del lenguaje ensamblador.

La memoria del MP KR580VM80 es una matriz de palabras de 8 bits llamadas bytes. Cada byte tiene su propia dirección de 16 bits, que determina su posición en la secuencia de celdas de memoria. El MP puede direccionar 65536 bytes de memoria, que pueden estar contenidos tanto en ROM como en RAM.

Formato de datos

Los datos se almacenan en la memoria como palabras de 8 bits:

D7 D6 D5 D4 D3 D2 D1 D0

El bit menos significativo es el bit 0, el bit más significativo es el bit 7.

Un comando se caracteriza por su formato, es decir, el número de bits asignados a él, que se dividen byte a byte en determinados campos funcionales.

Formato de comando

Los comandos MP KR580VM80 tienen formato de uno, dos o tres bytes. Los comandos multibyte deben colocarse en idiomas adyacentes. El formato del comando depende de las características específicas de la operación que se realiza.

El primer byte del comando contiene el código de operación, escrito en forma mnemotécnica.

Determina el formato del comando y las acciones que debe realizar el MP sobre los datos durante su ejecución, y el método de direccionamiento, y también puede contener información sobre la ubicación de los datos.

El segundo y tercer bytes pueden contener datos sobre los cuales se realizan operaciones o direcciones que indican la ubicación de los datos. Los datos sobre los que se realizan acciones se denominan operandos.

Formato de comando de un solo byte según la Figura 2

Figura 4

En los comandos en lenguaje ensamblador, el código de operación tiene una forma abreviada de escribir palabras en inglés: una notación mnemotécnica. La mnemónica (del griego mnemotécnico, el arte de memorizar) facilita recordar las órdenes según su finalidad funcional.

Antes de la ejecución, el programa fuente se traduce mediante un programa de traducción llamado ensamblador al lenguaje de combinaciones de código - lenguaje de máquina, de esta forma se coloca en la memoria del MP y luego se usa al ejecutar el comando.


Métodos de direccionamiento

Todos los códigos de operandos (entrada y salida) deben estar ubicados en algún lugar. Se pueden ubicar en los registros internos del MP (la opción más cómoda y rápida). Se pueden ubicar en memoria del sistema(la opción más común). Finalmente, pueden ubicarse en dispositivos de E/S (el caso más raro). La ubicación de los operandos está determinada por el código de instrucción. Existir diferentes metodos, con el cual el código de instrucción puede determinar dónde tomar el operando de entrada y dónde colocar el operando de salida. Estos métodos se denominan métodos de direccionamiento.

Para MP KR580VM80, existen los siguientes métodos de direccionamiento:

Directo;

Registro;

Indirecto;

Apilados.

Directo El direccionamiento supone que el operando (de entrada) está ubicado en la memoria inmediatamente después del código de instrucción. El operando suele ser una constante que debe enviarse a algún lugar, agregarse a algo, etc. los datos están contenidos en el segundo o segundo y tercer bytes del comando, con el byte bajo de datos ubicado en el segundo byte del comando. y el byte alto en el tercer byte de comando.

Derecho El direccionamiento (también conocido como absoluto) supone que el operando (entrada o salida) está ubicado en la memoria en la dirección, cuyo código se encuentra dentro del programa inmediatamente después del código de instrucción. Utilizado en comandos de tres bytes.

Registro El direccionamiento supone que el operando (entrada o salida) está en el registro interno del MP. Utilizado en comandos de un solo byte

Indirecto El direccionamiento (implícito) supone que el registro interno del MP no contiene el operando en sí, sino su dirección en la memoria.

Pila El direccionamiento supone que el comando no contiene una dirección. Direccionamiento de celdas de memoria utilizando el contenido del registro SP de 16 bits (puntero de pila).

Sistema de mando

El sistema de mando del MP es una lista completa de acciones elementales que el MP es capaz de realizar. El MP controlado por estos comandos realiza acciones simples, como operaciones aritméticas y lógicas elementales, transferencia de datos, comparación de dos valores, etc. El número de comandos del MP KR580VM80 es 78 (teniendo en cuenta las modificaciones 244).

Se distinguen los siguientes grupos de comandos:

Transmisión de datos;

Aritmética;

Rompecabezas;

Comandos de salto;

Comandos de entrada/salida, control y apilamiento.


Símbolos y abreviaturas utilizadas al describir comandos y componer programas.

Símbolo Reducción
DIRECCIÓN dirección de 16 bits
DATOS datos de 8 bits
DATOS 16 datos de 16 bits
PUERTO Dirección de dispositivo de E/S de 8 bits
BYTE 2 Segundo byte del comando
BYTE 3 Tercer byte de comando
R, R1, R2 Uno de los registros: A, B, C, D, E, H, L.
RP Uno de los pares de registros: B - especifica el par BC; D: especifica un par DE; H: especifica el par HL
RH Primer registro de la pareja
RL Segundo registro de la pareja.
Λ multiplicación lógica
V Suma lógica
Suma módulo dos
METRO Una celda de memoria cuya dirección especifica el contenido del par de registros HL, es decir, M = (HL)

1. Arquitectura de PC………………………………………………………………………………5

    1.1. Registros.

    1.1.1 Registros de propósito general.

1.1.2. Registros de segmentos

1.1.3 Registro de bandera

1.2. Organización de la memoria.

1.3. Presentación de datos.

1.3.1 Tipos de datos

1.3.2 Representación de caracteres y cadenas

2. Declaraciones del programa en ensamblador ……………………………………

    1. Comandos en lenguaje ensamblador

2.2. Modos de direccionamiento y formatos de instrucciones de máquina.

3. Pseudooperadores………………………………………………………….

3.1 Directivas de definición de datos

3.2 Estructura de un programa ensamblador

3.2.1 Segmentos del programa. asumir directiva

3.2.3 Directiva de segmentación simplificada

4. Elaboración y redacción del programa ………………………….

5. Comandos de transferencia de datos………………………………………….

    5.1 Comandos generales

    5.2 Comandos de pila

5.3 comandos de E/S

5.4 Comandos de reenvío de direcciones

5.5 Comandos de reenvío de banderas

6. Comandos aritméticos………………………………………….

    6.1 Operaciones aritméticas con números enteros binarios

6.1.1 Suma y resta

6.1.2 Comandos para incrementar y disminuir el receptor en uno

6.2 Multiplicación y división

6.3 Cambio de signo

7. Operaciones lógicas……………………………………………….

8. Turnos y turnos cíclicos……………………………………………………

9. Operaciones con cadenas………………………………………………………….

10. Lógica y organización de programas……………………………………

10.1 Ramas incondicionales

10.2 Saltos condicionales

10.4 Procedimientos en lenguaje ensamblador

10.5 Interrupciones INT

10.6 Software del sistema

10.6.1.1 Lectura del teclado.

10.6.1.2 Mostrar caracteres en la pantalla

10.6.1.3 Finalizar programas.

10.6.2.1 Seleccionar modos de visualización

11. Memoria de disco………………………………………………………………..

11.2 Tabla de distribución de archivos

11.3 Operaciones de E/S de disco

11.3.1 Escribir un archivo en el disco

11.3.1.1 Datos ASCIIZ

11.3.1.2 Número de expediente

11.3.1.3 Crear un archivo de disco

11.3.2 Lectura de un archivo de disco

Introducción

El lenguaje ensamblador es una representación simbólica del lenguaje de máquina. Todos los procesos en una computadora personal (PC) en el nivel de hardware más bajo son controlados únicamente por comandos (instrucciones) en lenguaje de máquina. Es imposible resolver verdaderamente problemas relacionados con el hardware (o incluso, además, dependientes del hardware, como aumentar la velocidad de un programa), sin conocimientos de ensamblador.

El ensamblador es una forma conveniente de enviar comandos directamente a los componentes de la PC y requiere conocimiento de las propiedades y capacidades del circuito integrado que contiene estos componentes, es decir, el microprocesador de la PC. Así, el lenguaje ensamblador está directamente relacionado con la organización interna de la PC. Y no es casualidad que casi todos los compiladores de lenguajes de alto nivel admitan el acceso al nivel de programación ensamblador.

Un elemento de la formación de un programador profesional es necesariamente el estudio del ensamblador. Esto se debe a que la programación en lenguaje ensamblador requiere conocimientos de la arquitectura de la PC, lo que permite crear programas más eficientes en otros lenguajes y combinarlos con programas en lenguaje ensamblador.

El manual trata sobre la programación en lenguaje ensamblador para computadoras basadas en microprocesadores Intel.

Este tutorial está dirigido a todos los que estén interesados ​​en la arquitectura del procesador y los conceptos básicos de programación en lenguaje ensamblador, principalmente a los desarrolladores de productos de software.

    Arquitectura de PC.

La arquitectura de la computadora es una representación abstracta de una computadora, que refleja su estructura, circuitos y organización lógica.

Todas las computadoras modernas tienen algunas propiedades arquitectónicas comunes e individuales. Las propiedades individuales son exclusivas de un modelo de computadora específico.

El concepto de arquitectura informática incluye:

    diagrama de bloques informático;

    medios y métodos de acceso a elementos del diagrama de bloques informático;

    conjunto y disponibilidad de registros;

    organización y métodos de tratamiento;

    método de presentación y formato de datos informáticos;

    un conjunto de instrucciones para máquinas informáticas;

    formatos de instrucciones de máquina;

    manejo de interrupciones.

Los principales elementos del hardware de la computadora: unidad del sistema, teclado, dispositivos de visualización, unidades de disco, dispositivos de impresión (impresora) y diversos equipos de comunicación. Unidad del sistema Consta de una placa base, fuente de alimentación y celdas de expansión para tarjetas adicionales. La placa del sistema contiene un microprocesador, una memoria de sólo lectura (ROM), RAM(RAM) y coprocesador.

      Registros.

Dentro del microprocesador, la información está contenida en un grupo de 32 registros (16 de usuario, 16 de sistema), en un grado u otro, disponibles para ser utilizados por el programador. Dado que el manual está dedicado a la programación del microprocesador 8088-i486, lo más lógico es comenzar este tema con una discusión de los registros internos del microprocesador a los que puede acceder el usuario.

El programador utiliza los registros de usuario para escribir programas. Estos registros incluyen:

    ocho registros de 32 bits (registros de propósito general) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/ES;

    seis registros de segmento de 16 bits: CS, DS, SS, ES, FS, GS;

    registros de estado y control: registro de bandera EFLAGS/FLAGS y registro de puntero de comando EIP/IP.

Las partes de un registro de 32 bits se indican mediante una barra. El prefijo E (Extendido) indica el uso de un registro de 32 bits. Para trabajar con bytes, se utilizan registros con prefijos L (bajo) y H (alto), por ejemplo, AL, CH, que denotan los bytes bajo y alto de las partes de 16 bits de los registros.

        Registros de propósito general.

EAX/AX/AH/AL(Registro del acumulador) – batería. Se utiliza en multiplicación y división, en operaciones de E/S y en algunas operaciones de cadenas.

EBX/BX/BH/BL – registro base(registro base), utilizado a menudo al direccionar datos en la memoria.

ECX/CX/CH/CL– encimera(registro de conteo), utilizado como contador del número de repeticiones del bucle.

EDX/DX/DH/DL – registro de datos(registro de datos), utilizado para almacenar datos intermedios. En algunos equipos su uso es obligatorio.

Todos los registros de este grupo permiten el acceso a sus partes “inferiores”. Sólo las partes inferiores de 16 y 8 bits de estos registros se pueden utilizar para el autodireccionamiento. Los 16 bits superiores de estos registros no están disponibles como objetos independientes.

Para soportar comandos de procesamiento de cadenas que permitan el procesamiento secuencial de cadenas de elementos con una longitud de 32, 16 u 8 bits, se utilizan los siguientes:

ESI/SI (registro de índice fuente) – índice fuente. Contiene la dirección del elemento fuente actual.

EDI/DI (registro índice de destino) – índice receptor(recipiente). Contiene la dirección actual en la línea de destino.

En la arquitectura del microprocesador, se admite una estructura de datos (una pila) a nivel de hardware y software. Para trabajar con la pila hay equipos especiales y registros especiales. Cabe señalar que la pila se llena hacia direcciones más pequeñas.

ESP/SP (registro de puntero de pila) – registro puntero pila. Contiene un puntero a la parte superior de la pila en el segmento de pila actual.

EBP/BP (registro de puntero base) – registro de puntero base de pila. Diseñado para organizar el acceso aleatorio a los datos dentro de la pila.

1.1.2. Registros de segmentos

El modelo de software del microprocesador tiene seis registros de segmento: CS, SS, DS, ES, GS, FS. Su existencia se debe a la organización y uso específico de la RAM por parte de los microprocesadores Intel. El hardware del microprocesador soporta la organización estructural del programa que consta de segmentos. Para indicar los segmentos disponibles en este momento Se pretende utilizar registros de segmento. El microprocesador admite los siguientes tipos de segmentos:

    Segmento de código. Contiene comandos del programa. Para acceder a este segmento, utilice el registro CS (registro de segmento de código). registro de código de segmento. Contiene la dirección del segmento de instrucciones de la máquina al que tiene acceso el microprocesador.

    Segmento de datos. Contiene datos procesados ​​por el programa. Para acceder a este segmento, utilice el registro DS (registro de segmento de datos): registro de datos de segmento, que almacena la dirección del segmento de datos del programa actual.

    Segmento de pila. Este segmento es un área de memoria llamada pila. El microprocesador organiza la pila según el principio: primero "en", primero "sal". Para acceder a la pila, utilice el registro SS (registro de segmento de pila): registro de segmento de pila, que contiene la dirección del segmento de la pila.

    Segmento de datos adicional. Los datos procesados ​​se pueden ubicar en tres segmentos de datos adicionales. De forma predeterminada, se supone que los datos están en el segmento de datos. Cuando se utilizan segmentos de datos adicionales, sus direcciones se deben especificar explícitamente mediante prefijos de anulación de segmentos especiales en el comando. Las direcciones de segmentos de datos adicionales deben estar contenidas en los registros ES, GS, FS (registros de segmentos de datos de extensión).

        Registros de control y estado

El microprocesador contiene varios registros que contienen información sobre el estado tanto del microprocesador como del programa cuyos comandos están actualmente cargados en la tubería. Este:

Registro de puntero de instrucción EIP/IP;

    registro de bandera EFLAGS/FLAGS.

Con estos registros, puede obtener información sobre los resultados de la ejecución del comando e influir en el estado del propio microprocesador.

EIP/IP (registro de puntero de instrucciones) – puntero equipos. El registro EIP/IP tiene un ancho de 32 o 16 bits y contiene el desplazamiento de la siguiente instrucción que se ejecutará en relación con el contenido del registro del segmento CS en el segmento de instrucción actual. No se puede acceder directamente a este registro, pero se puede cambiar mediante instrucciones de salto.

EFLAGS/FLAGS (Registro de banderas) – registro banderas. Tamaño de bits 32/16 bits. Los bits individuales de este registro tienen un propósito funcional específico y se denominan banderas. Una bandera es un bit que toma el valor 1 ("bandera establecida") si se cumple alguna condición, y el valor 0 ("bandera borrada") en caso contrario. La parte inferior de este registro es completamente similar al registro FLAGS para i8086.

1.1.3 Registro de bandera

El registro de banderas es de 32 bits y se denomina EFLAGS (Fig. 1). Los bits individuales del registro tienen un propósito funcional específico y se denominan banderas. A cada uno de ellos se le asigna un nombre específico (ZF, CF, etc.). Los 16 bits inferiores de EFLAGS representan el registro de bandera FLAGS de 16 bits utilizado al ejecutar programas escritos para los microprocesadores i086 e i286.

Fig.1 Registro de bandera

Algunas banderas se denominan comúnmente banderas de condición; cambian automáticamente cuando se ejecutan comandos y registran ciertas propiedades de su resultado (por ejemplo, si es igual a cero). Otras banderas se llaman banderas estatales; cambian del programa e influyen en el comportamiento posterior del procesador (por ejemplo, bloquean las interrupciones).

Banderas de condición:

CF (portar bandera) - llevar bandera. Toma el valor 1 si, al sumar números enteros, apareció una unidad de acarreo que no "encajaba" en la cuadrícula de bits, o si, al restar números sin signo, el primero de ellos era menor que el segundo. En los comandos de desplazamiento, el bit que está fuera de la cuadrícula de bits se ingresa en CF. CF también captura las características de la instrucción de multiplicación.

OF (bandera de desbordamiento) - bandera de desbordamiento. Se establece en 1 si, al sumar o restar enteros con signo, el resultado es un resultado que excede el valor permitido en valor absoluto (la mantisa se desbordó y “subió” al dígito con signo).

ZF (bandera cero) - bandera cero. Establezca en 1 si el resultado del comando es 0.

SF (bandera de señales) - bandera firmar. Se establece en 1 si una operación con números con signo produce un resultado negativo.

PF (bandera de paridad) - bandera paridad. Igual a 1 si el resultado del siguiente comando contiene un número par de unos binarios. Generalmente se tiene en cuenta sólo para operaciones de E/S.

AF (bandera de transporte auxiliar) - bandera de transporte adicional. Corrige las características de realizar operaciones con números decimales binarios.

Banderas estatales:

DF (bandera de dirección) - bandera de dirección. Establece la dirección para ver las líneas en los comandos de línea: cuando DF=0, las líneas se ven "hacia adelante" (de principio a fin), cuando DF=1 - en la dirección opuesta.

IOPL (nivel de privilegio de entrada/salida) – Nivel de privilegio de E/S. Se utiliza en modo protegido de operación del microprocesador para controlar el acceso a los comandos de E/S, según el privilegio de la tarea.

NT (tarea anidada) – bandera de anidación de tareas. Se utiliza en modo protegido de funcionamiento del microprocesador para registrar el hecho de que una tarea está anidada dentro de otra.

Bandera del sistema:

SI (indicador de interrupción) - bandera de interrupción. Cuando IF = 0, el procesador deja de responder a las interrupciones entrantes; cuando IF = 1, se elimina el bloqueo de interrupciones.

TF (bandera trampa) - bandera de seguimiento. Cuando TF = 1, después de ejecutar cada comando, el procesador realiza una interrupción (numerada 1), que se puede utilizar al depurar un programa para rastrearlo.

RF (bandera de reanudación) – reanudar bandera. Se utiliza al procesar interrupciones de registros de depuración.

VM (modo virtual 8086) – bandera virtual 8086. 1 procesador funciona en modo virtual 8086. 0 procesador funciona en modo real o protegido.

AC (verificación de alineación) – bandera de control de alineación. Diseñado para permitir el control de alineación al acceder a la memoria.

      Organización de la memoria.

La memoria física a la que tiene acceso el microprocesador se llama RAM ( o memoria de acceso aleatorio - RAM). La RAM es una cadena de bytes que tienen su propia dirección única (su número), llamada físico. El rango de valores de direcciones físicas es de 0 a 4 GB. El mecanismo de gestión de la memoria es enteramente hardware.

El hardware del microprocesador admite varios modelos de uso de RAM:

    modelo segmentado. En este modelo, la memoria para programas se divide en áreas de memoria contiguas (segmentos) y el programa en sí solo puede acceder a los datos que se encuentran en estos segmentos;

    modelo de pagina. En este caso, se considera a la RAM como un conjunto de bloques de un tamaño fijo de 4 KB. La principal aplicación de este modelo está relacionada con la organización. memoria virtual, que le permite utilizar más espacio de memoria para ejecutar programas que el volumen memoria física. Para un microprocesador Pentium, el tamaño de la memoria virtual posible puede alcanzar los 4 TB.

El uso e implementación de estos modelos depende del modo de funcionamiento del microprocesador:

    Modo de dirección real (modo real). El modo es similar al funcionamiento del procesador i8086. Necesario para el funcionamiento de programas desarrollados para los primeros modelos de procesador.

    Modo protegido. El modo protegido te permite realizar múltiples tareas procesamiento de información, protección de la memoria mediante un mecanismo de privilegios de cuatro niveles y su organización de paginación.

    Modo virtual 8086. En este modo, es posible ejecutar varios programas para el i8086. En este caso, pueden funcionar programas en modo real.

La segmentación es un mecanismo de direccionamiento que asegura la existencia de varios espacios de direcciones independientes. Un segmento es un bloque de memoria independiente y compatible con hardware.

Cada programa generalmente puede constar de cualquier número de segmentos, pero tiene acceso directo a tres segmentos principales: código, datos y pila, y de uno a tres segmentos de datos adicionales. El sistema operativo coloca segmentos de programa en la RAM en direcciones físicas específicas y luego coloca los valores de estas direcciones en los registros apropiados. Dentro de un segmento, el programa accede a direcciones relativas al inicio del segmento de forma lineal, es decir, comenzando desde la dirección 0 y terminando con una dirección igual al tamaño del segmento. Dirección relativa o inclinación, que utiliza el microprocesador para acceder a los datos dentro de un segmento se llama eficaz.

Formación de una dirección física en modo real.

En modo real, el rango de cambios en la dirección física es de 0 a 1 MB. El tamaño máximo del segmento es 64 KB. Al contactar a un específico dirección física La RAM está determinada por la dirección del comienzo del segmento y el desplazamiento dentro del segmento. La dirección de inicio del segmento se toma del registro de segmento correspondiente. En este caso, el registro de segmento contiene solo los 16 bits más significativos de la dirección física del comienzo del segmento. Los cuatro bits inferiores que faltan de la dirección de 20 bits se obtienen desplazando el valor del registro de segmento 4 bits hacia la izquierda. La operación de cambio se realiza en hardware. El valor de 20 bits resultante es la dirección física real correspondiente al comienzo del segmento. Eso es dirección física se especifica como un par “segmento:desplazamiento”, donde “segmento” son los primeros 16 bits de la dirección inicial del segmento de memoria al que pertenece la celda, y “desplazamiento” es la dirección de 16 bits de esta celda, contada desde el comienzo de este segmento de memoria (el valor 16 * segmento + desplazamiento da la dirección absoluta de la celda). Si, por ejemplo, el registro CS almacena el valor 1234h, entonces el par de direcciones 1234h:507h define una dirección absoluta igual a 16*1234h+507h =12340h+507h = 12847h. Dicho par se escribe como una palabra doble y (como en el caso de los números) en forma "invertida": la primera palabra contiene un desplazamiento y la segunda, un segmento, y cada una de estas palabras, a su vez, se presenta en un forma “invertida”. Por ejemplo, el par 1234h:5678h se escribiría así:| 78 | 56| 34 | 12|.

Este mecanismo de generación de una dirección física permite hacer que el software sea reubicable, es decir, independiente de direcciones de carga específicas en la RAM.

Los comandos se pueden distinguir por su propósito (entre paréntesis se dan ejemplos de códigos de operación mnemónicos de los comandos del ensamblador de PC de IBM):

l realizar operaciones aritméticas (ADD y ADC - suma y suma con acarreo, SUB y SBB - resta y resta con préstamo, MUL e IMUL - multiplicación con signo y sin signo, DIV e IDIV - división con signo y sin signo, CMP - comparaciones, etc.);

l realizar operaciones lógicas (O, Y, NO, XOR, PRUEBA, etc.);

l transferencia de datos (MOV - reenvío, XCHG - intercambio, IN - entrada al microprocesador, OUT - salida del microprocesador, etc.);

l transferencia de control (ramas del programa: JMP - salto incondicional, CALL - llamada a procedimiento, RET - retorno del procedimiento, J* - salto condicional, LOOP - control de bucle, etc.);

l procesamiento de cadenas de caracteres (MOVS - transferencias, CMPS - comparaciones, LODS - cargas, SCAS - escaneos. Estos comandos se usan generalmente con el prefijo (modificador de repetición) REP;

l interrupciones del programa (INT - interrupciones de software, INTO - interrupción condicional por desbordamiento, IRET - retorno de una interrupción);

l control por microprocesador (ST* y CL* - configuración y reinicio de indicadores, HLT - parada, WAIT - espera, NOP - ralentí, etc.).

CON Lista llena Los comandos de ensamblaje se pueden encontrar en proceso.

Comandos de transferencia de datos

l MOV dst, src - transferencia de datos (mover - enviar de src a dst).

Transfiere: un byte (si src y dst están en formato byte) o una palabra (si src y dst están en formato word) entre registros o entre un registro y la memoria, y escribe un valor directo en un registro o memoria.

Los operandos dst y src deben tener el mismo formato: byte o palabra.

Src puede ser del siguiente tipo: r (registro) - registro, m (memoria) - memoria, i (impedancia) - valor inmediato. Dst puede ser de tipo r, m. No puede utilizar los siguientes operandos en un comando: rsegm junto con i; dos operandos de tipo m y dos operandos de tipo rsegm). El operando i también puede ser una expresión simple:

mov AX, (152 + 101B) / 15

La evaluación de expresiones se realiza sólo durante la traducción. No cambia de bandera.

l PUSH src: empujar una palabra a la pila (empujar - llevar a cabo; empujar hacia la pila desde src). Coloca el contenido de src (cualquier registro de 16 bits (incluido el registro de segmento) o dos celdas de memoria que contengan una palabra de 16 bits) en la parte superior de la pila. Las banderas no cambian;

l POP dst: saca una palabra de la pila (pop - pop; cuenta desde la pila hasta dst). Elimina una palabra de la parte superior de la pila y la coloca en dst, cualquier registro de 16 bits (incluido el registro de segmento) o en dos celdas de memoria. Las banderas no cambian.

La programación a nivel de instrucción de máquina es el nivel mínimo en el que se pueden escribir programas. El sistema de instrucciones de la máquina debe ser suficiente para implementar las acciones requeridas emitiendo instrucciones al hardware de la computadora.

Cada comando de máquina consta de dos partes:

  • operativo: determinar “qué hacer”;
  • operando: definición de objetos de procesamiento, "qué hacer con".

El comando de máquina del microprocesador, escrito en lenguaje ensamblador, es una línea con la siguiente forma sintáctica:

etiqueta de comando/directiva operando(s);comentarios

En este caso, el campo requerido en la línea es un comando o directiva.

La etiqueta, el comando/directiva y los operandos (si los hay) están separados por al menos un espacio o un carácter de tabulación.

Si es necesario continuar con un comando o directiva en la línea siguiente, se utiliza el carácter de barra invertida: \.

De forma predeterminada, el lenguaje ensamblador no distingue entre letras mayúsculas y minúsculas al escribir comandos o directivas.

Líneas de código de ejemplo:

Cuenta db 1 ;Nombre, directiva, un operando
movimiento eax,0 ;Comando, dos operandos
cbw; Equipo

Etiquetas

Etiqueta en lenguaje ensamblador puede contener los siguientes símbolos:

  • todas las letras del alfabeto latino;
  • números del 0 al 9;
  • caracteres especiales: _, @, $, ?.

Se puede utilizar un punto como primer carácter de una etiqueta, pero algunos compiladores no recomiendan utilizar este carácter. Los nombres de ensamblador reservados (directivas, operadores, nombres de comandos) no se pueden utilizar como etiquetas.

El primer carácter de la etiqueta debe ser una letra o un carácter especial (pero no un número). La longitud máxima de la etiqueta es de 31 caracteres. Todas las etiquetas que estén escritas en una línea que no contenga una directiva de ensamblador deben terminar con dos puntos: .

equipos

Equipo le dice al traductor qué acción debe realizar el microprocesador. En un segmento de datos, un comando (o directiva) define un campo, espacio de trabajo o constante. En un segmento de código, un comando especifica una acción, como mover (mov) o agregar (add).

Directivas

El ensamblador cuenta con una serie de operadores que le permiten controlar el proceso de montaje y listado. Estos operadores se llaman directivas . Actúan sólo durante el proceso de compilación del programa y, a diferencia de los comandos, no generan código de máquina.

Operandos

Operando – un objeto en el que se ejecuta un comando de máquina o una declaración de lenguaje de programación.
Una instrucción puede tener uno o dos operandos, o ningún operando. El número de operandos está especificado implícitamente en el código de instrucción.
Ejemplos:

  • No hay operandos ret ;Regresar
  • Un operando inc ecx; aumentar ecx
  • Dos operandos suman eax,12 ;Suma 12 a eax

La etiqueta, el comando (directiva) y el operando no tienen que comenzar en ninguna posición particular de la línea. Sin embargo, se recomienda escribirlos en una columna para que el programa sea más fácil de leer.

Los operandos pueden ser

  • identificadores;
  • cadenas de caracteres entre comillas simples o dobles;
  • números enteros en sistemas numéricos binario, octal, decimal o hexadecimal.
Identificadores

Identificadores – secuencias de caracteres válidos utilizados para indicar objetos de programa, como códigos de operación, nombres de variables y nombres de etiquetas.

Reglas para registrar identificadores.

  • El identificador puede estar formado por uno o más caracteres.
  • Como símbolos puedes utilizar letras del alfabeto latino, números y algunos caracteres especiales: _, ?, $, @.
  • Un identificador no puede comenzar con un carácter de dígito.
  • La longitud del identificador puede tener hasta 255 caracteres.
  • El traductor acepta los primeros 32 caracteres del identificador e ignora el resto.
Comentarios

Los comentarios están separados de la línea ejecutable por un carácter; . En este caso, todo lo escrito después del punto y coma y hasta el final de la línea es un comentario. El uso de comentarios en un programa mejora su claridad, especialmente cuando el propósito de un conjunto de comandos no está claro. El comentario puede contener cualquier carácter imprimible, incluidos espacios. Un comentario puede abarcar toda la línea o seguir un comando en la misma línea.

Estructura del programa de montaje

Un programa escrito en lenguaje ensamblador puede constar de varias partes llamadas módulos . Cada módulo puede tener uno o más segmentos de datos, pila y código definidos. Cualquier programa ensamblador completo debe incluir un módulo principal o principal desde el cual comienza su ejecución. Un módulo puede contener segmentos de código, segmentos de datos y segmentos de pila, declarados mediante directivas apropiadas. Antes de declarar segmentos, debe especificar el modelo de memoria utilizando la directiva .MODEL.

Un ejemplo de un programa de “no hacer nada” en lenguaje ensamblador:

686P
.MODELO PLANO, LLAMADA ESTÁNDAR
.DATOS
.CÓDIGO
COMENZAR:

RETIRADO
FIN INICIO

Este programa contiene sólo un comando de microprocesador. Este comando es RET. Garantiza que el programa finalice correctamente. En general, este comando se utiliza para salir de un procedimiento.
El resto del programa se refiere al funcionamiento del traductor.
.686P: se permiten comandos en modo protegido de Pentium 6 (Pentium II). Esta directiva selecciona el conjunto admitido de instrucciones de ensamblador, indicando el modelo del procesador. La letra P indicada al final de la directiva informa al traductor que el procesador está funcionando en modo protegido.
.MODEL FLAT, stdcall - modelo de memoria plana. Este modelo de memoria se utiliza en el quirófano. sistema windows. llamada estándar
.DATA es un segmento de programa que contiene datos.
.CODE es un bloque de programa que contiene código.
INICIO - etiqueta. En ensamblador, las etiquetas juegan un papel importante, lo que no se puede decir de los lenguajes modernos de alto nivel.
FINALIZAR INICIO: el final del programa y un mensaje al traductor de que la ejecución del programa debe comenzar con la etiqueta INICIO.
Cada módulo debe contener una directiva END para marcar el final. código fuente programas. Todas las líneas que siguen a la directiva END se ignoran. Si omite la directiva END, se genera un error.
La etiqueta especificada después de la directiva END le dice al traductor el nombre del módulo principal desde el cual comienza la ejecución del programa. Si el programa contiene un módulo, se puede omitir la etiqueta después de la directiva END.