www.vb-mundo.com
Programación en lenguaje ensamblador Indice 1. Arquitectura del de l microproce microproce sador 2. Programación Básica 3. Manipulación de cadenas (Strings) 4. Programación de E/S 5. Macros 6. Programación modular 7. Programación híbrida 8. Conclusión 9. Bibliografía 1. Arquitectura del microproce microproces sador
Introducción Con la aparición de las computadoras personales (PC) y la reduc reduc ción en el costo de las mismas, el microprocesador microprocesador se con virti virtióó en uno de d e los dispositi vos electrónicos más impo rtant rtant es en la historia de la electrónica. Básicamente, Básicamente, un micr oprocesador es un circuito electrónico de m uy alta escala de int egración, egración, capaz c apaz de realizar una infinidad de tareas de forma repetitiva a velocidades muy altas. Esto se logra por medio de la lógica dictada por un conjunto de instrucciones que el microprocesador interpreta y ejecuta y que recibe el nombre de programa. Desde su aparición en 1971 el micr oprocesador ha sufrido una gran cantidad de cambios, todos ellos hacia el lado de aumentar su capacidad y velocidad de procesamiento. Para poder utilizar todo el p otencial otencial que q ue encierra un mic roprocesador, roprocesador, es necesario necesario conocer y comprender comprender su lenguaje natural, esto es: el lenguaje ensamblador. Importancia Importancia del le nguaje ensamblador El lenguaje ensamblador es la forma más básica de programar un microprocesador para que éste sea capaz de realizar las tareas tareas o los cálculos que se le requieran. El lenguaje ensamblador es conocido como un len guaj guaj e de bajo nivel, esto significa que nos permite controlar el 100 % de las funciones de un microprocesador, así como los periféricos asociados a éste. A diferencia de los len guajes de alto nivel, p or ejempl o “Pascal”, el lengu l enguaje aje ensambl ador no requiere de de
un compilador, esto es debido a que las instrucciones en lenguaje ensamblador son traducidas directam directamente ente a código código bi nario y después son colocadas en memoria para que el microprocesador las tome directamente. Aprender a programar programar en e n lenguaje ensamblador no es fácil, fácil, se s e requiere requiere un cierto ni vel vel de conocimiento de la arquitectura arquitectura y organización organización de las c omputadoras, además del conocimiento de programación en algún otro lenguaje. Ventajas Ventajas del lengua l enguajj e ensamblador: Velocidad de ejecución de los programas programas Mayor control sobre el hardware de la computadora Desventajas Desventajas del lenguaje ensamblador: Repetición constante de grupos de instrucciones No existe una s intaxis estandarizada estandarizada Dificultad Dificultad para pa ra encontrar errores en los programas (bugs ) Historia de los procesadores Con la aparición de los circuitos integrados, la posibilidad de reducir el tamaño de algunos dispositivos electrónic electrónicos os se vi o enormemente favo fa vorecida. recida. Los fabricantes de controladores integrados, calculadoras y algunos algunos otros otros disp ositivos ositivos come c omenzaron nzaron a solicitar sistemas integrados en una sola pastilla, esto dio origen a la aparición de los microprocesadores. Microprocesadores de 4 bits En 1971, una compañía que se dedicaba a la fabricación de memorias electrónicas lanzó al mercado el primer microprocesador del mundo. Este microprocesador fue el resultado de un trabajo encargado por una empresa empresa que qu e se dedicaba a la f abricació abricació n de calculadoras electrónicas. El 4004 era un microprocesador microprocesador de 4 bits capaz capaz de direccionar di reccionar 4096 localidades de memoria de 4 bits de anc anc ho. Este
microprocesador microproces ador contaba con un un conjunto conj unto de 45 instrucciones instr ucciones y fue fue ampliamente utilizado utili zado en los primeros videojuegos y sistemas de control. Microprocesadores de 8 bits Con la aparición de aplicaciones más complejas para el microprocesador y el gran éxito comercial del 4004, Intel decidió lanzar al mercado un nuevo microprocesador, el 8008, éste fue el primer microprocesador de 8 bits. Las características de este microprocesador fueron: Capacidad de direccionamiento de 16 Kb Memoria de 8 bits Conjunto de 48 instrucciones Este microprocesador tuvo tanto éxito, que en cosa de dos años su capacidad de proceso fue insuficiente insuficiente para los ingeni eros eros y desarrolladores, desarrolladores, por lo cual en 1973 se liberó el 8080. Es te microprocesador fue una versión mejorada de su predecesor y las mejoras consistieron en un conjunto más grande de instrucciones, mayor capacidad de direccionamiento y una mayor velocidad de procesamiento. Finalmente, Finalmente, en 1977, 197 7, Intel Intel anunció la ap arición del 8085. Es te era el el último microprocesador de 8 bits y básicamente idéntico al 8080. Su principal mejora fue la incorporación del reloj temporizador dentro de la misma pastilla. Microprocesadores Microprocesadores de 16 bits En 1978, Intel Intel lanzó al me rcado el 8086 y un poco más tarde el 8088. Estos dos microprocesadores contaban con registros internos de 16 bits, tenían un bus de datos externo de 16 y 8 bits respecti respectiva vamente mente y ambos era e rann capace ca pacess de direccionar di reccionar 1Mb de memoria por medio de un b us de direcciones de 20 líneas. Otra característica característica importante fue que estos dos microprocesadores microprocesadores eran capaces c apaces de realizar la multiplicación multiplicación y la división por hard ware, cosa que los anteriores anteriores no pod ían. ían. Finalmente apareció el 80286. Este era el último microprocesador de 16 bits, el cual era una versión mejorada del 8086. El 286 incorporaba una unidad adicional para el manejo de memoria y era capaz de direccionar 16Mb en lugar de 1Mb del 8086. Microprocesadores Microprocesadores de 32 bits El 80386 marco el inicio de la aparición de los microprocesadores de 32 bits. Estos microprocesadores tenían grandes grandes ventajas ventajas sobre sus predecesores, entre las cuales s e pueden pueden destacar: direccio namiento de hasta 4Gb de memoria, velocidades de operación más altas, conjuntos de instrucciones más grandes y además contaban con memoria interna (caché) de 8Kb en las versiones más básicas. Del 386 surgieron diferentes versiones, las cuales se listan a continuación. Model o Model 80386DX 80386DX 80386SL 80386SL 80386S 80386S X 80486S 80486S X 80486DX 80486DX
Bus de Dato Datoss 32 16 16 32 32
Coprocesador Coproces ador matemático Si No No No Si
Terminales Terminales d el microprocesado microprocesadorr En esta sección se realizará una breve descripción d el conjunto de terminales terminales del microprocesador más más representativo de la familia 80x86. El microprocesador microprocesador 8086 puede trabajar en dos modos diferentes: diferentes: el modo mínimo y el modo máximo. En el modo máximo el microprocesador puede trabajar en forma conjunta con un microprocesador de datos datos numér num érico ico 8087 8 087 y algunos algunos otros otros circuito c ircuitoss peri peri féricos. féricos. En el modo mínimo mínimo el microprocesador trabaja de forma más autónoma al no depender de circuitos auxiliares, pero esto a su vez le resta flexibilidad. En cualqui cualqui era de los dos modos, las terminales terminales del microprocesador se pueden agrupar de la sig uient uient e forma: Alimentación Reloj Control y estado
Direcciones Datos
El 8086 cuenta con tres tres terminales de alimentació alimentació n: tierra tierra (GND) (G ND) en las termi termi nales nales 1 y 20 y Vcc =5V en la terminal 40. En la terminal 19 se conecta la señal de reloj, la cual debe provenir de un generador de reloj externo al microprocesador. El 8086 cuenta con 20 líneas de direcciones (al igual que el 8 088) 08 8).. Estas Es tas líneas líneas son llamadas A0 a A19 y proporcionan proporcionan un rango de di reccionamiento de 1MB. Para los datos, el 8086 comparte las 16 líneas más bajas de sus líneas de direcciones, las cuales son llamadas AD0 a AD15. Esto se logra gracias gracias a un canal de datos y direcciones direcciones multiplexado. multipl exado. En cuanto a las señales de control y est ado tenemos tenemos las siguientes: s iguientes: La terminal MX/MN controla el cambio de modo del microprocesador. Las señales S0 a S7 son señal señal es de estado, éstas indican diferentes diferentes situaciones acerca del est ado del microprocesador. La señal RD en la terminal 32 indica una operación de lectura. En la terminal 22 se encuentra la señal READY. Esta señal es utilizada por los diferentes dispositivos dispositivos de E/S para indicarle indicarle al microprocesador si se encuentran listos para para una transferencia. La señal RESET en la terminal 21 es utilizada para reinicializar el microprocesador. La señal NMI en la terminal 17 es una señal de interrupción no enmascarable, lo cual significa que no puede ser manipulada por medio de s oftware. oftware. La señal INTR en la terminal 18 es también una señal de interrupción, la diferencia radica en que esta señal si puede ser controlada por so ftware. ftware. Las L as interrupciones interrupciones s e estudian más adelante. La termi terminal nal TEST se utiliza para sincronizar al 8086 con otros microprocesadores en una con figuración figuración en paralelo. Las terminales RQ/GT y LOCK se utilizan para controlar el trabajo en paralelo de dos o mas microprocesadores. La señal señal WR W R es utilizada por el microprocesador cuando éste requiere realizar realizar alguna ope ración ración de escritura con la memoria o los dispositivos de E/S. Las señales HOLD y HLDA son utilizadas utilizadas p ara control control ar el acceso al bus del sis tema. Diagrama Diagrama de componentes internos Descripción Descripción de los componentes c omponentes La fifi gura 2 muestra la estructura estructura interna del microprocesador 8086 con base e n su modelo de programación. programación. El microprocesador microprocesador se di vi de en dos bloques principales: principales: la unidad de interfaz del bus y la unidad de ejecución. Cada una de estas unidades opera de forma asíncrona para maximizar el rendimiento general del microprocesador. Unidad de ejecución Este elemento del microprocesador es el que se encarga de ejecutar las instrucciones. La unidad de ejecución ejecución comprende el c onjunto de registros de propósito ge neral, el registro de de bandera bande rass y la unidad unidad aritmético-lógica. Unidad de interfaz de bus Esta unidad, unidad, la cual se c onoce como BIU B IU (B (B us Interface Interface Unit), procesa todas las operaciones de lectura/escritura lectura/escritura relacionadas con la memoria o con dispositivos dispositivos de entrada/salida, provenientes provenientes d e la unidad de ejecución. Las instrucciones del programa que se está ejecutando son leídas por anticipado por esta unidad y almacenadas en la cola de instrucciones, para después ser transferidas a la unidad de ejecución. Unidad aritmético-lógica Conocida tambié tambiénn como ALU, este c omponente omponente del microprocesador es el qu e realmente realiza las operaciones aritméticas (suma, resta, multiplicación y división) y lógicas (and, or, xor, etc.) que se obtienen obtienen com o instrucciones instrucciones de los programas. programas. Buses internos (datos y direcciones) Los buses internos son un conjunto de líneas paralelas (conductores) que interc interc onecta onectann las diferentes partes partes del microprocesado microprocesador. r.
Existen dos tipos principales: principales: el bus de dat dat os y el bus de direcciones. direcciones. El E l bus de datos datos es el encargado de transport transport ar los datos entre las distintas pa rtes del microprocesador; por otro lado, el bus de direcciones direcciones se encarga de trans trans portar portar las direcciones direcciones para que q ue los datos puedan s er introducidos introducidos o extraídos de la memoria o dispositivos de entrada y salida. Cola de instrucciones La cola de instrucciones es una pila de tipo FIFO (primero en entrar, primero en salir) donde las instrucciones instrucciones son almacenada almacen adass antes a ntes de que la unidad de ejecución l as ejecute. Registros Registros de propósito general El microprocesador 8086 cuenta con cuatro registros de propósito general, los cuales pueden ser usados usados lib remente remente por p or los programadores. Estos registros registros reciben los nombres siguientes: siguientes: A X (Acumulador) Este registro es es el e ncargado de al al macenar el resulta do de algunas operaciones aritméticas aritméticas y lógicas. BX (Base) Este registro es utilizado para calcular direcciones relativas de datos en la memoria. CX (Contador) Su función principal es la de almacenar el número de veces que un ciclo de instrucciones debe repetirse. DX (Datos) Por lo general se utiliza para acceder a las variables almacenadas en la memoria. Registros Registros apuntadores El 8086 también cuenta con dos registros apuntadores SP y BP. Estos registros reciben su nombre por que su función principal es la de apuntar a alguna dirección de memoria especifica. SP (Apuntador de pila) Se encarga de controlar el acceso de los datos a la pila de los programas. Todos los programas programas en le nguaje ensambl ensambl ador utilizan una pila para almacenar datos en forma temporal. BP (Apuntador Base) Su función es la de proporcionar direcciones para la t rans rans ferencia ferencia e inter i ntercambio cambio de de datos. Registros Registros índices Existen dos registros registros llamados SI y DI que están estrechame estrechamente nte ligados con operaciones de cadenas de datos. SI (Índice (Índice Fuente) Proporciona la dirección inicial para que u na cadena sea manipulada. DI (Índice Destino) Proporciona la dirección de destino donde por lo general una cadena será almacenada almacenada después de alguna o peración peración de transferencia. Registros Registros de segmento El 8086 cuenta con cuat ro registros registros especi ales llamados registros de segmento. CS (Segmento de código) Contiene la dirección base del lugar donde inicia el programa almacenado en memoria. DS (Segmento de datos) Contiene la dirección base del luga r del áre a de memoria donde fueron almacenadas almacenadas las variabl variables es del programa. ES (Segmento extra) Este registro por lo general contiene la misma dirección que el registro DS. SS (Segmento de Pila) Contiene Contiene la dirección base del lugar donde inicia el área de memoria re servada para la pila. Registro apuntador de instrucciones IP (Apuntador de instrucciones) Este registro contiene la dirección de desplazamiento del lugar de memoria donde está la siguiente instrucción que será ejecutada por el microprocesador. Registro de estado Conocido tambié tambiénn como registro de banderas (Flags), tiene com com o función princi principal pal almacenar el estado individu individual al de las difere di ferentes ntes condiciones que son manejadas por el microprocesador. Estas Est as condiciones condiciones por lo general cambian de estado después de c ualquier operación operación aritmética aritm ética o lógica: CF (Acarreo) Esta bandera indica el acarreo o préstamo después de una suma o r esta. OF (Sobreflujo) Esta bandera indica cuando el resultado de una suma o resta de números con signo sobrepasa sobrepasa la capacidad ca pacidad de almacenamiento d e los registros. SF (Signo) Esta Est a band bandera era indica si el el resulta resulta do de una operación es positi vo o negati negati vo. SF=0 es positivo, positivo, SF=1 es negati vo. vo. DF (Direcció (Dirección) n) Indica Indica el se ntido en el que los datos serán transferidos en operaciones de manipulación de cadenas. DF=1 es de derecha a izquierda y DF=0 es de izquierda a derecha.
ZF (Cero) Indica si el resultado de una operación aritmética o lógica fue cero o diferente de cero. ZF=0 es diferente y ZF=1 es cero. IF (int (int errupción) errupción) Acti Ac tivva y desacti desacti va la terminal terminal INTR del microprocesa micr oprocesador. dor. PF (paridad) Indica la paridad de un número. Si PF=0 la paridad es impar y si PF=1 la paridad es par. AF (Acarreo auxiliar) Indica si después de una operación de suma o resta ha ocurrido un acarreo de los bits 3 al 4. TF (Trampa) Esta bandera controla la ejecución paso por paso de un programa con fines de depuración. Funcionamiento interno (ejecución de un programa) Para que un microprocesado microprocesadorr ejecute ejecute un programa programa es necesario que éste haya sido ensamblado, enlazado y cargado en memoria. Una vez que el programa se encuentra en la memoria, el microprocesado microprocesadorr ejecuta ejecuta los l os siguientes siguientes pasos: pas os: 1.- Extrae de la memoria la instrucción que va a ejecutar y la coloca en el registro interno de instrucciones. 2.- Cambia Cambia el registro r egistro apuntador de instrucciones instrucciones (IP (IP ) de modo que señale a la sig uient uient e instrucción del programa. 3.- Determina el tipo de instrucción que acaba de extraer. 4.- Verifica si la instrucción requiere datos de la memoria y, si es así, determina donde están situados. 5.- Extrae los datos, si los hay, y los carga en los registros internos del CPU. 6.- Ejecuta la instrucción. 7.- Almacena los resultados en el lu gar apropiado. 8.- Regresa al paso 1 para ejecutar la instrucción siguiente. Este procedimiento lo lleva a cabo el microprocesador millones de veces por segundo. Manejo Manejo de memoria Segmentación El microprocesador microprocesador 8086, como ya se mencionó, cuenta externamente con 20 líneas de d irecciones, con lo cual puede direccionar hasta 1 MB (00000h --FFFFFh) --FFFFFh) de localidades locali dades de memoria. En los días en los que este microprocesador fue diseñado, alcanzar 1MB de direcciones de memoria era algo extraordinario, extraordinario, s ólo que que existía un problema: internamente t odos odos los registros del microprocesador tienen tienen una longitud de 1 6 bits, con lo cual sólo se pueden direcc ionar 64 KB de localidades de memoria. Resulta Resulta ob vio que con este diseño se desperdicia un a gran cantidad de espacio de almacenamiento; la solución a este problema fue la segmentación. La segmentación segmentación consiste en dividir la memoria de la computadora en segm entos. entos. Un segmen seg mento to es un grupo de localidades localidades con c on una longitud mínima de 16 bytes y máxima de 64KB. La mayoría de los los p rogramas rogramas diseñado diseñ adoss en e n lenguaje ensambla dor y en cualquier otro lenguaje definen cuatro segmentos. segmentos. El segmento segmento de código, el s egmento de datos, el segmento extra y el segmento segmento de pila. A cada uno de estos segmentos se le asigna una dirección inicial y ésta es almacenada en los registros de segmento correspondiente, CS para el código, DS para los datos, ES para el segmento extra y SS para la pila. Dirección Dirección física Para que el microprocesad micr oprocesador or pueda pue da acceder acced er a cualquier cu alquier localida d de memoria memori a dentro del del rango d e 1MB, 1MB, debe colocar la di di rección de dicha localida d en el formato de 20 bits. Para lograr esto, el microprocesador realiza una op eración conocida como cálculo de di rección rección real o física. física. Esta E sta operación toma el contenido de dos registros registros de 16 bits y obtiene una un a dirección dirección de 2 0 bits. La formula que utiliza el microprocesador es la siguiente: Dir. Física = Dir. Segmento Segm ento * 10h + Dir. Desplazami Desplaz amiento ento Por ejemplo: si el microprocesador quiere acceder a l a variable ariabl e X almacenad almac enadaa en memoria, mem oria, necesita conocer su di di rección desplazami des plazamiento. ento. La direcció direcció n segmento segment o para las varia variables bles es proporcion ada por por el el registro DS. Para este caso, supongamos que X tiene el desplazamiento 0100h dentro del segmento de datos y que DS tiene la dirección segmento 1000h, la dirección física de la variable X dentro del espacio de 1Mb será: Dir. Dir. Física = 1000h * 1 0h +0100h Dir. Física = 10000h + 0100h Dir. Física = 10100h (dirección en formato de 20 bits).
Dirección Dirección efectiva efectiva (desplazamiento) ( desplazamiento) La dirección efectiva (desplazamiento) se refiere a la di rección de una localidad d e memoria con respecto a la dirección inicial de un segmento. Las direcciones efectivas sólo pueden tomar valores entre entre 0000h y FFFFh, esto es porque los segmentos están limitados a un esp acio de 64 Kb de m emoria. En el ejemplo anterior, la dirección real de la variable X fue de 10100h, y su dirección efectiva o de desplazamiento fue de 100h con respecto al segmento de datos que comienza en la dirección 10000h. Direccionami Direccionamiento ento de los datos datos En la mayoría de las instrucciones instrucciones e n lenguaj lenguaj e ensamblador, se hace referencia a datos que se encuentran encuentran almacenados en diferentes medios, por ej ej emplo: emplo: registro r egistros, s, localidades de memoria, variables, variables, etc. Para que el microprocesador ej ecute correctamente correctamente las instrucciones instrucciones y entregue entregue los resultados esperados, es necesario que se indique la fuente o el origen de los datos con los que va a trabajar, a esto se le conoce como direccionamiento de datos. En los microprocesadores 80x86 existen cuatro formas de indicar el origen de l os datos y se s e llaman modos de direccionamiento. Para explicar estos cuatro modos, tomaremos como ejemplo la instrucción más utilizada en los programas programas en e nsambl nsambl ador, la instrucción MOV. La instrucción instrucción M OV permite transferir (copiar) información entre dos operandos; estos operandos pueden ser registros, variables o datos directos colocados por el programador. El formato de la instrucción MOV es el siguiente: Mov Oper1,Oper2 Esta instrucción copia el contenido de Oper2 en Oper1. Direccionamiento Direccionamiento di recto recto Este modo se conoce como directo, debido a que en el segundo operando se indica la dirección de desplazamiento desplazamiento donde se encuentran los datos datos de o rigen. Ejemplo: Mov A X,[1000h ,[ 1000h]] ;Copia ;Copia en A X lo que se encuentre almacenado en ; DS:1000h Direccionamiento Direccionamiento inm ediat ediat o En este modo, los datos son proporcionados directamente como parte de la instrucción. Ejemplo: Mov A X, 34h ;Copi ;Copi a en A X el número 34h hexadecimal Mov CX CX,, 10 ;Copia en CX el número 10 en decimal Direccionamiento Direccionamiento p or registro En este modo de direccionamiento, direccionamiento, el segundo s egundo operando es u n registro, registro, el cual c ual contiene contiene los datos con los que el microprocesador ejecutará la instrucción. Ejemplo: Mov A X,BX ,B X ;Copi ;Copi a en A X el contenido contenido del registro B X Direccionamiento Direccionamiento in directo directo por p or registro Finalmente, en el modo indirecto por registro, el segundo operando es un registro, el cual contiene la dirección dirección desplazamiento correspon correspondien dientt e a los datos datos para la instrucción. instrucción. Ejemplo: Mov A X,[B X] ; Copia en A X el dato que se encuentre encuentr e en l a localidad localida d de ;memoria DS:[BX] Los paréntesis cuadrados sirven para indicar al ensamblador que el número no se refiere a un dato, si no que se refiere a la localidad de memoria. En los siguientes capítulos se muestran varios programas, en los cuales podrá identificar los diferentes modos modos d e direccionamiento de datos. 2. Programación Básica
Para comenzar comenzar con la programación en lenguaje ensamblador, es necesario contar con un co njunto de herramientas de programación. Este conjunto de herramientas consta de un editor de texto capaz de producir producir archivos a rchivos en código ASC II, un ens ens amblador amblador y un enl enl azador. Para propósitos de este trabajo, se utilizaran los s iguientes programas: programas: El ensamblador PASS32 El editor de texto texto EDIT ED IT proporci proporcionado onado con todas las versiones de MS -DOS y W indows. indows.
PASS32 es un ensamblador y enlazador enlazador capaz de p roducir códi códi go ejecutable de 16 y 32 bits. Ambos programas se encuentran en el CD-ROM que se incluye como parte de este documento. La razón razón por po r la cual se seleccionaron estos programas, es que pertenecen al so ftware ftware bajo licencia GNU, lo cual permite que sean utilizados por instituciones educativas sin fines de lucro. Esta característica permite que dichos programas sean utilizados sin caer en la práctica de la piratería informática informática por no n o comprar licencias. Formatos de instrucciones En el lenguaje ensamblador existen tres tipos de instrucciones: instrucciones con dos operandos, instrucciones instrucciones con c on un operando e instrucciones con operandos implícitos. implícitos. El camp c ampoo nemónico es ocupado por cualquiera de las instrucciones instrucciones que forman f orman parte del conjunto de la familia x86. Ejemplo: Mov (Transferir) En los dos campos siguientes Reg signi fica que el operando puede ser un registro, registro, Mem Me m indica que puede ser una dirección de memoria y dato indica indica que el ope rando rando puede pue de ser un dato colocado directam directamente ente por el el programador p rogramador.. Los L os campos dos y tres s e encuentr encuentran an entre paréntesis paréntesis cuadrados para indicar que son opcionales opcionales e n algunas algunas instrucciones. Los siguient siguient es son algunos ejemplos d e instrucciones instrucciones de d e las tres formas: Instrucción Instrucción con dos operandos: operan dos: Mov AX,B AX,BX X En este caso Mov es el nemónico, AX es el operando 1 y BX es el operando 2. Instrucción con un operando: INC BX En este caso INC es el nemónico y BX es el único operando. Finalmente Finalmente las instrucciones instrucciones con operandos implícitos o sin operandos: PUSHF Donde PUSHF es el nemónico n emónico y único elemento de la instrucción. Formato Formato de un programa En esta sección aprenderemos aprenderemos como c omo se constituye el código fuente de un programa en le nguaje ensamblador. El siguiente listado se utilizará para mostrar las diferentes partes. .COMMENT ************************************************************************* PRIMERO.ASM PRIMERO.AS M Ejemplo de un programa en lenguaje lenguaj e ensambla dor. Juan Carlos Guzmán C. Ensamblado con Pass32 Versión 2.5. Abril, 2000. ========================================================================= ************************************************************************* .MODEL TINY; Modelo de memoria para el programa .DATA; Declaración de variables Mensaje db 'Mi primer programa pro grama',10,13,'$' ',10,13,'$' .CODE; Cuerpo del programa INICIO:; Punto de entrada al programa mov dx,OFFSE T M ensaje ; Direcció Direcciónn de la caden a de texto mov ah,9 ; Función para imprimir im primir cadenas int 21h ; Llamada al sistema sis tema operativo operati vo mov ah,4ch ah,4c h ; Función para termina r un programa pro grama int 21h ; Llamada al sistema sis tema operativo operati vo END INICIO ; Fin del bloque principal del programa END Un programa programa en lenguaje ensamblador se compone de las s iguientes partes: Área de comentarios Definición Definición del modelo mo delo de memoria Área de datos Cuerpo Cuerpo del programa El área de comentarios sirve para incluir comentarios acerca del programa que se está elaborando, comienza con la directiva .COMMENT y el comentario es colocado entre dos caracteres „*‟.
La definición del modelo de memoria es la parte donde se indica que tipo de código se va generar (16 o 32 bits). En este trabajo sólo se escribirán programas ejecutables .COM, por lo que siempre se usa la directi directi va .MODE .MODE L TINY. El área de datos es el lugar donde deben ser declaradas las constantes y variables del programa. Las variables variables son declaradas declaradas después de la directiva .DATA y las constantes después después de .CONST. En el cuerpo del programa es donde se c olocan las las instrucciones en le nguaje ensambl ensambl ador que se encargarán de realizar las tareas deseadas. El cuerpo del programa comienza con la directiva .CODE y termina con la directiva END. Esta parte corresponde al Begin y End de un programa en lenguaje Pascal. Adicionalmente Adicionalmente se d ebe indicar un punto de entrada al programa. E l punto de entrada se in dica por medio de una etiqueta antes de la primer instrucción real del programa. En el ejemplo anterior el punto de entrada es INICIO: y el punto final de las instrucciones se indica por medio de la instrucción END INICIO. Cuando se requiere comentar las instrucciones instrucc iones de un programa, program a, se debe debe colocar un punt puntoo y coma (;) y así el ensamblador interpreta todo lo que sigue como un comentario de una sola línea. Si requiere comentarios comentarios de más de d e una línea puede usar la directi va .COMMENT. . COMMENT. Proceso de ensamble y ligado de un programa Este proceso es muy sencillo y se describe a continuación: Si está trabajando en MS-DOS siga estos pas os: 1.- Escriba el programa, tal y como aparece en el listado anterior, usando su editor de texto preferido. 2.- Guárdelo Guárdelo con algún algú n nombre y la extensión .ASM. 3.- En el símbolo del MS-DOS esc riba riba lo siguien sig uientt e C:\PASS32\BIN\>PASS C:\PASS32\BIN\>PASS32 32 Nombre.ASM –t
4.- Ejecute el programa .COM que se genera. Para probar el programa abra una ventana de MS-DOS y seleccione el programa haciendo doble clic sobre el icono. Directi Directiva vass de ensamble (Seudo instrucciones) Pass32 cuenta con algunas palabras reservadas que cumplen tareas especiales para facilitar la programación programación en e nsambl nsambl ador, estas palabras palabras son llamadas llamad as seudo instrucciones instrucciones o di recti recti vas vas de ensamble. La siguiente siguiente es una lista de las directi directiva vass de ensamble más utilizadas utilizadas en Pass32: DB Reserva Reserva un byte en m emoria DW Reserva Reserva una palabra pala bra (Word) en m emoria o 2 bytes DD Reserva Reserva una palabra pala bra doble (Double Word) Wor d) .EQU Se utiliza para reemplazar reem plazar símbolos por valores alor es PROC-ENDP Se utilizan para para declarar procedimientos en los programas .MACRO-ENDM Se utilizan para declarar macros DUP Sirve Sirve para i nicializar nicializ ar cadenas cad enas de caracteres caracte res o arreglos numéricos .INCLUDE Se utiliza utiliz a para obtener obtene r datos o subrutinas de otros programas .E XTERN XTERN Declara Declara un símbolo como externo, trabaja en conjunto con .INCLUDE .PUBLIC Declara un símbolo como público Los programas programas incluidos como ejemplos muestran la forma de uti lizar estas directi vas. Instrucciones de transferencia de datos Los microprocesado microprocesadore ress 80x86 cuentan con al gunas instrucciones instrucciones b ásicas de transferencia transferencia de información de acuerdo con los modos de direccionamiento explicados en el capítulo anterior. Las instrucciones instrucciones más representati representativa vass del g rupo de transferencia son: MOV.- Transfiere Transfiere (copia) (c opia) contenidos. contenidos. Su formato es MOV OP1,OP2. Esta instrucción copia el conteni conteni do de OP2 en OP1. Ejemplo: Mov A X, 0 ; AX AX=0 =0 LEA.- Carga un registro con la dirección de desplazamiento de alguna variable en memoria. Su formato es LEA REG,Variable. REG,Variable. Ejemplo: .Data Mensaje
.Code -----------
db „Hola‟,‟$‟
Lea DX DX,M ,Mensaje ensaje ;DS:DX->M ;DS:DX->Mensaje ensaje LDS.- Inicializa el registro DS LES.- Inicializa Inicializa el r egistro ES Nota: Las instrucciones instrucciones LDS L DS y LES modifican modifican directamente dir ectamente el conteni conteni do de los registros de segmento DS y ES, por lo cual se recomienda que sólo sean utilizadas p or programad programadores ores avanzados. ava nzados. XCHG.- Intercambia contenidos. Su formato es XCHG OP1,OP2. El resultado es que el contenido de OP2 se pasa a OP1 y el de OP1 se pasa a OP2. Ejemplo: XCHG AX,B AX,BX X ; AX AX->BX, ->BX, B X->AX El siguie s iguiente nte programa programa muestra muestra la forma de usar las instrucciones d e trans trans ferencia, ferencia, además de algunas directivas de ensamble. Inicialmente, Inicialmente, el programa define un arreglo de 1 0 elementos llamado Array1, y lo inicializa con ceros. Después, utilizando la instrucción Mov, copia el número 10 en el registro AX y el 5 en el registro BX. Por medio de la instrucción Lea, el registro DX es cargado con la dirección de memoria donde comienza Array1 y finalmente intercambia el contenido de los registros AX y BX por medio de la instrucción XCHG. Debido a que el ensamblador es un lenguaje de bajo nivel, es decir que el programador se encuentra en contacto directo con los componentes de la computadora, no existen instrucciones que nos permitan ver el contenido de los registros o los resultados de las operaciones en pantalla, es por esto que la mayoría de los programas no muestran datos en pantalla. .COMMENT * Programa: Trans1.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa ilustra es uso de las o peraciones peraciones para transferencia transferencia de d atos. El programa realmente no hace nada que sea visible al usuario, es solo con fines ilustrativos. * .MODEL tiny .DATA Array1 db 10 dup (0) ;Arreglo de 10 elementos iniciali ;zados en cero. .CODE inicio: ;Punto de entrada entrad a al programa program a mov A X, 10 ;Copiar el número núme ro 10 dentro de A X mov B X, 5 ;Copiar le número núme ro 5 dentro de B X lea DX,Array1 DX,Ar ray1 ;DX contiene contie ne la dirección di rección efecti va de Array1[0] xchg xc hg A X,B X ;Intercambi ;Intercambiar ar los valores contenidos conteni dos en A X y B X mov ax,4C00h ax,4 C00h ;Termi ;Terminar nar programa y salir al DOS int 21h END inicio END Instrucciones aritméticas Existen 8 instrucciones aritméticas básicas: ADD (Suma), SUB (Resta), MUL (Multiplicación sin signo), DIV (División sin signo), IMUL (Multiplicación con signo), IDIV (División con signo), INC (Incremento unitario) y DEC (Decremento unitario). Las instrucciones ADD y SUB permiten realizar sumas y restas sencillas y tienen el siguiente formato: ADD Destino, Fuente SUB Destino, Destino, Fuente Ejemplos: ADD A X,BX ,B X ;AX ;A X=A X+B X ADD A X, 10 ;AX ;A X=A X+10 SUB A X,B X ;AX ;A X=A X-B X-B X SUB A X,10 ;AX ;A X=A X-10 X-10 En las operaciones de suma y resta el resultado siempre es almacenado e n el operando de destino, el cual puede ser un registro o una variable.
Las instrucciones INC y DEC permiten incrementar los contenidos de los registros y de las variables almacenadas en memoria. Ejemplos: INC AX A X ;AX=A ;AX=A X+1 INC VAR1 ;VAR1=VAR1+1 DEC A X ;AX ;A X=A X-1 X-1 DEC VAR1 ;VAR1=VAR1-1 El siguie s iguiente nte programa muestra la forma de utilizar estas instrucciones instrucciones básicas: .COMMENT * Programa: Programa: Addsub.ASM Addsub.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa ilustra el uso de las instrucciones ADD, SUB, INC y DEC. * .MODEL TINY .DATA Var1 DW 10 ;Declaración de una vari vari able de tipo entero enter o ;inicializada con 10. .CODE Inicio: ;Punto de entrada entra da al programa program a Mov A X, 5 ;AX=5 Mov B X, 10 ;BX=10 ;BX=10 Add A X,BX ,B X ;AX=A ;AX=A X+BX Mov CX CX,, 8 ;CX= ;CX= 8 Add CX,Var1 ;CX=CX+Var1 ;CX=CX+Var1 Inc A X ;AX=A ;AX=A X+ 1 Dec B X ;BX=B ;BX=B X-1 Inc Var1 ;Var1=Var1+1 Dec Var1 ;Var1=Var1-1 ;Var1=Var1 -1 Mov A X, 4C00h ;Termi ;Terminar nar programa y salir al DOS Int 21h ; END Inicio END Multiplicación Por otro otro lado l ado,, las operaciones op eraciones de multiplicación y di visión son un poc o más complejas de utilizar, esto se debe a que debemos tomar en cuenta el tamaño de los operandos para no sobrepasar la capacidad de almacenamiento almacenamiento de l os registros registros del d el microprocesador. Existen dos instrucciones para la multiplicación, estas son: MUL e IMUL. MUL permite realizar realizar operaciones operaciones de multi plicación entre operandos sin signo e IMUL permite realizar realizar oper op eraciones aciones entre operandos operandos con signo. La multiplicación se puede efectuar entre bytes (8 bits), palabras (16 bits) o dobles palabras (32 bits). Solamente los microprocesadores microprocesadores 386 y posteriores posteriores pueden realiza r multiplicaciones entre operandos de 32 bits. El producto de una multiplicación multiplicación siempre tiene el doble de ancho. Si se multiplican multiplican dos números de 8 bits, el resultado resultado será de 16 bits; si se s e multiplican dos dos números de 16 bits, el producto será de 32 bits y , finalmente, si se multiplican cantidades de 32 bits, el resultado será un número de 64 bits. En la multiplicación de 8 bits, con o sin signo, el multiplicando está siempre en el registro AL. El multiplicador multiplicador puede s er cual cual quier registro de de 8 bits o cualqui er vari vari able. able. El resultado resultado de d e la multiplicación se almacena en el registro AX, que es de d oble ancho que los operandos in volucrados. volucrados. Ejemplos Ejemplos válidos válidos de opera op eraci ci ones ones d e multiplicación son los siguientes: siguientes: MOV BL,5 MOV AL,10 MUL BL MOV AL,10 MUL número1
;Cargar datos ; ; AX AX=AL*B =AL*B L ; AX AX=AL* =AL*número1 número1
; donde número1 es una variable de tipo byte. En la multiplicación de 16 bits, el multiplicando debe ser colocado en el registro AX y el resultado siempre aparece en el par de registros DX:AX. El registro DX contiene los 16 bits más significativos de producto, mientras que el regis registro tro AX conti ene los 16 bits menos signi ficativos ficati vos del del resulta resultado. do. Ejemplos: MOV A X,400 ;Cargar datos MOV CX CX,, 100 ; MUL CX ; DX:AX=AX*CX DX:AX=AX* CX MOV A X,400 ; MUL numero2 ; DX DX:A :AX X=A X*numero2 X*numero2 El siguie s iguiente nte programa programa muestra muestra la forma de utilizar algu algunas nas de estas operaciones de multiplicaci ón en sus diferentes formatos. Debido a que el ensamblador no cuenta con funciones para imprimir información numérica en la pantalla, no es posible mostrar los resultados; considere este ejemplo únicamente con fines ilustrativos. .COMMENT * Programa: Programa: Mul.ASM Mul.AS M Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa programa ilustra el uso d e las instrucciones instrucciones MUL MU L e IMUL. * .MODEL TINY .DATA NUM NU M 1 dw 3 NUM2 NUM 2 db -5 .CODE INICIO: ;MULTIPLICA ;MULTIPLICA CIÓN DE 8 BITS CON REGISTROS MOV BH,4 ;BH=4 MUL BH ;AX=AL*BH ;AX=AL*BH ;MULTIPLICA ;MULTIPLICA CIÓN DE 16 B ITS ITS MOV A X,-3 ;A X=-3 MUL NUM1 ;DX:AX ;DX:A X=A X*NUM2 ;MULTIPLICA ;MULTIPLICA CIÓN DE 8 BITS CON VAR IABLES MOV AL,3 ;AL=3 IMUL NUM2 ;AX=A ;AX=A L*NUM2 MOV AX,4c00h INT 21h END INICIO END División Las instrucciones instrucciones par p araa división división permiten pe rmiten realiz realizar ar div di visiones d e 8, 16 o 32 bits (esta última sólo está está disponible disponible e n los microprocesadores 386 y posteriores). posteriores). Los operandos pu eden ser números con signo (IDIV (IDIV ) o números sin signo s igno (DIV (DIV ). El div di videndo siempre tiene el do ble de ancho que el operando di visor vis or.. Esto significa que en una división de 8 bits se divide un número de 16 bits entre uno de 8; en una de 16 bits se divide un número de 32 bits entre uno de 16, etc. En la división de 8 bits, el di vi dendo es almacenado en el registro A X y el div di visor pued e ser cualquie c ualquierr registro de 8 bits o cualquier variable declarada de tipo byte. Después de la división, el cociente es cargado en el registro AL y el residuo en el registro AH. Ejemplo de div di visión isi ón sin signo: MOV AX,10 MOV BL,5 DIV BL Ejemplo de divisi división ón con signo:
MOV AL,-10 MOV BL,2 CBW IDIV BL En este último ejemplo, el dividendo es cargado en el registro AL, pero debido a las reglas del microprocesador el dividendo debe ser de 16 bits; para lograr esto, se utiliza una instrucción especial. La instrucción CBW CBW (convertir byte byte a palabra) palabra ) permite convertir un un número de 8 bits con signo en AL en un número de 16 bits con signo en AX. En la división de 16 bits se siguen las mismas reglas que en la división de 8 bits, sólo que en ésta, el dividendo se encuentra en los registro DX:AX. Después de la división el cociente es almacenado en el registro AX y el residuo en el registro DX. En el caso de la división con signo, existe una instrucción que permite convertir un número con signo de 16 bits en AX en un número con signo de 32 bits en DX:AX. El siguie s iguiente nte programa programa muestra muestra la forma de utilizar algu algunas nas de estas operaciones de división en s us diferentes formatos. Debido a que el ensamblador no cuenta con funciones para imprimir información numérica en la pantalla, no es posible mostrar los resultados; considere este ejemplo únicamente con fines ilustrativos. .COMMENT * Programa: Programa: Div.ASM Div.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa programa ilustra el uso d e las instrucciones instrucciones DIV D IV e IDIV. IDIV . * .MODEL TINY .DATA NUM1 db 3 NUM2 NUM 2 db -5 .CODE INICIO: ;INICIO DEL P ROGRAMA MOV A X,100 ;AX=100 ;AX=100 MOV BH,10 ;BH=10 DIV DIV BH ;DIVIS ;DIVIS ION DE 8 BITS S IN S IGNO MOV A X,100 ;AX=100 ;AX=100 DIV DIV NUM1 ;DIVISIO ;DIVISION N DE 8 BITS S IN SIGNO SIGN O CON VAR VARIABLES IABLES MOV AL,-10 ;AX=;AX=-10 10 CBW ;EXTENSIÓN DE S IGNO A 16 BITS IDIV num2 ;DIVISION ;DIVISION DE 8 B ITS CON SIGNO SIGN O MOV A X,4c00h ,4c00 h ;FIN DEL P ROGRAMA INT 21h ; END INICIO END Instrucciones Instrucciones para la ma nipulación de banderas El registro de banderas banderas tiene tien e diferentes diferentes funciones en cada un o de sus bits, algunos de estos bits (banderas) (banderas) pueden ser s er controlados controlados por instrucciones directas de bajo nivel; sin embar go, se debe tener en cuent cuent a que estas banderas banderas están íntimamente ligadas c on funciones internas del microprocesador, microprocesador, por ejemplo la línea INTR (interrupción por hardware), acarreos, etc., y que al manipularlas incorrectamente incorrectamente podemos llegar al extremo de bl oquear la computadora. computadora. Es por esto esto que q ue se recomienda que sólo programadores experimentados modi fiquen fiquen dichas dich as banderas. En esta sección se explicarán algunas de las instrucciones más comunes y sus aplicaciones, pero no se desarrollarán desarrollarán programas por razones de seguridad s eguridad.. Cont Cont rol de interrupción La terminal termi nal INTR del microprocesa micr oprocesa dor puede puede ser activ acti vada o desacti vada directam directamente ente por los programas por medio de las instrucciones STI y CLI. STI carga un 1 en IF, con lo cual INTR queda habilitada; por otro lado, CLI carga un cero en IF, con lo cual las interrupciones externas o por hardware quedan deshabilitadas.
Cont Cont rol de la bandera de acarreo La bandera de acarreo, CF, es la encargada de indicar cuando ha ocurrido un acarreo o préstamo en operaciones operaciones de sum a o resta, también indica errores en la ejecución de procedimientos. Ex isten tres instrucciones instrucciones básicas para pa ra su manipulación: S TC (activar (activar acarreo), CLC (desactivar ( desactivar acarreo) y CMC (Complementar acarreo). Cont Cont rol de la bandera de dirección La bandera de dirección, DF, es utilizada para establecer el sentido en el que las cadenas de datos serán serán procesadas por p or los programas. Un cero en DF indica p rocesamiento rocesamiento de iz quierda a derecha, mientras que un uno indica procesamiento de derecha a izquierda. Para cont cont rolar rolar esta bandera, existen dos instrucciones, instrucciones, CLD (limpiar (lim piar bandera) y S TD (establecer bandera). STD coloca un uno y CLD coloca un cero. Estas instrucciones serán aplicadas más adelante en el capítulo 3, en el cual se desarrollan varios programas para mostrar su uso. Instrucciones Instrucciones de compar ación y prueba Existen dos instrucciones instrucciones especiales en el microprocesador microprocesador 8086: CMP y TES T. CMP (Comparar) compara si dos valores son iguales o diferentes. Su funcionamiento es similar al de la instrucción SUB (restar), sólo que no modifica el operando de destino, solamente modifica las banderas de signo (SF), de cero (ZF) y de acarreo (CF). Por ejemplo: CMP AX,1235 Esta instrucción compara si el valor almacenado en el registro AX es igual que el valor 1235 en decimal. Por otro lado, la instrucción TEST realiza la operación AND de los operandos especificados sin que el resultado resultado se almacene en algún r egistro, egistro, modif mo dificand icandoo únicamente ciertas banderas. Su aplicación aplicación más m ás común es la de probar si algún bit es cero. Ejemplo: Test AL,1 Esta instrucción prueba prueba si el bit men os significativo de AL es 1 y Test AL,128 prueba si el bit más significativo de AL es 1. Por lo general estas estas instrucciones instrucc iones van seguidas se guidas de alguna al guna de las instrucciones instrucci ones de salto, las cuales se estudian en otra sección. Instrucciones de salto En los lenguajes de alto nivel como Pascal y C, los programadores pueden controlar el flujo de los programas programas por po r medio de instrucciones con dicional dicional es compuestas; por ejemplo, ejemplo, en Pascal el siguiente conjunto de instrucciones permite tomar una decisión sobre el flujo del programa: IF A=5 then write(“Error...”);
else A:=A+1; En contraste, contraste, el lenguaje ensamblado r no proporci proporciona ona tales mecanismos. Este tipo de decisiones se realizan realizan por medio de una serie de i nstrucciones nstrucciones que van van teniendo un s ignificado ignificado c onsecuti vo; es decir, d ecir, el efecto de la instrucción siguiente depende del resultado anterior. El lenguaje ensamblador proporciona un conjunto de instrucciones conocidas como instrucciones de salto. Estas instruccion instrucciones es son utilizadas en conjunto con instrucci ones de comparación y prueba para determinar el flujo del programa. Existen dos tipos de instrucciones instrucciones de salto: las instrucciones de salto condicional condicional y las de salto incondicional. Las instrucciones instrucciones de salto condicional, revisan si ha ocurrido alguna situ ación para poder transferi transferi r el control del programa a otra sección, por ejemplo: CMP AX,0 JE otro ........... .......... otro: .......... .......... End
En este ejemplo, la instrucción JE JE (Salta (S alta si es igual) revis revisaa si la prueba implícita en la instrucció n anterior resultó positiva, es decir, si la comparación de AX con 0 fue cierta. En caso de que AX sea igual a 0, JE transfiere el control del programa a las instrucciones que se encuentran después de la etiqueta "otro". En caso c ontrar ontrarii o ejecuta las instrucciones instrucciones siguientes s iguientes a JE. Por otro lado, las instrucciones de salto incondicional (sólo existe una) permiten cambiar el flujo del programa sin verificar si se cumplió alguna condición. Ejemplo: Mov AX,10 Jmp otro ........ ........ otro: ........ ........ En este ejemplo, inmediatamente después de cargar el registro AX con el valor de 10, se transfiere el control del programa a la instrucción que sigue después de la etiqueta "otro". La siguiente es una lista de las instrucciones de salto condicional y su descripción d escripción:: JA o JNBE: Salta si est á arriba arriba o salta si no está por debajo deb ajo o si no es igual (jump (jum p if above abo ve or jump if not below or equal). El salto se efectúa si la bandera de CF=0 o si la bandera ZF=0. JAE o JNB: Salta si está arriba o es igual o salta si no está por debajo (jump if above or equal or jump if not below). El salto se efectúa si CF=0. JB o JNAE: Salta si est á por debajo o salta si no está por arriba o es igual (jump if bel bel ow or jump if not above or equal). El salto se efectúa si CF=1. JBE o JNA: Salta si está por debajo o es igual o salta si no está por arriba (jump if below or equal or jump if not above) abo ve).. El salto se s e efectúa efectúa si s i CF=1 o ZF=1. JE o JZ: JZ: Salta si es igual o salta si es cero (jump if equal equ al or jump jum p if zero). El salto s alto se efectúa si ZF=1. JNE o JNZ: Salta si no es igual o salta si no es cero (jump if not equal or jump if not zero). El salto se efectúa si ZF=0. JG o JNLE: Salta si es mayor o salta si no es menor o igual (jump if greater or jump if not less or equal). El salto s alto se efectúa efectúa si ZF=0 u OF=SF. JGE o JNL: Salta si es mayor o igual o salta si no es menor (jump if greater or equal or jump if not less). El salto se efectúa si SF=OF. JL o JNGE: Salta Salt a si es menor o salta si no es mayor o igual (jum p if less or jump if not greater o r equal). El salto s alto se efectúa efectúa si SF<>OF SF<> OF JLE o JNG: Salta si es menor o igual o salta si no es mayor (jump if less or equal or jump if not greater). El salto se efectúa si ZF=1 o SF<>OF. JC: Salta si hay acarreo (jump if carry). El salto se efectúa si CF=1. JNC: Salta si no hay acarreo (jump if no carry). El salto se efectúa si CF=0. JNO: Salta si no hay desbordamiento (jump if no overflow). El salto se efectúa si OF=0. JNP o JPO : Salta si no hay paridad o salta si la paridad es non (Jump if no parity or jump if parity odd). El salto s alto se efectúa efectúa si PF=0. JNS: Salta si no hay signo (jump if not sign). El salto se efectúa si SF=0. JO: Salta si hay sobreflujo (jump if overflow). El salto se efectúa si OF=1. JP o JPE: Salta si hay paridad o salta si la paridad es par (jump if parity or jump if parity even). El salto se efectúa efectúa si PF=1. JS: Salta si hay signo (jump if sign). El salto se efectúa si SF=1. El siguie s iguiente nte programa muestra la forma de utilizar instrucc instruccione ioness de saltos condicionales: .COMMENT * Programa: Programa: Jumps1.Asm Jumps1.Asm Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa ilustra el uso de las instrucciones instrucciones d e salto condicional e inco ndicional ndicional * .MODEL TINY .DATA cad1 db 'Las 'Las cantidades cantid ades son iguales...',13,10,'$' iguales. ..',13,10,'$' cad2 db 'Las cantidades cantid ades no son iguales...',13,1 ig uales...',13,10,'$' 0,'$'
.CODE INICIO: ;Punto de entrada entrad a al programa program a Mov ax,10 ax,1 0 ;AX=1 ;AX=100 Mov bx,10 bx,1 0 ;BX=1 ;BX=100 Cmp ax,bx ;Es AX AX=B =B X? Je igual ;S¡, entonces saltar a la etiqueta igual Lea dx,cad2 ;No, entonces entonces impri impri mir Cad2 Cad 2 Mov ah,09h ah,09 h ; Int 21h ; Jmp salir ;saltar ;salt ar a la etiqueta salir igual: Lea dx,cad1 dx,c ad1 ;imprimir el mensaje mensaj e en cad1 ca d1 Mov ah,09h ah,09 h ; Int 21h ; salir: Mov ax,4c0 0h ;Salir Int 21h ; END INICIO END Este programa ilustra de forma básica la utilización de las instrucciones de salto, tanto condicionales como incondicionales. Primeramente, el programa inicializa los registros AX y BX con el valor 10 en decimal; después utiliza la instrucción CMP CMP para p ara comparar el contenido de ambos registros; registros; la instrucción instrucción JE (Salta si es igual) verifica la bandera de cero ZF, si ZF=1 significa que los contenidos son iguales y por lo tanto efectúa el salto hacia la etiqueta “Igual”, en caso de que ZF=0 el programa continú a su flujo normal hasta encontrar la instrucción JMP; en este caso la instrucción JMP se utiliza para evitar llegar a la etiqueta “Igual” en el
caso de que los datos sean diferentes. El form form ato para utilizar utilizar las instrucciones instrucciones de salto es idéntico al mostra do en este programa, solamente hay que identificar cual es la condición que queremos probar, para de esta forma seleccionar adecuad adecuadamente amente la instrucción de salto. Instrucciones Instrucciones para ciclos El lenguaje ensamblador cuenta con una i nstrucción nstrucción muy podero p oderosa sa que permite la programación de ciclos finitos, la instrucción LOOP. Esta instrucción trabaja en forma conjunta con el registro contador CX. El formato general de esta instrucción es: Mov CX,No_Veces Etiqueta: ------Loop Etiqueta La instrucción instrucción LOOP L OOP ejecuta las inst rucciones rucciones que se s e encuentran entre la Etiqueta: Etiqueta: y Loop Etiqueta el numero de veces que indique el campo No_Veces. Por ejemplo, el siguiente grupo de instrucciones incrementa en 1 el registro AX, esto lo repite 10 veces. Mov CX CX,, 10 ;10 veces Otro: Inc A X ; AX AX=A =A X+ 1 Loop Otro La instrucción Loop decrementa el registro CX en cada iteración y se detiene cuando CX es igual a cero. El siguiente programa da un ejemplo más ilustrativo: .COMMENT * Programa: Programa: Loop.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa calcula la sucesión de Fibonacci para los 10 primeros términos de la serie, utilizando para ello un ciclo controlado por la instrucción Loop. La sucesión está formad formadaa por números, de modo tal que cada número es la suma s uma de los dos anterioresEjemplo:
1,1,2,3,5,8,13,21,34,55.... * .MODEL tiny .CODE Inicio: ;Punto de entrada entra da al programa program a Mov A X, 0 ;AX=0 Mov B X, 1 ;BX=1 Estos Est os son los dos primeros element os 0+1=1 Mov Mo v CX,10 ;Repetir ;Repeti r 10 veces Repite: Mov DX DX,A ,A X ;DX=A ;DX=A X Add DX,BX DX,B X ;DX=A ;DX=A X+B X Mov A X,B X ;Avanza ;Avanzarr A X Mov B X, DX ;Avanzar ;Avanzar B X Loop Repite ;siguiente ;si guiente número Mov A X, 4C00h ;Termi ;Terminar nar programa y salir al DOS Int 21h ; END Inicio END Instrucciones lógicas El microprocesador microprocesador 8086 cu enta con un grupo de instrucciones lógicas que operan a nivel de bit, estas instrucciones son: AND, OR, XOR y NOT. A contin c ontinuación uación se muestran las tablas de verdad de estas instrucc iones:
Las instrucciones que se enlistan antes requieren dos operandos, a excepción de la operación NOT que sólo requiere uno. En la figura se puede observar que para la operación AND, si los dos operandos son 1, el resultado será 1, en cualquier otra situación será 0. La operación OR establece el resultado a 1 si cualquiera de los dos operandos es 1, de lo contrario el resultado será 0. La instrucción XOR coloca en 0 el resultado si los operandos son iguales, de lo contrario establece 1. Finalmente, la instrucción NOT cambia de estado todos los bits del operando, los unos por ceros y los ceros ceros por po r unos. La principal principal aplicación a plicación de estas instrucciones instrucciones es el enmascaramiento de in formación. formación. La operación A ND nos permite poner a cero cualquier bit de un dato; la operación OR nos permite poner a uno cualquier bit de un dato y la operación XOR permite borrar el contenido de algún registro o localidad de memoria, así como para negar algún bit. El siguiente programa muestra la forma de utilizar estas instrucciones: .COMMENT * Programa: Programa: AndOr.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa ilustra el uso de las instrucciones AND, OR, XOR y NOT. * .MODEL TINY
.DATA Mascara1 db 11111110b Mascara2 db 00000001b Dato1 db 11111111 11111111bb Dato2 db 00000000 00000000bb .CADE INICIO: Mov cx,0000h cx, 0000h ;CX=0; Mov al,dato1 al,d ato1 ;al=dato1 And al,mascara1 ;al=al and mascara1 Mov ah,dato2 ;ah=dato2 ;ah=dato2 Or ah,masca ah,mascara ra22 ;ah=ah or mascara2 Xor bx,bx ;bx=0 Not cx ;cx=not cx Mov ax,4c00h Int 21h END INICIO END El programa del listado list ado 8 declara cuatro variables de tipo byte: Mascara1, Masca ra2, Dato1 y Dato2; después inicializa CX=00h, Al=FFh, Ah=00h; al aplicar una operación and de FFh y FEh, el resultado es FEh, en otras palabras, se apagó el bit menos significativo de al; la siguiente operación es un OR entre 00 y 01, lo cual da como resultado que se enci enda el bit menos significati significativo vo del Ah , el resultado es 01. La siguiente operación es XOR BX,BX, la cual al ser aplicada sobre el mismo operando da como resultado que dicho operando sea borrado. Por ultimo, la operación NOT CX cambia todos los bits de 0 a 1 y viceversa, por lo cual CX=11h. Instrucciones Instrucciones de rotación r otación y desplazamiento El micro mic ropro procc esador cuenta con un co njunt njunt o de instrucciones que pe rmiten la manipulación de las posiciones posiciones indiv in dividuales iduales de los bits dentro de un registro o localidad de memoria, estas instrucciones instrucciones se encuentran encuentran di vi didas en dos g rupos: instrucciones instrucciones de rotación rotación e instrucciones de desplazamiento (también (también conocidas como c omo instrucciones instrucciones para corrimientos). Las instrucciones para rotación son cuatro y nos permiten mover de forma cíclica los bits que forman parte de un registro o localidad de memoria, estas instrucciones son ROL, ROR, RCL , RCR. ROL y ROR funcionan de forma muy semejante; al ejecutar una instrucción ROL, el bit más significativo del dato es desplazado hacia la bandera de acarreo y también hacia la posición del bit memos significativo, por lo cual todos los bits restantes son rotados o movidos hacia la izquierda. La instrucción ROR funciona igual, sólo que ésta trabaja hacia la derecha. Las instrucciones RCL y RCR permiten la rotación de los bits de una localidad de memoria o registro, considerando considerando también el co ntenido ntenido de l a bandera de acarreo. En el caso de R CL, el bit más significativo pasa hacia la bandera de acarreo, el bit que se encontraba en la bandera de acarreo pasa al bit menos significati significativo vo y finalment finalment e los bits restantes restantes son rotados hacia la izq uierda. uierda. L a instrucción RCR funciona igual, pero aplica su rotación hacia la derecha. Para ilustrar el uso de estas instrucciones, tomaremos como ejemplo la instrucción ROL (Rotación a la izquierda). Las instrucciones instrucciones de d e rotación rotación y desplazamiento desplazamiento tienen diferentes formas de utilizarse utilizarse dependiendo d ependiendo del modelo modelo del microprocesador, microprocesador, los siguientes ejemplos muestran estas formas: En el microprocesador 8086 existen dos formas, formas, con contador impl impl ícito y con contador explícito. La forma con contador implícito se utiliza para realizar una sola rotación a la vez y tiene el siguiente formato: ROL A X,1 ;Rotar A X un bit La forma con contador explícito se utiliza para realizar rotaciones n veces sobre un registro o localidad de memoria: MOV CL,3 ;Número de rotaciones rotaci ones ROL A X,CL ; Rotar A X 3 veces En el microprocesador 80386 y superiores existe una variante de contador implícito, la cual nos permite establecer el contador directamente como un operando, su forma es la siguiente: ROL A X,3 ; Rotar A X 3 veces, sólo en 80386 8038 6 y posteriores En el caso de las instrucciones de desplazamiento, también existen cuatro: cuatro: SHL, SH L, SHR, SAL, SAR.
SHL y SHR se utilizan para desplazar los bits de un registro o localidad de memoria, sin considerar el signo de su contenido. SAL y SAR se utilizan utiliz an para desplazar despl azar los bits de un registro regist ro o localidad de memoria, considerando consi derando su contenido contenido como c omo una cantidad con sig no. Las instrucciones instrucciones SHL SH L y SHR S HR funciona funcionann de forma idéntica, s ólo que que en sentidos opuestos. La instrucción SHL inserta un 0 en la posición posic ión del del bit menos me nos significativo significativo y desplaza todos t odos los demás bits una posición hacia la izquierda, colocando el bit más significativo en la bandera de acarreo. La i nstrucción nstrucción SHR inserta un 0 en la posición más significativa, desplaza todos los bit una posición hacia la derecha y finalmente coloca el bit menos significativo en la bandera de acarreo. Algunos ejemplos de su uso son los s iguientes: SHL A X, 1 ; Desplaza el contenido de A X una posición a la izquierda izquie rda MOV CX,3 ; Número Número de veces SHR A X, CL ; Despl Desplaza aza AX 3 veces hacia la derecha derech a SHL B X, 4 ; Desplaza B X 4 veces veces hacia haci a la izquierda, izquie rda, sólo en 386 y posteriores Las dos instrucciones instrucciones restantes restantes SAL y SAR son so n muy parecidas a las instrucciones SHL y S HR HR,, sólo q ue estas dos instrucciones consideran el contenido de los registros como cantidades con sign o, por lo c ual el bit en la posición más significativa del dato (bit de signo) se conserva sin cambio. El siguie s iguiente nte ejemplo muestra el uso de las instrucciones de rotación y desplazamiento, revise el código sólo con fines ilustrativos. COMMENT * Programa: Programa: Rota.ASM Rota.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa programa ilustra el uso d e las instrucciones instrucciones d e rotaci rotaci ón y desplazamiento. desplazamiento. * .MODEL TINY .DATA dato1 dw 10 ; variable de tipo entero enter o .CODE INICIO: ; Punto de entrada entrad a al programa mov mo v ax,1 ax, 1 ; AX=1 mov bx,10 bx,1 0 ; BX BX=1 =100 shl ax,1 ; ax=ax*2 mov cx,3 cx, 3 ; contador igual a 3 shl ax,cl ; ax=ax*8 shr bx,1 ; bx=bx/2 mov cx,2 cx, 2 ; shr bx,cl ; bx=bx/4 shl dato1,1 ; dato1=dato1*2 dato1=dato1* 2 mov ax,1 ; ax=1 rol ax,1 ax, 1 ; rotar ax 1 vez mov bx,-10 bx,- 10 ; bx=-10 sal bx,1 ; bx=bx*2 mov ax,4c0 0h ; Termina r int 21h ; Salir al dos END INICIO END Instrucciones Instrucciones para la pil a La pila es un grupo de localidades de memoria que se reservan con la finalidad de proporcionar un espacio para el almacenamiento temporal de información. La pila de los programas es del tipo LIFO (Last In First Out, Ultimo en entrar, Primero en salir). Para controlar la pila el microprocesador cuenta con dos instrucciones básicas: Push (Meter) y Pop (sacar). El form form ato de estas instrucciones es el siguiente: siguiente: Push operando Pop operando
Cuando se ejecuta la instrucción Push, el contenido del operando se almacena e n la ultima posición de la pila. Por ejemplo, si AX se carga previamente con el valor 5, una instrucción Push AX almacenaría el valor 5 en la ultima posición de la pila. Por otro lado la instrucción Pop saca el último dato almacenado en la pila y lo coloca en el operando. Siguiendo el ejemplo anterior, la instrucción Pop BX obtendría el número 5 y lo almacenaría en el registro BX. El siguiente ejemplo muestra como implementar la instrucción XCHG por medio de las instrucciones Push y Pop. Recuerde que la instrucción XCHG intercambia el contenido de sus dos operandos. .COMMENT Programa: Programa: PushPop.ASM PushPop.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa demuestra el uso de las instrucciones para el manejo de la pila, implementando la instrucción XCHG con Push y Pop * .MODEL tiny .CODE Inicio: ;Punto de entrada al programa pro grama Mov A X, 5 ;AX=5 ;AX=5 Mov B X, 10 ;BX=10 Push A X ;Pila=5 Mov A X,B X ;AX=10 Pop B X ;BX=5 Mov A X, 4C00h ;Terminar programa prog rama y salir al DOS Int 21h ; END Inicio END 3. Manipulación de cadenas (Strings)
Definición de string En el lenguaje lenguaj e ensam ensamblador blador el tipo de de dato cadena (string) (strin g) no está definido, pero para fin fines es de programación, programación, una cadena es definida como un conjunto de l ocalidades ocalidades de m emoria consecuti consecutiva vass que qu e se reservan bajo el nombre de una variable. Almacenamiento Almacenamiento e n memor mem oria ia De acuerdo con la definición anteri anteri or, or, las siguientes líneas líneas en ensamblador e nsamblador declaran cadenas: .DATA Cadena_AS CII db „Cadena‟,1 3,10,‟$‟
Cadena_Ent Cadena_Ent eros eros dw d w 5 Dup (0) Las dos líneas líneas anter a nterii ores ores están declarando variables variables de tipo cadena. En el p rimer caso, Cadena_ASCII reserva un total de 9 bytes de memoria (1 byte = 1 Carácter ASCII) incluyendo el carácter „$‟ que indica
fin de cadena. En el segundo caso, Cadena_E nteros reserva reserva espacio para almacenar 3 cantidades cantidad es enteras o lo que es lo mismo 6 bytes de memoria (1 entero = 2 bytes), todas inicializadas con cero. La diferencia en los casos anteriores radica en el tamaño del dato que compone la cadena, 1 byte para cadenas de caracteres caracteres y 2 o más bytes para cadenas de datos numéricos. El almacenamiento en memoria se vería de la siguiente forma:
Instrucciones para el manejo de strings El lenguaje ensamblador cuenta con cinco instrucciones para el manejo de c adenas: adenas: MOVS: Mueve un byte o palabra desde un a localidad de memo ria a otra. LODS : Carga desde la memoria un byte en AL o una palabra en AX. STOS : Almacena el contenido del registro AL o A X en la memoria. CMPS : Compara localidades de memoria de un byte o p alabra. alabra. SCAS : Compara Compara el el contenido contenid o de AL o A X con el cont enido de alguna al guna localidad de memoria. Las instrucciones instrucciones par p araa cadenas ca denas trabajan en conjunto con la instrucción CLD, la cual permite establecer que el sentido en el que las cadenas serán procesadas será de izquierda a derecha. Otra instrucción importante es el prefijo de repetición REP, el cual permite que una instrucción para manejo de cadenas pueda ser repetida un número determinado de veces. Los registros índice juegan un papel importante en el procesamiento de cadenas de datos, el par de registros registros CS:S I indican la dirección de la cadena o riginal riginal que s erá erá procesada, y el par ES:DI contienen la dirección dirección donde las las cadena c adenass p ueden ser almacenadas. Para comprender realmente como funcionan las instrucciones para cadenas analizaremos varios programas que fueron escritos para este fin. Recuerde que las cadenas en ensamblador no se refieren únicamente únicamente a cadenas cad enas de caracteres ASCII, ASCII, sino a cu alquier alquier tipo de dat o. .COMMENT Programa: Programa: Cad1.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa programa ilustra la forma de utilizar la instrucción MOVS para copiar el c ontenido ontenido de una cadena dentro de otra. .MODEL tiny .DATA cad1 db 'Esta es la cadena1','$' cadena1','$ ' cad2 db 'Esta es la cadena2','$' cadena2','$ ' .CODE inicio: ;Punto de entrada al programa pro grama cld ;Procesamiento de cadenas ca denas de izq->der. izq ->der. mov cx,18 cx, 18 ;longitud de la cadena original origin al lea di,cad2 di,cad 2 ;ES:DI ;ES: DI contienen contien en la dirección direcc ión de Cad2 lea si,cad1 si, cad1 ;DS:SI contienen la dirección di rección de Cad1 Cad 1 rep m ovsb ;DS:SI->ES:DI, ;DS:SI->ES :DI, SI=SI+1, DI=DI DI= DI+1 +1 lea dx,cad1 dx,c ad1 ;Imprimir Cad1 en pantall pantallaa mov ah,09h ah,09 h ; int 21h ; lea dx,cad2 dx,c ad2 ;Imprimir Cad2 en pantall pantallaa mov ah,09h ah,09 h ; int 21h ; mov ax,4c00h ;Terminal programa y regresar al DOS int 21h ; END inicio
END .COMMENT Programa: Programa: Cad2.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa programa demuestr dem uestraa la diferencia diferencia entre el uso d e MOVSB y MOVSW. El programa programa debe de be copiar Cad3 dentro de Cad1 us ando 18 repeticiones repeticiones con c on MOVSB, después realiza lo mismo con Cad4 y Cad2 pero usando solo nueve repeticiones de la instrucción MOVSW. El resultado es el mismo en ambos casos .MODEL tiny .DATA cad1 db 'Cadena 'Cadena de prueba1 ','$' cad2 db 'Cadena 'Cadena de prueba2 ','$' cad3 db 18 dup (' ') cad4 db 18 dup (' ') .CODE inicio: ;Punto de entrada al programa pro grama cld ;procesamiento de izq->der. izq ->der. mov cx,18 cx, 18 ;Longitud de la cadena caden a lea si,cad3 ;DS:SI-> ;DS:SI-> Cad3 lea di,cad1 ;ES:DI->Cad1 ;ES:DI->Cad1 rep m ovsb ;Cad3-> Cad1 mov cx,9 cx, 9 ;Longitud de la cadena ca dena por pares de bytes lea si,cad4 ;DS:SI-> ;DS:SI-> Cad4 lea di,cad2 ;ES:DI->Cad2 ;ES:DI->Cad2 rep mo vsw ;Cad4->Cad2 lea dx,cad1 dx,c ad1 ; mov ah,09h ah,09 h ;Imprimi ;Imprimirr Cad1 int 21h ; lea dx,cad2 dx,c ad2 ; mov ah,09h ah,09 h ;Imprimi ;Imprimirr Cad2 int 21h ; mov ax,4c00h ;Terminar programa y regresar al DOS int 21h ; END inicio END .COMMENT Programa: Programa: Cad3.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa muestra el uso de la instrucción LODSB. El programa invierte el orden de los elementos de una cadena y los almacena en otra cadena que origi origi nalmente esta inicializada con espacios. Al final final se imprimen las dos cadenas. cadenas. .MODEL tiny .DATA cad1 db 'Cadena 'Cadena de prueba', '$' cad2 db 16 dup (' '),'$' .CODE inicio: ;Punto de entrada entrad a al programa program a cld ;Procesamiento de izq->der. izq ->der. mov cx,16 cx, 16 ;Longitud de la cadena ca dena lea si,cad1 si, cad1 ;DS:SI->Cad1 ;DS:S I->Cad1 lea di,cad2+15 di,cad 2+15 ;ES:DI ;ES :DI apuntan apunta n al final del área área res reservada ervada para otro: ;almacenar la cadena invertida inve rtida lodsb ;Obtener el primer prime r carácter carác ter de Cad1 mov [di],al ;almacenarlo en la posición pos ición actual de DI dec di ;Disminuir DI loop otro ;Obtener siguiente sig uiente carácter de Cad1 Cad 1 lea dx,cad1 dx,c ad1 ;
mov ah,09h ah,09 h ;Imprimir cadena original origin al int 21h ; lea dx,cad2 dx,c ad2 ; mov ah,09h ah,09 h ;Imprimi ;Imprimirr cadena invertida in vertida int 21h ; mov ax,4c0 0h ;Termi ;Terminar nar programa y regresar al DOS int 21h ; END inicio END COMMENT Programa: Programa: Cad4.ASM Autor: Juan Carlos Guzmán C. Descripció n: Este program programaa utiliza utiliz a la instrucción STOSB para rellenar relle nar un rea de memoria memori a con el contenido contenido del r egistro AL. En este caso, el área de memoria reservado rese rvado para la varia variable ble Cad1 es rellena rellena da con el carácter ca rácter ASCII '*'. .MODEL tiny .DATA cad1 db 'Cadena 'Cadena de prueba', 13,10,'$' CODE inicio: lea dx,cad1 dx,c ad1 ;Imprimir Cad1 antes de que que sea borrada borrad a mov ah,09h ah,09 h ; int 21h ; cld ;Procesamient ;Procesamient o de izq->d er mov al,'*' al, '*' ;Inicializar AL con co n '*' mov cx,16 cx, 16 ;Longitud de la cadena que se va va a rellenar rellen ar lea di,cad1 di,cad 1 ;ES:DI->Cad1 ;ES :DI->Cad1 rep stosb stos b ;Rellenar 16 bytes de m emoria con '*' lea dx,cad1 dx,c ad1 ; mov ah,09h ah,09 h ;Imprimir Cad1 después des pués de ser borrada borrad a int 21h ; mov ax,4c0 0h ;Termina r programa y regresar regres ar al D OS int 21h ; END inicio END .COMMENT Programa: Programa: Cad5.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este programa programa utiliza la instrucción instrucción CMPSB p ara comparar si dos c adenas adenas son igual igual es. En este programa se declaran 3 cadenas de prueba. El registro BH sirve como bandera: BH=0 No hay cadenas iguales BH=1 Cad1 es es igual ig ual a Cad2 BH=2 Cad1 es es igual ig ual a Cad3 Se puede cambiar el contenido de las cadenas cadenas de prueba para comprobar los tres posibles resultados. resultados. .MODEL tiny .DATA cad1 db 'CADENA1',1 'CADENA1 ',13,10,'$' 3,10,'$' cad2 db 'CADENA1',1 'CADENA1 ',13,10,'$' 3,10,'$' cad3 db 'Cadena2',13,10,'$' error1 db 'No hay cadenas iguales...','$' error2 db 'Cadena 1 = Cadena 2','$' error3 db 'Cadena 1 = Cadena 3','$' .CODE inicio: xor bh,bh ;BH=0
cld ;Comparació ;Comparaciónn de izq ->der. mov cx,7 cx ,7 ;Longitud de la cadena cad ena lea di,cad2 ;ES:DI-> ;ES:DI-> Cad2 lea si,cad1 si, cad1 ;DS:SI-> ;DS:S I-> Cad1 repe cmpsb ;Comparar Cad1 y Cad2 jne otra ;Son iguales ? No, Comparar Comp arar Cad1 Cad 1 y Cad3 Cad 3 mov bh,1 ;Si, entonces BH=1 otra: mov cx,7 cx, 7 ;Longitud de la cadena caden a lea di,cad3 di,cad 3 ;ES:DI->Cad3 ;ES :DI->Cad3 lea si,cad1 ;DS:SI->Cad1 repe cmpsb ;Comparar Cad1 y Cad3 jne salir ;Son iguales ? No, imprimir imprimi r mensajes. mens ajes. mov bh,2 ;Si, entonces BH=2 salir: cmp bh,0 ;Es BH=0? je ninguna ;Si, Entonces no hay cadenas iguales cmp bh,1 ;No. Es BH=1? je cad1_cad2 ;Si. ; Si. Entonces Cad1 es igu al a Cad2 C ad2 lea dx,error3 ;Si no es ninguna de las anteriores mov ah,09h ah,09 h ;entonces debe ser que Cad1 Cad 1 es igual que Cad3 int 21h ;imprimir mensaje jmp salir2 cad1_cad2: lea dx,error2 ; mov ah,09h ah,09 h ;Imprimir m ensaje int 21h ; jmp salir2 ; ninguna: lea dx,error1 ; mov ah,09h ah,09 h ;Imprimir m ensaje int 21h ; salir2: mov ax,4c0 0h ;Termina r programa y regresar regres ar al DOS int 21h ; END inicio END 4. Programación de E/S
Definición Definición de interrupción Una interrupción es un estado en el cual el microprocesador detiene la ejecución de un programa para atender una petición especial solicitada por el propio programa o por un dispositivo físico conectado al microprocesador microprocesador externamente. Las interrupciones fueron creadas para facilitar al programador el acceso a los diferentes dispositivos de la computadora (puertos de comu nicaciones, terminal terminal es, impresoras, etc.). Ejecución de una interrupción Cuando durante la ejecución de un programa se pr oduce oduce una int int errupción, errupción, el microprocesado microprocesadorr realiza los siguientes pasos: 1.- Detiene la ejecución del programa 2.- Almacena los registros CS, IP y Banderas en la pila 3.- Modifica el CS y el IP para que apunten a la dirección donde se encuentra la rutina de interrupción. 4.- Ejecuta las instrucciones de la rutina de interrupción. 5.- Restablece usando la instrucción RETI los valores originales de los registros CS, IP y Banderas. 6.- Continua con la ejec ejec ución del programa en el punto donde fue interrumpido. Las rutin rutinas as se almacenan en la memoria de la computadora comp utadora cada vez que ésta es inicializad a, a esto se le conoce como vector de interrupciones.
Tipos de interrupciones El micro mic ropro procc esador puede atender dos tipos de int errupciones: errupciones: interrupciones interrupciones p or soft soft ware e interrupciones por hardware. Las interrupciones interrupciones por p or soft soft ware son llamadas desde l os programas programas y son proporcionadas proporcionadas por el sis tema operativo (MS-DOS). Existen dos tipos de estas: las interrupciones del DOS y las interrupciones del BIOS BIOS (Basic Input Input O utput utput System Sy stem o Sis tema Básico de Entrada/Salida). Entrada/Salida). Estas Es tas interrupciones interrupciones son invocadas invocadas con la instrucción IN T del ensamblador. Por otro lado, las interrupciones por Hardware son proporcionadas por el propio microprocesador y también existen dos tipos: interrupciones por hardware internas y las interrupciones por hardware externas. externas. Las interrupciones internas internas son s on invocadas por el microproces microprocesador ador cuando se produce alguna operación incorrecta, como por ejemplo, un intento de dividir por cero o una transferencia de datos entre registros registros d e diferentes longitudes. Las interrupciones interrupciones externas s on provocadas po r los dispositiv dispositi vos per p erii féricos féricos conectados conectados al microprocesador. Para lograr esto, a cada dispositivo periférico se le asigna una línea física de interrupción que lo comunica con el microprocesador por medio de un circuito integrado auxiliar, el cual se conoce como controlador programable de interrupciones (PIC). (PIC). Las computadoras basadas en el microprocesa dor 8086/8088 cuentan solamente solame nte con un P IC, IC, con lo cual pueden proporcion ar hasta hast a 8 líneas de interrupción interrupci ón (IRQ), las cuales son llamadas llam adas IRQ0 a IR IR Q7, por otro lado, las computadoras basadas en el microprocesador 80286 y posteriores cuentan con dos chips controladores, con los cuales pueden proporcionar hasta un máximo de 16 líneas IRQ, las cuales son llamadas IRQ0 a IRQ15. La siguiente es una lista de las interrupciones por software disponibles por el sistema operativo. Interrupciones Interrupciones del BIOS Manejo Manejo de dispositi vos peri féricos féricos INT 10H Manejo de la pantall a. INT 13H Manejo de unidades unida des de disco. INT 14H Manejo Manejo de los puertos puertos de comunicaciones(RS2 comunicaciones(RS232). 32). INT 15H Manejo de cinta magnética. magn ética. INT 16H Manejo del teclado. teclad o. INT 17H Manejo de la impresora. imp resora. Manejo Manejo del estado del equi equi po INT 11H Servicios de de l a lista list a de elementos de la computado com putadora. ra. INT 12H Servicios para para el el cálcul o del tamaño de la memoria. memori a. Servicios Servicios d e fec fec ha y hora INT 1AH Manejo del reloj. Impresión Impresión de pantalla INT 5H Impresió Impresiónn de la información inf ormación contenida conte nida en la pantall a. Servicios Servicios especiales INT 18H Activación del lenguaje lenguaj e Int Int erprete Basic de de la ROM. INT 19H Activación de la rutina de arranque arran que de la computadora. comp utadora. Interrupciones Interrupciones del DOS INT 20H Termina la ejecució n de un programa. program a. INT 22H Dirección de terminación. Guarda la dirección dirección donde se trans fiere fiere el control cuando termina la ejecución del programa. INT 23H 23H Dirección Direcc ión de la int int errupción que se ejecuta cuando se presiona Ctrl-B Ctrl -Break. reak. INT 24H Manejo de errores críticos. INT 25H Lectura directa di recta de sectores sect ores del disco. INT 26H Escritura Esc ritura directa de sectores sect ores del disco. INT 27H Terminar un programa y devolver devol ver el el control al DOS sin borrar el programa de la memoria. INT 21H Esta Est a interrupció interrupciónn proporcion a una gran cantidad cantid ad de funciones, funcio nes, las cuales deben ser invocadas en conjunto con el registro AH. 0 Terminación de un programa. 1 Entrada de carácter ca rácter con eco. ec o. 2 Salida a pantall a. 3 Entrada por el puerto serie. se rie. 4 Salida por el puerto pue rto serie.
5 6 7 8 9 10 11 12 13
Salida a la impresora. imp resora. E/S directa por pantall a. Entrada directa direct a de carácter cará cter sin eco. Entrada de carácter ca rácter sin eco. Visualizar cadenas de caracteres. caracteres. Entrada Entrada desde el teclado. Comprobación Comprobación del estado de entrada. Borrar registro de entrada. Inicializar Inicializar unidad de disco.
A contin c ontinuación uación se mostrarán algunos programas q ue utilizan llam llam adas a diferentes interrupciones interrupciones por software tanto del BIOS como del DOS. El siguiente programa utiliza la función 09h de la interrupción 21 del DOS para mostrar en la pantalla un mensaje. .COMMENT * Programa: Int1.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Imprime Imprime una cadena de caracteres en la pantalla por medio de la función 09 h de la interrupción 21h del DOS. * .MODEL tiny .DATA Mensaje db 'Interrupciones 'Interrupci ones 21h del DOS',13, 10,'$' .CODE Inicio: Lea DX,Mensaje Mov Ah,09h Int 21h Mov ax,4C00h Int 21h END Inicio END El siguie s iguiente nte programa programa exhibe dos cadenas de c aracteres aracteres en la pantalla, pero a di ferencia ferencia del a nteri nteri or éste no regresa al DOS DOS inmediatamente, in mediatamente, espera a que cualquier tecla sea presionada y entonces entonces termina, para ello se utiliza la función 10h de la interrupción 16h del BIOS. .COMMENT * Programa: Int2.ASM Autor: Juan Carlos Guzmán C. Descripción: Imprime dos cadenas de caracteres en la pantalla por medio de la función 09h de la interrupción interrupción 21h del D OS y después espera a que una tecla s ea presionada, esto por medio de la interrupción 16h del BIOS con la función 10h. * .MODEL tiny .DATA Mensaje db 'Mas interrupciones inte rrupciones',13,10,' ',13,10,'$' $' Mensaje2 db 'Presione cualquier cual quier tecla...',13,10,'$ tecla.. .',13,10,'$'' .CODE Inicio: Lea DX,Mensaje Mov Ah,09h Int 21h Lea DX,Mensaje2 Mov Ah,09h Int 21h Mov Ah,10h
Int 16h Mov ax,4C00h Int 21h END Inicio END Como último ejemplo de esta sección, se mostrará un programa que utiliza otra función del BIOS, pero esta vez para posicionar posici onar el cursor en di di ferentes ferent es coordenadas de la pantalla, pantall a, esto con el fifi n de de tener mejor control sobre el lugar en el que los mensajes son visualizados. .COMMENT * Programa: Int3.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Imprime Imprime dos cadenas de caracteres caracteres en e n la pantalla, controlando su p osición por medi medi o de la función 02h de la Int 10h del BIOS. * .MODEL tiny .DATA Mensaje db 'Mas interrupciones inte rrupciones',13,10,' ',13,10,'$' $' Mensaje2 db 'Presione cualquier cual quier tecla...','$' tecla.. .','$' .CODE Inicio: Mov Mo v Bh,0 ;Pagina ;Pagi na de vi deo 0 Mov dl,30 dl,3 0 ;X= ;X= 30 Mov dh,5 ;Y=5 Mov Ah,02h Ah,0 2h ;Posicionar ;Posi cionar cursor Int 10h ; Lea DX,Mensaje ; Mov Ah,09h Ah,0 9h ;Imprime M ensaje Int 21h ; Mov Mo v Bh,0 ;Pagina ;Pagi na de vi deo Mov dl,40 dl,4 0 ;X= ;X= 40 Mov dh,24 ;Y=24 ;Y= 24 Mov Ah,02h Ah,0 2h ;Colocar cursor curso r Int 10h ; Lea DX,Mensaje2 ; Mov Ah,09h Ah,0 9h ;Imprimir M ensaje2 Int 21h ; Mov Ah,10h Ah,1 0h ;Espera ;Es perarr tecla Int 16h ; Mov ax,4C00h ax,4 C00h ;Terminar programa prog rama y salir al DOS Int 21h ; END Inicio END 5. Macros
Definición Una de las principales des ventaja ventajass d e la programación en lenguaje ensamblador es la repetición repetición constante de de ciertos grupos de i nstrucciones. nstrucciones. Por ejemplo el siguiente si guiente conjunto de instrucciones instrucciones nos n os permite imprimir una variable de tipo cadena en la pantalla: Lea DX DX,, Cadena ;Direccionar ;Direccionar la cadena Mov AH,09h ;Usar la función 09h para imprimir cadenas Int Int 21h ;llamada a la interrupción interru pción 21h del DOS Si necesitamos que en nuestro programa se muestren mensajes constantemente, constantemente, es obv ob vio que debemos debemos duplicar este conjunto de instrucciones por cada mensaje que se desea e nviar nviar a panta p antalllla. a. El principal principal problema que esto nos ocasiona es que el tamaño de nuestro programa cr ece considerablemente, considerablemente, y mientras mientras más grande sea el p rograma, rograma, más difícil difícil ser s eráá encontrar la causa de al gún error cuando éste ocurra.
La mejor solución en estos casos es el uso de las MACROS. Una macro es un conjunto de instrucciones instrucciones que se agrupan bajo un nombre descriptivo (macroinstrucción) y que sólo es necesario declarar una vez (macrodefinición). Una vez que la macro ha sido declarada, sólo es necesario indicar su nombre en el cuerpo del programa y el ensamblador se encargara de reemplazar la macroinstr ucción por las instrucciones instrucciones de d e la macro (expansión de la macro). El formato general de una macro es el siguiente: .MACRO Nombre Nomb re [(parametro1, [(par ametro1, parametro2, para metro2, etc)] INSTRUCCIONES ENDM Nuevamente, lo que se e ncuentra entre paréntesis paréntesis cuadrados es opcional. De acuerdo con esto, la macro para imprimir cadenas quedaría de la siguiente forma: .MACRO Imprime_Cad(Cadena) Lea DX,Cadena Mov Ah,09h Int 21h ENDM Parámetros y etiquetas Dent Dent ro de las propiedades más importantes de las macros s e deben destacar la posibilidad de utilizar parámetros y etiquetas. Los parámet parámet ros ros permite pe rmitenn que una u na misma macro pueda ser usada b ajo diferentes diferentes condiciones, condiciones, por ejemplo, se puede crear una macro para posicionar el cursor en diferentes coordenadas coordenadas de la pantalla e indicar sus coordenadas por medio de p arámetros. La siguiente macro nos muestra mu estra esta propiedad: ;Esta macro posiciona el cursor en las coordenadas que se le indican como ;parámetros. Es el equivalente al GotoXY de Pascal. .MACRO gotoxy (x,y) xor bh,bh ;Seleccionar ;Selecc ionar página cero de video mov dl,x ;Columna ;Columna mov dh,y ;Renglón mov ah,02h ;Función 02h para posicionar cursor int 10h ;llamada a la int 10h del BIOS ENDM También También existen exist en situaciones en las que los parámetros no son ne cesarios, es por esta esta razón que q ue los parámetros son opcionales en la declaración de la macro. ;Esta macro realiza realiza una p ausa en el programa hasta que una tecla es ;presiona ;presionada. da. Es el equivalente del readkey en Pascal. .MACRO tecla mov ah,10h int 16h ENDM Por otro lado, las etiquetas también son útiles dentro de las macros. Suponga que se desea crear una macro que imprima una cadena un numero n de veces, esta macro podría ser declarada de la siguiente forma: .MACRO Imprime_nCad (Cadena, Cuantos) Mov CX CX,, Cuantos ;Iniciar Contador Lea DX DX,, Cadena ;Direccionar ;Direccion ar la cadena cad ena que se va a imprimir im primir Mov Ah,09h ;Usar la función 09h Otra: Otra: ;Etiqueta interna Int 21h ;Imprimir la Cadena Cad ena n veces Loop Otra ;Siguiente Impresión Impresió n ENDM
Ensamble de macros Como ya se mencionó antes, una macro es declarada una sola vez y puede ser llamada cuantas veces sea necesario dentro del cuerpo del p rograma. rograma. Cada vez que el ensamblador encuentra una macroinstrucción, verifica si ésta fue declarada; si esta verificación verificación es exitosa, el ensambl ensambl ador toma las instrucciones del cuerpo de la macro y las reemplaza reemplaza en el lugar donde la macro fue llamada. El siguie s iguiente nte programa muestra la declaración y uso de las macros: .COMMENT Programa: Programa: Macros1.ASM Macros1.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa muestra el uso de macros. .MODEL TINY ; Declaración de variables .DATA cad db 'Ejemplo del uso de macros...',13,10,' macros ...',13,10,'$' $' cad1 db 'Presiona una tecla...','$' tecla.. .','$' cad2 db 'Ejemplo del uso de la macro gotoxy...','$ gotoxy ...','$'' ;Aquí se declaran las macros. ;************************************************************************ ;-----------------------------------------------------------------------;Esta macro imprime imprime una cadena pasada como c omo parámetro. ;Utiliza la función 09h de la Int 21h del DOS. .MACRO imprime_cad(cadena) lea dx,cadena mov ah,09h int 21h ENDM ;-----------------------------------------------------------------------;Esta macro realiza realiza una p ausa en el programa hasta que una tecla se ;presione. Es el equi equi valente valente del readkey en Pascal. .MACRO tecla mov ah,10h int 16h ENDM ;-----------------------------------------------------------------------;Esta macro posiciona el cursor en las coordenadas que se le indican como ;parámetros. ;parámetros. Es el equivalente equivalente al GotoXY G otoXY de Pascal. .MACRO gotoxy gotoxy (x,y) (x,y ) xor bh,bh mov dl,x mov dh,y mov ah,02h int 10h ENDM ;------------------------------------------------------------;Esta macro limpia la pantalla. ;Utiliza la función 06h de la Int 10h del Bios. .MACRO lim piar_pantalla piar_pantalla mov ax,0600h mov bh,17h mov cx,0000h mov dx,184fh int 10h ENDM ;------------------------------------------------------------;Aquí comienza el cuerpo del programa principal .CODE
inicio: ;Declaración ;Declaración del punto de entrada limpiar_pantalla limpiar_pantalla ;Llamada ;Llamada a la macro gotoxy (0,0) ;Colocar el cursor curso r en 0,0 imprime_cad(cad) imprime_cad(cad) ;Imprime ;Imprime el primer mensaje mensaj e imprime_cad(cad1) imprime_cad(cad1) ;Imprime ;Imprime el segundo mensaje tecla ;Espera a que se presione una tecla gotoxy (30,12) ;Colocar el cursor curso r en 30,12 imprime_cad(cad2) imprime_cad(cad2) ;Imprimir ;Imprimir el tercer mensaje gotoxy (50,24) ;Colocar el cursor curso r en 50,24 imprime_cad(cad1) imprime_cad(cad1) ;Imprimir ;Imprimir el segundo mensaje tecla ;Espera ;Es perarr por una tecla mov ax,4c0 0h ;Fin del programa prog rama y regresar al DOS. int 21h END inicio END Ventajas Ventajas y desventajas Si bien es cierto que las macros proporcionan mayor flexibilidad a la hora de programar, también es cierto que tienen alg unas unas des ventajas. La siguiente es una lista de la principales ventajas y desventajas del uso de las macros. Ventajas: Menor posibilidad de cometer errores por repetición. Mayor flexibilid flexibilidad ad en la program prog ramación ación al p ermitir ermitir el us o de parámetros. Código fuente más compacto. Al ser más pequeño el código fuente, también es más fácil de leer por otros.
Desventajas: El código ejecutable se vuelve más grande con cada llamada a la macro. Las macros macros deben debe n ser bien planeadas para evitar evitar la redundancia r edundancia de código.
6. Programación modular
Definición Definición de procedimientos Un procedimiento es un conjunto de instrucciones que tienen la finalidad de ejecutar una tarea especifica dentro de un programa. Los procedimientos son muy similares a las macros. Un procedimiento se declara una sola vez en el código fuente y cuando el programa se ensambla y ejecuta, el procedimiento se coloca en memoria para que pueda ser utilizado por el programa. Las principales ventajas en el uso de procedimientos son: permiten una codificación más limpia y compacta, es decir el código fuente es más pequeño; también permiten el ahorro de memoria, esto es porque un mismo procedimiento puede ser llamado varias veces en el mismo programa y sólo requiere memoria una vez. Los proc procedim edimientos ientos tienen la des ventaja de que reducen la velocidad de ejecución ej ecución d e los programas, esto se debe a la forma en que los procedimientos se ejecutan. A continuación se presentan los pasos necesarios necesarios para ejecutar un procedimi procedimi ento: ento: 1.- Se encuentra la llamada Call 2.- El microprocesador almacena en la Pila el contenido del IP 3.- Se coloca en el IP el valor del desplazamiento correspondiente al Procedimiento 4.- El microprocesador ejecuta las instrucciones del procedimiento 5.- El procedimiento termina cuando se encuentra la instrucción Ret 6.- Se saca de la pila el valor original del IP y se continua el flujo del programa Un procedimiento se declara de la siguiente forma: PROC nombre instrucción instrucción .... RET RE T ENDP NOMBRE En donde PROC es una palabra reservada que indica el inicio de un procedimiento, RE T es es una instrucción que indica la terminación del conjunto de instrucciones de un procedimiento y finalmente ENDP es la palabra reservada para fin de procedimiento.
Paso de parámetros Los proc procedim edimientos ientos en lenguaje le nguaje ensamblador no c uentan uentan con c on un mecanismo para el paso de parámetros; por lo cual, la única forma de lograr esto es colocando los parámetros que nos interesan en los registros de propósito general antes de que el procedimiento sea ejecutado. El siguie s iguiente nte procedi procedi miento coloca el cursor en las coordenadas establecidas en Dl y Dh. Proc GotoXY xor bh,bh mov ah,02h int 10h Ret Endp GotoXY En este ejempl ejempl o, las coordena coordenadas das XY XY se deben situar en el registro regi stro DX antes de que se llame al procedimiento. Llamada a procedimientos Los procedimientos son llamados por los programas por medio de la instrucción CALL, seguida del nombre del procedimiento. Ejemplo: Call GotoXY El siguiente programa muestra la forma de pasarle parámetros a los procedimientos por medio de los registros registros genera g enerall es. Este E ste programa programa declara tres procedimientos: GotoXY: Col Col oca el cursor en las coordenadas especificadas Limpia_Pant Limpia_Pant alla: Limpia la pantalla Imprime_Cad: Imprime_Cad: Imprime una c adena en la posición actual del cursor .COMMENT * Programa: Programa: Proc2.ASM Autor: Juan Carlos Guzmán C. Descripció n: Este program programaa ilustra la forma de utilizar utiliz ar procedimientos procedimie ntos en los programas por medio de la instrucción Call y la forma forma de pasarles parámetros. .MODEL TINY .DATA Cad1 db 'Esta es una cadena de prueba...',13,10,'$' .CODE INICIO: ;Punto de entrada al programa program a Mov Mo v DL,20 ;X=20 Mov DH,10 ;Y=10 ;Y= 10 Call Gotoxy Gotox y ;GotoXY 20,10 Lea DX,cad1 ;DX->Cad1 Call Imprime_ Cad ;Imprimir Cad1 Cad 1 Mov Ax,04C00h Ax, 04C00h ;Termi ;Terminar nar y regresar al dos Int 21h ; END INICIO ;********************************************************************* ;Procedimiento: GotoXY ;Descripción: ;Descripción: Coloca el cu rsor una posición especi especifica fica de la pantall pantallaa ;Parámetros: ;Parámetros: Dl= X, D h=Y ;********************************************************************* PROC GotoXY Xor Bh,Bh Mov Ah,02h Int 10h Ret ENDP GotoXY ;***********************************************************************
;Procedimiento: ;Procedimiento: Limpia_Pantalla ;Descripción: Imprime una cadena de caracteres en la posición del cursor ;Parámetros: ;Parámetros: La dirección de la cadena c adena en DX ;*********************************************************************** PROC Imprime_Cad Mov Ah,09h Int 21h Ret ENDP Imprime_ Imprime_Cad Cad END Procedimientos internos Los proc procedim edimientos ientos internos son aquellos que se declaran y se llaman llaman dentro del mismo programa, también también so n llamados procedimientos locales. El listado anterior muestra la forma de utilizar procedimientos internos. Procedimientos externos Los procedimientos externos, a diferencia de los internos, se declaran en módulos o programas separados al programa donde el procedimiento es llamado, en otras palabras, la llamada al procedimiento se encuentra en un programa y el procedimiento en otro. Para poder utilizar procedimientos procedimientos exter ext ernos, nos, es necesario necesario que se an decl decl arados arados como públicos p úblicos en el programa donde donde se s e encuentran y que se an llamados como c omo externos externos en el p rograma rograma donde dond e serán usados. Para lograr esto, Pass32 cuenta con tres directivas de ensamble: .PUBLIC para declarar los procedimientos como públicos, .EXTERN para indicar que el procedimiento que se va a usar está fuera del programa programa y .INCLUDE para enlazar el programa que c ontiene ontiene los procedimientos con el p rograma rograma que los llama. El siguie s iguiente nte programa muestra el uso d e las directivas de inclusión. Primeramente, el archivo archivo Proc2.ASM se modificó para que su variable Cad1 fuera declarada como publica, el programa Proc3.ASM contiene la línea .INCLUDE Proc2.ASM, lo cual c ual indica indica al ensamb e nsambll ador que, en caso de que se soliciten datos, etiquetas etiquetas o procedimientos externos, externos, éstos se busquen en el archivo incl uido. uido. Pass32 proporciona grandes facilidades para el manejo de procedimientos; en este caso, solamente Cad1 debe ser declarada como pública, puesto que los procedimientos procedimientos se buscan y anexan anexan automáticamente al programa que los llama si es que existen. .COMMENT * Programa: Programa: Proc3.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa ilustra la forma de utilizar procedimientos y datos externos en los programas por medio de las directivas de inclusión include y public. .MODEL TINY .INCLUDE proc2.ASM proc2.A SM ;Incluir el archivo proc2.asm proc2 .asm ;el cual contiene la variable de cadena ;Cad1 y los procedimientos externos ;usados en este programa. .DATA Cad2 db 'Esta es una cadena de prueba 2...',13,10,'$' .CODE INICIO: ;Punto de entrada al programa Mov Mo v Dl,20 ;X=20 ;X=20 Mov Dh,10 ;Y=10 ;Y= 10 Call Goto XY ;GotoXY 20,10 Lea DX DX,, Cad2 ;DX->Cad2 en Proc3.asm Pr oc3.asm Call Imprime_ Cad ;Imprime Cad2 Lea DX DX,, Cad1 ;DX->Cad1 en Proc2.asm Pr oc2.asm Call Imprime_ Cad ;Imprime Cad1 Mov A X, 04C00h ;Fin del programa Int 21h ; END INICIO END
.COMMENT * Programa: Programa: Proc2.ASM Autor: Juan Carlos Guzmán C. Descripción: Descripción: Este E ste programa programa ilustra la forma forma de utilizar procedimientos en los programas programas por medio de la instrucción Call y la forma de pasarles parámetros. .MODEL TINY .DATA .PUBLIC Cad1 db 'Esta es es una cadena de prueba...',13,10 prueba...',13,10,, '$' .CODE INICIO: ;Punto de entrada al programa program a Mov Mo v DL,20 ;X=20 Mov DH,10 ;Y=10 ;Y= 10 Call Gotoxy Gotox y ;GotoXY 20,10 Lea DX DX,ca ,ca d1 ;DX->C ;DX->Cad1 ad1 Call Imprime_ Cad ;Imprimir Cad1 Cad 1 Mov Ax,04C00h Ax, 04C00h ;Termi ;Terminar nar y regresar al dos Int 21h ; END INICIO ;********************************************************************* ;Procedimiento: GotoXY ;Descripción: ;Descripción: Coloca el cu rsor una posición especi especifica fica de la pantall pantallaa ;Parámetros: ;Parámetros: Dl= X, D h=Y ;********************************************************************* PROC GotoXY Xor Bh,Bh Mov Ah,02h Int 10h Ret ENDP GotoXY ;*********************************************************************** ;Procedimiento: ;Procedimiento: Limpia_Pantalla ;Descripción: Imprime una cadena de caracteres en la posición del cursor ;Parámetros: ;Parámetros: La dirección de la cadena c adena en DX ;*********************************************************************** PROC Imprime_Cad Mov Ah,09h Int 21h Ret ENDP Imprime_ Imprime_Cad Cad END Con estas capacidades, es fácil crear bibliotecas de procedimientos y macros que puedan ser utilizados constantemente constantemente por los demás programas, programas, ahor ah orrando rando con ello tiempo t iempo de programación al reutilizar código fuente. El siguiente programa muestra la forma de escribir una biblioteca de procedimientos y la forma de utilizarlos utilizarlos en los programas. .COMMENT * Programa: Programa: Proc3.ASM Autor: Juan Carlos Guzmán C. Descripción: Este programa ilustra la forma de utilizar procedimientos y datos externos en los programas por medio de las directivas de inclusión include y public. .MODEL TINY .INCLUDE proclib.inc proclib. inc ;Incluir el archi vo proclib.inc procli b.inc ;el cual contiene la variable de cadena ;Cad1 y los procedimientos externos
;usados en este programa. .DATA Cad1 db 'Esta es una cadena de prueba 2...',13,10,'$' Cad2 db 'Presiona una tecla...','$' .CODE INICIO: ;Punto de entrada al programa pro grama Call limpia_Pantalla ; Mov Mo v Dl,20 ;X=2 ;X=200 Mov Mo v Dh,10 ;Y=10 Call Goto XY ;GotoXY 20,10 Lea DX DX,, Cad1 ;DX->Cad1 Call Imprime_ Cad ;Imprime Cad1 Cad 1 Mov Mo v Dl,40 ; Mov Mo v Dh,24 ; Call Goto XY ;GotoXY 40,25 Lea DX DX,, Cad2 ; Call Imprime_ Cad ;Imprime Cad2 Cad 2 Call Espera_Tecla ;Esperar ;Esperar por una tecla presionada Mov A X, 04C00h ;Fin del programa Int 21h ; END INICIO END .COMMENT Biblioteca de Procedimientos Procedimientos e n Lenguaje ensamblador .CODE ;********************************************************************* ;Procedimiento: GotoXY ; Descripción: Coloca el cursor curso r una posición esp especifica ecifica de la pantalla ; Parámetros: Dl=X Dl= X, Dh=Y Dh=Y ;********************************************************************* PROC GotoXY Xor Bh,Bh Mov Ah,02h Int 10h Ret ENDP GotoXY ;*********************************************************************** ;Procedimiento: ;Procedimiento: Imprime_ Imprime_Cad Cad ; Descripción: Imprime Imprime una cadena de caracteres ca racteres en la posic posición ión del cursor curso r ; Parámetros: La dirección di rección de la cadena en DX ;*********************************************************************** PROC Imprime_Cad Int 21h Ret ENDP Imprime_ Imprime_Cad Cad ;********************************************************************** ;Procedimiento: ;Procedimiento: Limpia_Pantalla ; Descripción: Descripción: Limpia Limpia la pantalla de la comput comput adora y coloca el cursor cursor ; en 0,0. ; Parámetros: Parámetros: Ninguno Ningun o ;********************************************************************** PROC Limpia_Pantalla mov ax,0600h mov bh,17h mov cx,0000h mov dx,184fh int 10h Mov dx,0000h Call Got Got oxy
Ret ENDP Limpia_P Limpia_P antalla antalla ;********************************************************************** ;Procedimiento: ;Procedimiento: Espera_Tecla ; Descripción: Detiene la ejecución ejec ución de un un programa hasta que se presiona presio na ; una tecla ; Parámetros: Ninguno Ningun o ;********************************************************************** PROC Espera_Tecla mov ah,10h int 16h Ret ENDP Espera_Tecla 7. Programación híbrida
Pascal y ensamblador ensamblador Como ya se mencionó, la programación en lenguaje ensamblador proporciona un mayor control sobre el hardware de la computadora, pero tambi tambi én dificulta la buena estructu estructura ración ción de los programas. La programación programación híbrida h íbrida proporciona proporciona un m ecanismo ecanismo por medio d el c ual podem podem os aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin escribir programas más rápidos y eficientes. En esta sección se mostrará mostrará la forma forma para crear programas híbridos híbrid os utilizando el lenguaje ensambla dor y Turbo Pascal. Turbo Pascal permite escribir procedimientos y funciones en código ensamblador e incluirlas como parte de los programas programas e n lenguaj lenguaj e Pascal; para esto, Turbo Pascal cuenta con dos palab ras reser reser vadas: vadas: Assembler y Asm. Assembler permite indicarle a Turbo Pascal que la rutina o procedimiento que se está escribiendo está totalmente totalmente escrita en código ensamblador. Ejemplo de un p rocedimie rocedimiento nto híbri híbri do: Procedure Limpia_Pantalla; Limpia_Pantalla; Assembler; Asm Mov AX, AX, 0600h Mov BH,18h Mov CX,0000h Mov DX,184Fh Int 10h End; El procedimiento del listado 23 utiliza la función 06h de la Int 10h del BIOS para limpiar la pantalla, este procedimiento es análogo al procedimiento ClrScr de la unidad CRT de Turbo Pascal. Por otro otro lado l ado,, Asm As m nos permite incluir bloques de instr ucciones ucciones en l enguaj enguaj e ensamblador en cualquier parte del programa sin necesidad de escribir procedimientos completos en ensamblador. Ejemplo de un programa con un bloque de instrucciones en e nsambl nsambl ador: { Este programa programa muestra como se construye un programa prog rama híbrido utilizando utilizando un bloque bloque Asm... End; en Turbo Turbo Pascal. El programa programa solicita s olicita que se introduzca introduzcann dos número, después calcula la suma por medio de la instrucción Add de ensamblador y finalmente imprime el resultado en la pantalla. } Program hibrido; Uses Crt; Var N1,N2,Res : integer; Begin Writeln("Introduce Writeln("Introduce un núm ero: "); Readln(N1); Writeln("Introduce Writeln("Introduce un núm ero: "); Readln(N2); Asm
Mov AX,N1; Add AX,N2; Mov Res,AX End; Writeln("El resultado de la suma es: ",Res); Readln; End. El programa del listado 24 realiza la suma de dos cantidades enteras (N1 y N2) introducidas previamente por el usuario, después almacena el resultado en la variable Res y finalmente presenta el resultado en la pantalla. El lenguaje ensamblador no cuenta con funciones funciones de entrada y salida formateada, formateada, por lo c ual es muy complicado escribir programas que sean interactivos, es decir, programas que soliciten información o datos datos al usuario. Es aquí donde podemos explotar la facilidad de la programación híbrida, e n el programa anteri anteri or se utilizan las funciones Readl n y Writeln para obtener obtener y presentar presentar información al usuario usuario y dejamos los cálculos para las rutinas en e nsamblador. En el siguiente listado nos muestra la forma de escribir program program as completos completos utilizando utilizan do procedimientos híbridos. {Este programa programa solicita al usuario que presione alguna tecla, cuando la tecla es presionada, ésta se utiliza para rellenar la pantalla. El programa termina cuando se presiona la tecla enter. El programa utiliza tres procedimientos: Limpia_Pant Limpia_Pant alla: Este se s e encarga encarga de b orrar la pantalla Curs Curs or_XY: or_XY: Este E ste procedimiento reemplaza reemplaza al GotoXY de Pascal Imprime_Car: Imprime_Car: Este procedimiento imprime imprime en pantalla el carácter que se le pasa como parámetro. } Program Program Hibrido2; Hi brido2; Uses Crt; Var Car: Char; i,j : integer; {Este procedimiento procedimiento limpia la pa ntalla y pone blanco sobre azul} Procedure Limpia_Pantalla; Limpia_Pantalla; Assembler; Asm Mov AX,0600h Mov Bh,17h Mov CX,0000h Mov DX,184Fh Int 10h End; {Este procedimiento procedimiento imprime el c arácter en la pantalla} Procedure Imprime_Car(C: Char) Cha r);; Assembler; Asm Mov Ah,02h Mov Dl,C Int 21h End; {Este procedimiento procedimiento tiene la misma funció n que el procedimiento GotoXY de Turbo Pascal} Pasc al} Procedure Cursor_XY Cursor_XY (X,Y: Byte); By te); Assembler; Asm Mov Ah,02h Mov Bh,00h Mov Dh,Y Mov Dl,X Int 10h End; Begin Limpia_Pantalla;
Repeat Limpia_Pantalla; Cursor_XY(0,0); Write('Introduce un carácter: '); Car:=ReadKey; Imprime_Car(Car); Limpia_Pantalla; If car <> #13 then Begin For i:=0 to 24 do For j:=0 to 79 do Begin Cursor_XY(j,i); Imprime_Car(Car); End; Cursor_XY(30,24); Write('Presiona enter para salir u otro para seguir...'); Readln; Until car = #13; End. 8. Conclusión
Tal vez no sea el lenguaje de programación más sencillo de aprender, pero el lenguaje ensamblador es y segu s eguirá irá siendo una de las herramientas herramientas de programación más utilizadas por todas aquellas aquellas personas pe rsonas que desean tener un mayor grado de c omprensión omprensión sobre el funcionamiento a nivel de dispositivo de una computadora computadora personal. El lenguaje ensamblador no está relegado únicamente a computadoras antiguas con sistemas operati operativo voss en modo texto como c omo el MS-DOS. Existe Ex iste en la actualidad una gran cantidad de programas ensambladores ensambladores que nos permit permiten en programar programar en e n ambientes o perativos gráficos gráficos como Windows 95/ 98, Windows NT y Linux, y una muestra de ello es el ensamblador que se utilizó para probar los programas de ejemplo de este trabajo. Por lo tanto, si alguien piensa que el lenguaje ens amblador amblad or ya pasó de moda, tal vez deber ía reconsiderar su postura y visitar algunas de las páginas en Internet que se dedican a cubrir temas sobre programación en lenguaje ensamblador y que se actualizan diariamente, tal vez lo que descubra le haga cambiar de opinión. 9. Bibliografía
Abel, P.; Lenguaje Ensamblador para IBM PC y C ompati ompatibles; bles; Ed. Prentice Hall; Hall; 3ª 3 ª Edición; 1996. Brey, B.; Los microprocesadores de Intel: Arquitectura, Programación e Interfaces; Ed. Prentice Hall; 3ª Edición; 1995. Caballar, J.; El libro de las las comunicaciones c omunicaciones del PC: técnica, programación y aplicaciones; E d. RamaComputec; 1ª Edición; 1997. Morgan y Waite; Introducción al microprocesador 8086/8088; Ed. Byte Books/Mc Graw Hill; 1ª Edición; 1992. Pawelczak; Pass32 32 bit Assembler V 2.5 Instruction Manual; 1997. Rojas, Rojas, A.; A .; Ensamblador Básico; Ed. Computec; Computec; 2 ª Edición; Edición; 1995. Socha y Norton; Assembly Language for the PC; Ed. B rady rady Publishing; 3ª 3 ª Edición; Edición; 1992. 1 992. Tannenbaum, A.; Organización Organización de Computadoras un enfoque estruct urado; Ed. Prentice Hall; 3ª Edición; 1992. Páginas en Internet con información relacionada NASM Home Page: Esta página contiene información sobre la programación en lenguaje ensamblador y una gran cantidad de enlaces enlaces hacia otras pági pági nas con temas relacio nados. http://www.cryogen.com/Nasm Pass32 Home Page: Esta página contiene la información más reciente sobre el desarrollo y nuevas versiones del ensamblador ensamblador Pass32 http://www.geocities.com/SiliconValley/Bay/3437/index.html
Trabajo Trabajo env e nviad iadoo por: Ing. Juan Carlos Guzmán C. [email protected]