You are on page 1of 198

Lenguaje Ensamblador

Unidad Temas 1 Fundamentos. Subtemas 1.1 Introduccin. 1.1.1 Uso y aplicaciones del lenguaje ensamblador. 1.1.2 Escalabilidad de los microprocesadores. 1.1.3 Tipos de lenguajes ensambladores. 1.1.4 Clasificacin de Memorias. 1.1.5 Unidades de entrada / salida. 1.2 El microprocesador. 1.2.1 Buses. 1.2.2 Registros. 1.2.3 Modos de direccionamiento. 1.3 Interrupciones. 1.3.1 Hardware. 1.3.2 Software. 1.4 Estructura de un programa en ensamblador. 1.4.1 Data segment. 1.4.2 Snack segment. 1.4.3 Code segment. 1.4.4 Instrucciones del programa. 1.4.5 Directivas. 1.5 Procedimiento de ensamble, enlace y ejecucin. 1.6 Entorno de programacin. 2.1 Instrucciones lineales. 2.1.1 Movimiento. 2.1.2 Pila. 2.1.3 Matemticos. 2.1.4 Ajustes. 2.1.5 Comparacin. 2.2 Saltos. 2.2.1 Incondicional. 2.2.2 Condicional. 2.3 Tipos de ciclos. 2.4 Operadores Lgicos. 2.5 Desplazamiento. 2.5.1 Lineal. 2.5.2 Circular. 2.6 Procesos de control. 2.6.1 Banderas. 2.6.2 Cadenas. 2.6.3 Carga. 3.1 Macros.

Elementos del lenguaje

Modularizacin

Programacin hbrida.

3.1.1 Internas. 3.1.2 Externas. 3.2 Procedimientos. 3.2.1 Internos. 3.2.2 Externos. 4.1 Directivas para compilacin hbrida. 4.2 Funciones en ensamblador. 4.3 Bloques en ensamblador. 4.4 Operadores. 4.5 Integrar mdulos de ensamblador en lenguajes de alto nivel.

Unidad1. Fundamentos.
1.1 Introduccin. 1.1.1 Uso y aplicaciones del lenguaje ensamblador.
Importancia del Estudio y Uso de Ensamblador Ayuda a conocer a detalle cmo trabaja un CPU Util para Electrnica y Sistemas Desarrolla Habilidades de Programacin Avanzada Mejores Oportunidades de Empleo en la Industria Aplicaciones del Lenguaje Ensamblador Sistemas embebidos:impresoras, cmaras, autos, armas, juguetes, etc. Tiempo Real: en la industria y manufactura, e.g. adquisicin datos, control robots Transporte: barcos, aviones, sondas espaciales, etc. Entretenimiento: Graficacin, Multimedia, Cine y VideoJuegos DSP: Procesamiento de Seales, Voz e Imgenes Otras: Medicina, Aeronatica, Armamento, etc.

Uso de lenguaje ensamblador


Hay algn debate encima de la utilidad del lenguaje ensamblador. En muchos casos, compiladores modernos pueden rendir lenguajes de alto nivel en el cdigo como eso corre tan rpido como la mano que escribe en ensamblador. Sin embargo, algunos clculos discretos aun pueden darse mas rpidamente corriendo cdigo en ensamblador, y alguna programacin de bajo nivel es simplemente mas fcil de hacer en ensamblador. Algunas tareas de sistemas-dependientes realizadas por sistemas operativos simplemente no pueden ser expresadas en lenguajes de alto nivel. Muchos compiladores tambin rinden lenguajes de alto nivel en ensamblador antes de compilar completamente, permitiendo visualizar el cdigo de ensamblador para depurar [debug] y propsito de optimizacin.

Muchos dispositivos integrados son tambin programados en ensamblador a exprimir la funcionalidad mxima absoluta fuera de los que es frecuente recursos computacionales muy limitados, aunque esto esta gradualmente cambiando en algunas reas como mas chips poderosos volviendo disponible para el mismo mnimo costo. http://www.geocities.com/SiliconValley/Haven/2037/documentos/Lenguaje_Ensamblador.htm

1.1.2

Escalabilidad de los microprocesadores.

Al escribir un programa para ser ejecutado por un microprocesador se tienen tres alternativas: lenguaje de mquina, lenguaje ensamblador y lenguaje de alto nivel. Slo programas escritos en lenguaje mquina pueden ser ejecutados por el procesador. Los programas escritos en lenguaje ensamblador o en lenguaje de alto nivel tienen que ser traducidos primeramente a lenguaje mquina a fin de que puedan ser ejecutados. Escribir un programa en lenguaje ensamblador requiere de conocimientos acerca del hardware de la computadora, su conjunto de instrucciones, de sus reglas y usos. Un estudio de programacin en lenguaje ensamblador puede ser una de las tareas personalmente ms remuneradas y tcnicamente ms desafiantes que puedan emprender un ingeniero de software. El ensamblador bsico es la puerta interior de la PC, el principio de lo que se puede realizar con el lenguaje ensamblador, se encuentra especialmente diseado para proporcionar las bases terico - prctico que le permitirn ms adelante programar el hardware (vdeo, teclado, discos, puertos, etc.) reconocer y utilizar las memoria del BIOS (Sistema Bsico de Entrada y Salida), aprovechar las estructuras internas del DOS (Sistema Operativo en Disco), y afirmar y dominar el uso de debugueando codeview y mucho ms. El disponer de herramientas y conocimientos para combinar sabiamente los lenguajes de alto nivel en diversas configuraciones del hardware le convierten en el maestro de la mquina, el lenguaje ensamblador ser un segundo lenguaje ms potente ya que da al programador acceso directo a registro a memoria y a la nicas instrucciones orientadas al bit, y es con frecuencia la nica solucin a las tareas de programacin que prolonga el alcance de la mayora de los lenguajes de alto nivel. Un programa en lenguaje ensamblador producen un cdigo ejecutable de forma ms rpida ya que circunvala el paso de interpretar el lenguaje y el paso de compilar el lenguaje. Un programa en lenguaje ensamblador controla al microprocesador en su propio lenguaje sin la ayuda de comprobaciones del compilador.

HISTORIA DE LOS MICROPROCESADORES.


1971, Intel anunci el primer microprocesador denominado 1001. Este era de 4 bits, construido con tecnologa PMOS. Tena 45 instrucciones, y ejecutaba 60,000 operaciones por segundo. 1972, Intel introdujo el microprocesador 8008, con longitud de palabra de 8 bits; implantado con tecnologa PMOS. Tena 48 instrucciones, ejecutaba 30,000 operaciones por segundo y direccionaba 16 K bytes de memoria. Requera casi de 20 circuitos de soporte. El microprocesador contenan compuertas SSI (Small Scale Integration) y MSI (Medium Scale Integration). 1974, Intel crea el microprocesador 8080, de 8 bits. El 8080 tena 78 instrucciones, con una velocidad de operacin diez veces mayor que la del 8008 y direcionaba hasta 64 Kbytes de memoria. La tecnologa de fabricacin usada fue la NMOS y gran parte de la lgica de soporte se incluyo en el mismo circuito de microprocesador; por lo que fue posible construir un sistema con slo seis circuitos integrados. 1974, Motorola crea un microprocesador de 8 bits con 72 instrucciones, el 6800. Al mismo tiempo apareci una familia de circuitos perifrico diseados especialmente para conectarse al microprocesador. 1975, Mostechnology anuncio dos microprocesadores, el 6501 que era compatible pata a pata con el 6800 y el 6202, cuyo circuito integrado inclua, adems de un 6501, toda la circuitera para generar la seal de reloj. Hasta entonces, la seal de reloj se haba generado en circuitos externos al microprocesador. 1976, Zilog introdujo el Z-80, un microprocesador NMOS de 8 bits, requera una fuente de alimentacin de 5 volts y toda la circuteria de soporte estaba incluida en el circuito integrado. Contena 158 instrucciones. Junto con el microprocesador Z-80 (Z80 CPU) Zilog introdujo varios circuitos perifricos, tales como el controlador de puertos en paralelos (Z80 PIO), el controlador de puertos en serie (Z80 SIO) y el circuito timer/contador (Z80 CTC). 1977, Intel anunci el microprocesador 8085, con longitud de palabra de 8 bits, este combinaba el 8080, el circuito de reloj y el controlador del sistema en un solo circuito integrado. Fabricado con tecnologa NMOS, y requera un voltaje nico de 5 volts. El 8085 se optimizo para que pudiera formar un sistema completo utilizando dos circuitos perifricos especial, uno de ellos con memoria RAM, puertos de Entradas y Salida y timer (8155 u 8156) y el otro con memoria ROM o EPROM y puertos (8355 u 8755). 1978, nace la tercera generacin de microprocesadores cuando Intel desarrolla el 8086. Este fue un diseo ms avanzado con caractersticas nuevas. Adems Intel desarrollo el microprocesador 8088 como una variacin al 8086. Casi al mismo tiempo apareci un primo del 8088/808; la pastilla del coprocesador matemtico de nmeros reales 8087. Este procesador de datos numricos estaba dedicado a alta velocidad y clculos matemticos de alta precisin. En 1984 se desarrolla el microprocesador 8086, este es compatible con el 8088/8086, soportaba diferentes tipos de datos muy potentes como cadenas BCD y formatos en puntos flotantes. Posteriormente se introdujo el 80186, una versin altamente integrada del 8086, es un microprocesador de 16 bits.

El 80286, es una versin mejorada del 8086, que contiene una unidad de administracin de memoria y direcciona a una memoria de 18 Mbytes. Adems la velocidad del reloj fue aumentada. Otro ingreso de Intel es el 80386, con un bus de datos externos de 32 bits del 80386, doble que el del 80286, puede direcionar 4 gigabytes de memoria. Uno de los ltimos desarrollos de Intel, es el procesador Pentium II, que es el procesador ms potente de la familia X86, estos cuentan con una velocidad de 233, 266 y 300 Mhz. Aadido con tecnologa MMX y un cach LI de 32 K, y est compuesta por 12 sistemas MMX a 200 Mhz de II fabricantes. Cada sistema tiene por lo menos 32 MB en RAM, un disco de 2GB o superior, una unidad de CD-ROM 6X o ms rpido, un sistema de sonido de 16 bits y una tarjeta grfica super VGA.

1.1.3

Tipos de lenguajes ensambladores.

Este lenguaje da la facilidad y las herramientas necesarias para tomar el control de todo lo que la PC puede realizar fsicamente. Como resultado de operaciones muy bsicas suministradas por el ensamblador que realiza tareas simples de transferencia de datos y operaciones lgicas, una pgina de cdigos en lenguaje ensamblador palidece en comparacion con una pgina de cdigo en lenguaje de alto nivel. Hablar del lenguaje mquina requiere comprender muchos conceptos extraos para los programadores de alto nivel, el programador de lenguaje ensamblador debe considerar la segmentacin de memoria; cuando hay control directo del acceso de memoria deben ser tomadas decisiones al minuto, se debe decidir el tamao y tipo de cada dato, muchas de estas consideraciones son nicas a la programacin en lenguaje ensamblador.

ENSAMBLADOR.
Un ensamblador es un software que traduce un programa en memoria escrito en mnemnicos por el usuario, a lenguaje mquina que pueda ser ejecutado por el microprocesador. Al programa en mnemnicos se le llama PROGRAMA FUENTE y al programa en lenguaje mquina se le denomina PROGRAMA OBJETO. Por lo tanto, la entrada al ensamblador es un programa fuente y la salida es un programa objeto.

FUNCIONES DEL ENSAMBLADOR.


A dems de su tarea principal que es traducir mnemnicos a lenguaje mquina, un ensamblador generalmente realiza las siguientes funciones:
o

o o o o

Permite al usuario asignar nombres a localidades de memoria, constantes numricas, dispositivo de E/S y una secuencia de instrucciones. Acepta datos o direcciones en varios sistemas numricos (decimal y hexadecimal) y las convierte en binario. Ejecuta algunas operaciones aritmticas en expresiones como parte del proceso de ensamblador. Permite al usuario designar las reas de memoria donde ser colocados el programa a los datos en el momento de ejecucin. Proporciona la informacin requerida para incluir otros programas o subrutinas de biblioteca dentro del programa que s esta realizando. Permite al usuario controlar el formato del listado del programa resultante del ensamblador.

El lenguaje ensamblador utiliza mnemnicos para representar los cdigos de operacin de las instrucciones y smbolos alfanumricos para representar las direcciones y los datos del programa. Entonces el programa se puede escribir como: MOV AX, (150) MOV BX, AX

MOV AX, (151) ADD AX, BX MOV (152), AX Las direcciones y los datos del programa anterior se expresaron directamente en hexadecimal. A continuacin se muestra el mismo programa utilizando todas las propiedades del lenguaje ensamblador. MOV AX, NUM1 MOV BX, AX MOV AX, NUM2 ADD AX, B MOV SUMA, AX La ventaja de utilizar nombres simblicos en las instrucciones, en lugar de su valor numrico, es facilitar la escritura del programa, y tambin simplifica la insercin y eliminacin de instrucciones, haciendo ms fcil el redireccionamiento. La desventaja de un programa en lenguaje ensamblador, es que requiere un programa especial llamado ENSAMBLADOR, que se encarga de traducir los mnemnicos y los smbolos alfanumricos a lenguaje mquina. Adems sigue siendo necesario un conocimiento detallado de la arquitectura del microprocesador. El lenguaje ensamblador es una variante legible para el ser humano del lenguaje mquina que usan las computadoras para ejecutar programa. Al mismo tiempo la mejor manera de comunicarse con la PC y con el lenguaje mquina de programacin que utilice. El lenguaje ensamblador resulta indispensable cuando se desea escribir programas que controlen las E/S de la PC, agregar nuevas interfaces de E/S, escribir rutinas que aprovechen y maximicen el uso del hardware y en general realizar cualquier tarea que no pueden llevar acabo los dems lenguajes de programacin. El lenguaje ensamblador le brinda la oportunidad de conocer ms afondo la operacin de su PC esto le permite implementar software o hardware de una manera ms consiente. El lenguaje ensamblador hace que se conserve el control total de lo que desea hacer su PC. Una de las mayores importancias del ensamblador es que uno puede optimizar al mximo sus programas (tanto tamao, como velocidad de ejecucin). Otra importancia es la gran velocidad a la que ejecuta el cdigo. El lenguaje ensamblador permite a los ingenieros de software hacer interfaces con el sistema operativo y les da control directo de las operaciones de entrada y salida a monitores, impresoras, y a los importantes dispositivos de memoria de disco duro/flotante. Los programadores de aplicaciones con frecuencia tienen que hacer tambin interfaces directamente con el sistema operativo. Estas rutinas se escriben en lenguaje ensamblador.

El lenguaje ensamblador es simplemente una representacin simblica del lenguaje mquina asociado, lo cual permite una programacin menos tediosa que con el anterior. Sin embargo es necesario un conocimiento de la arquitectura mecnica subyacente para realizar una programacin efectiva en cualquiera de estos niveles de lenguaje. La mayora de los ensambladores son ENSAMBLADORES DE DOS ETAPAS (two-pass Asemblers). La PRIMERA ETAPA determina la direccin de memoria en la cual es ensamblado el primer byte de cada instruccin y genera una tabla para los valores de todos los nombres simblicos y etiquetas definidos en el programa. El ensamblador posee una tabla de cdigos de operacincon una entrada por cada cdigo de operacin, cada entrada contiene el mnemnico de la instruccin, su equivalente en lenguaje mquina y el nmero de bytes de la intruccin. Tambin el ensamblador tiene un Contador de localizacin (Location Counter, LC), el cul al inicio se carga con 0 con el valor especificado por una directiva ORG, sta corresponde a la direccin inicial u origen del programa y se le asigna el primer byte de la primera instruccin. Si un programa tiene una etiqueta, esta se aade a la tabla de smbolos y se le asocia el valor conteniendo del LC en ese momento. El cdigo de operacin de la instruccin se extrae de la tabla de cdigo de operacin incrementando el contador de localizacin igual al nmero de bytes de la instruccin. Esta etapa termina cuando el ensamblador detecta la directiva END. En la SEGUNDA ETAPA, el ensamblador hace un recorrido por el programa, utilizando la tabla de smbolos de los cdigos de operacin, sustituye el mnemnico de cada instruccin por su equivalente en el lenguaje de mquina.

1.1.4

Clasificacin de Memorias.

Las terminales de entrada/salida de un procesador proporcionan un modo eficiente de comunicacin entre el sistema central y el ambiente exterior. Los programas y los datos, deben entrarse al computador para el procesamiento y los resultados deben registrarse o exhibirse para el usuario. Para que esto suceda, la informacin pasa a travs de la memoria central.

MEMORIA CENTRAL

Tambin denominada memoria principal, es la parte de la CPU de una computadora donde estn almacenadas las instrucciones y los datos necesarios para que un determinado proceso pueda ser realizado. La memoria central est constituida por multitud de celdas o posiciones de memoria, numeradas de forma consecutiva, capaz de retener mientras la computadora esta conectada. La memoria es el centro de actividad, el lugar en donde todo se mantiene cuando se est trabajando. La memoria proporciona un lugar donde pueden realizarse los clculos, para la memoria de la computadora no hay diferencia entre programas y datos, ambos son informacin que debe ser registrada, almacenada o manipulada. Esta memoria consiste en una serie de microcircuitos que sirven de soporte generalmente transitorio de la informacin. Sus caractersticas principales son:

Gran rapidez. Componentes fijos. Capacidad mediana. Reutilizable y de acceso directo.

Su velocidad de proceso se mide en microsegundos (millonsima de segundo), nanosegundo (milmillonsima de segundo) e incluso picosegundos (billonsima de segundo). Es una memoria de acceso directo, puede accederse a una de sus celdas con slo conocer su posicin, para esta memoria el tiempo de acceso es ms corto que las memorias auxiliares, por tanto, los datos que manejan los procesos deben residir en ella en el momento de su ejecucin. La memoria central tiene asociados 2 registros para la realizacin de operaciones de lectura o escritura y un dispositivo encargado de seleccionar una celda de memoria en cada operacin de acceso sobre la misma. REGISTRO DE DIRECCIN DE MEMORIA (RDM). Contiene la direccin de memoria donde se encuentra o va a ser almacenada la informacin (instruccin o dato), tanto si se trata de una lectura como de una escritura. REGISTRO DE INTERCAMBIO DE MEMORIA (RIM). Si se trata de una operacin de lectura, el RIM es quin recibe el dato de la memoria sealado por el RDM, para su posterior envo a uno de los registros de la Unidad Aritmtica y Lgica. Si se trata de una operacin de escritura, la operacin a grabar tiene que estar en el RIM, para que desde el se transfiera a la posicin de memoria indicada por el RDM. SELECTOR DE MEMORIA (SM). Es el registro que tras una orden de lectura o escritura conecta la celda de memoria cuya direccin figura en el RDM con el RIM, posibilitando la transferencia de los datos en un sentido o en otro.

La Memoria Central suele ser direccionable por octeto o Byte, por tanto; una celda o posicin de memoria contiene 8 bits. Una de las caractersticas fundamentales de una computadora es su Capacidad de Memoria Interna (Memoria Central), la cual se mide en un mltiplo del Byte denominado Kilobyte, Kbyte, KB O k, y que equivale a 1024 bytes (1024 = 210). Otro mltiplo utilizado ampliamente en los ltimos tiempos es le Megabyte o mega que equivale a 1024 * 1024 Bytes. Las computadoras utilizan 2 tipos de memoria interna: 1. MEMORIA DE SOLO LECTURA (READ ONLY MEMORY: ROM). Esta almacena ciertos programas e informacin que necesita la computadora. Estas instrucciones estn grabadas permanentemente en el chip de ROM y no pueden ser modificados por el operador, por eso es de slo lectura. Se conocen tambin como memoria No Voltil por que no desaparece o se borra cuando se desconecta la electricidad. Las instrucciones bsicas que se necesitan para arrancar una computadora estn almacenadas en ROM. Algunos programas de utilera y paquetes de software tambin lo estn. Las posiciones altas de la memoria superior son:

ROMBIOS ROM DE INICIO ROM EXTENDIDA

Existen otras variedades que permiten algunas manipulaciones: PROM: Permite programarse una sola vez, una vez decididas sus caractersticas e instalada, se convierte en una ROM normal.

EPROM: Puede borrarse y reprogramarse varias veces, para ello se necesitan tcnicas especiales de borrado y escritura.

2. MEMORIA DE ACCESO ALEATORIO (RANDOM ACCESS MEMORY: RAM). Aqu tambin podemos almacenar ciertos programas para el funcionamiento de la computadora. Sin embargo, en RAM el usuario puede cambiar la informacin, almacenarla o borrarla. La capacidad de la RAM afecta la forma en que se corren los programas del software y la cantidad de datos que pueden procesarse. Cuando ms fcil de usar sea un programa tanta ms RAM necesitar generalmente. La RAM es una memoria voltil, a menos que se guarden en discos, se pierde cuando la computadora se desconecta excepto en algunos que estn provistos de pilas especiales para mantener el contenido de la RAM. Cuando se crea un programa o un documento de aplicacin, el programa que carga y los datos que se introducen mediante el teclado son almacenados en forma temporal en la RAM. El trmino aleatorio proviene de la forma en que la computadora localiza o da acceso a los datos que se encuentran en la

memoria. Si se pasa por todos los datos para encontrar alguna informacin deseada, esto es acceso secuencial. Si se brinca todos los datos y selecciona directamente la informacin deseada, sin pasar por los otros datos, a esto se le llama Acceso Aleatorio o Directo. La RAM es un dispositivo de estado slido que no tiene partes en movimiento. Se puede tener acceso a los datos de la RAM a velocidades electrnicos comparables a la velocidad de la luz. A la memoria RAM tambin se le llama memoria principal y es un almacenamiento temporal. Todos los programas y datos introducidos a un dispositivo de entrada (teclado) o a una memoria magntica (disco) se debe transferir a la RAM antes que se puedan ejecutar los programas o procesar los datos. La capacidad en RAM se define en funcin del nmero de caracteres que puede almacenar.

Memoria Convencional. Se le denomina as a la RAM comprendida entre los 0 y 60 KB. Memoria Superior. Se le llama as al resto de la memoria RAM hasta 1 MB, es decir al espacio comprendido entre los 640 y 1.024 B, es decir a los 384 KB. Memoria Extendida. Es la superior a 1 MB, que llegar a los 16 MB, en los 286 (AT) y a4.096 MB o 4 GB, en los 386 y 486.

Estas dos ltimas clases de memorias RAM se subdividen en otros tipos:

Memoria Expandida, Shadow y de Vdeo (la superior) y en memoria alta (extendida), dependiendo del tipo de procesador.

Cada memoria est formada por bloques de octetos consecutivos, de tamao de 16 bytes o un mltiplo de ese nmero (16, 32, 48, 64 octetos, etc.). SALIDA. Son los dispositivos cuya misin es la de recoger y proporcionar al exterior los datos de salida de cada uno de los trabajos que se realicen en el sistema. Tambin se denominan Perifricos o Unidades de Salida. La computadora comunica sus resultados al usuario; por ejemplo, Desplegando la informacin en un monitor o imprimindola. Estos dispositivos incluyen:

Monitores Impresoras Plotters Graficadores

ENTRADA.

Son los dispositivos perifricos que permiten introducir la informacin a la computadora para su procesamiento. Algunos de estos dispositivos son: Teclado Mouse Tabletas grficas Lpiz ptico Entrada de Voz Pantallas sensibles al tacto Lectores pticos

ENTRADA/SALIDA Son dispositivos que efectan tanto tareas de entrada como de salida, estos incluyen:

Discos duros CDs Discos flexibles

1.1.5Unidades de entrada / salida.

que se conectan a la computadora central CPU-Mem, e.g. ratn, monitor, disco-duro, CD, etc. Interfaz: Es el medio que permite conectar un perifrico a la computadora, e.g. conector, puerto, tarjeta, etc. Existen diferentes tipos de interfaces: Puerto Paralelo (LPT): cable corto, grueso que transmite arriba de 16 bits, e.g. impresora, discos externos, etc. Puerto Serie (COM): cable largo, delgado que transmite 1 bit, e.g. mouse, teclado, modem, etc. Puertos USB, FireWire: tecnologa veloces y compactas que posiblemente reemplacen al cable serie/paralelo

Perifricos: Unidades o dispositivos externos

Interfaz IDE, SCSI, PCI, EISA: interfaces de bajo nivel para conectar tarjetas y dispositivos internos, e.g. discos duros, CD, video, etc.

http://pantera.itchihuahua.edu.mx/apacheco/expo/view. php?f=asm_11#page9 1.2 El microprocesador.


Un microprocesador debe contener al menos: una unidad de control, unidad de aritmtica y lgica y algunos registros.

Los componentes internos de un microprocesador son: a) REGISTROS GENERALES b) REGISTROS APUNTADORES (ESP Y EBP). c) REGISTROS INDICES (ESI Y EDI). d) REGISTRO DE SEGMENTOS (SS, CS, DS, ES.) e) REGISTRO APUNTADOR DE INSTRUCCIONES (IP). f) REGISTRO DE ESTADO (BANDERAS) g) COLA DE INSTRUCCIONES h) UNIDAD DE CONTROL DE LA UNIDAD DE EJECUCIN

i) BUSES INTERNOS j) UNIDAD ARITMETICA Y LOGICA (ALU) g) COLA DE INSTRUCCIONES Una cola cuya abreviatura es Q de "queue", es una lnea de espera como la que forman en la caja del supermercado. Algunos de los microprocesadores de 16 bits como el 8086/8088 del Intel o Motorola MC 68000 utilizan tales lneas de espera para sus instrucciones. Dicho de otra manera sus instrucciones que han de ejecutarse llegan al microprocesador antes de lo necesario y "esperan" en una cola de instrucciones en este sistema, poseen la ventaja de que cada instruccin puede extraerse de memoria mientras otras se estn ejecutando reducindose en consecuencia el tiempo de proceso, por ejemplo las instrucciones que incluyen directamente a la velocidad de aquellas otras que utilizan datos de los registros de la CPU, las colas de instrucciones son normalmente cartas de 496 octetos en concreto la del 8086 es de 6 octetos, (tres palabras y la del 8088 es de 4 octetos). La cola de instrucciones es de un rea de almacenamiento de tipo PEPS (Primero en entrar, primero en salir) para instrucciones decodificadas y operandos ya disponibles.

h) UNIDAD DE CONTROL DE LA UNIDAD DE EJECUCIN La funcin principal de la UC es dirigir la secuencia de pasos de modo que la computadora lleve a cabo un ciclo completo de ejecucin de cada una de las intrusiones del programa. Utiliza seales de reloj, por lo que se considera que el microprocesador es un dispositivo sncrono. Su actividad es cclica y consiste en la bsqueda y obtencin de datos e instrucciones, y en la ejecucin secuencial de stas ltimas. El corazn de la unidad de control lo constituye el GENERADOR DE CICLO DE LA MAQUINA (GCM), que se encarga de producir las seales de control, derivndolas de un reloj u oscilador maestro. Pasos para ejecutar una instruccin cualquiera: a) Ir a la memoria y extraer el cdigo de la siguiente instruccin. Este paso se llama "ciclo fetch". b) Decodificar la instruccin ya leda. c) Ejecutar la instruccin. d) Prepararse para leer la siguiente casilla de memoria y continuar con el paso a). Las principales funciones de esta unidad son:

a) Leer e interpretar las instrucciones del programa. b) Dirigir la operacin de los elementos internos del procesador. c) Controlar el flujo de datos y programas que entran y salen de RAM. Para realizar su funcin consta de los siguientes elementos:

Registro de control de secuencia (RCS). Tambin denominado contador de programa (CP), contiene permanentemente la direccin de memoria de la prxima instruccin a ejecutar. Si la instruccin que se esta ejecutando en un instante determinado es de salto o de ruptura de secuencia, el RCS tomara la direccin de la instruccin que se tenga que ejecutar a continuacin, esta instruccin la traer de la propia instruccin en curso. Registro de instruccin (RI). Contiene la intrusin que se esta ejecutando a cada momento. Esta instruccin llevara consigo el cdigo de operacin (CO), acin de que se trata y en su caso los operandos o las direcciones de memoria de los mismos. Decodificador (D). Se encarga de extraer y analizar el cdigo de operacin de la instruccin en curso (que est en RI) y dar seales necesarias al resto de los elementos para su ejecucin. Reloj (R). Proporciona una sucesin de impulsos elctricos a intervalos constantes (frecuencia constante), que marca los instantes en que se han de comenzar los distintos pasos de que consta cada instruccin. Secuencia (S). En este dispositivo se encargan ordenes muy elementales (microordenes), que sincronizadas por los impulsos del reloj, hacen que se vaya ejecutando poco a poco la instruccin que esta encargada en el RI. j) UNIDAD ARITMETICA Y LOGICA (ALU)

La unidad de aritmtica y lgica es un circuito digital que realiza un conjunto de micro-operaciones aritmticas y lgicas. Operaciones que realiza una ALU: 1. Suma aritmtica. 2. Funciones lgicas AND, OR y XOR. 3. Complemento. 4. Rotacin hacia la izquierda o derecha.

Esta unidad es un grupo de circuitos electrnicos encargada de realizar las operaciones elementales de tipo aritmtico (+, -, *, /) y de tipo lgico (comparaciones), tambin hace comparaciones alfabticas, por ejemplo; Soto, Snchez. Para realizar su funcin consta de los siguientes elementos:

Banco de Registros. (BR): Est constituido por 8, 16, 32 registros de tipo general que sirve para situar datos antes de cada operacin, para almacenar datos intermedios en las operaciones y para operaciones internas del procesador. Circuito de Operadores. (CIROP): Compuesto de uno o varios circuitos electrnicos que realizan operaciones elementales aritmticas y lgicas (sumador, complementador, desplazador, etc.). Registro de Resultados. (RR): Se trata de un registro especial, en el que se depositan los resultados que producen los circuitos operadores. Sealizador de Estado. (SE): Registro con un conjunto de biestables en los que se deja constancia de algunas condiciones que se dieron en la ltima operacin realizada.

1.2.1
i)

Buses.

BUSES INTERNOS (DATOS, DIRECCIONES).

BUS. Es un canal o ruta comn de comunicacin entre dispositivos del hardware, ya sea internamente entre componentes del computador o externamente entre estaciones de una red de comunicaciones. Los buses se asemejan a una carretera por la que circulan los bits fsicamente, los

buses son varios hilos paralelos, uno para la transmisin de cada bit. Cuando la arquitectura del bus es utilizado en un computador, el procesador o procesadores, los bancos de memoria y las unidades de control perifrica estn todos interconectados mediante el bus. El bus est dividido en dos canales, uno para seleccionar donde esta localizado el dato (bus de direcciones) y otro para transferir el dato (bus de datos). BUS DE DATOS. Circulan los datos con los que va a trabajar el ordenador, debe estar conectado a la memoria principal, puesto que en ella se encuentran almacenados los datos, al banco de registro y por supuesto a la unidad aritmtica y lgica, el bus de datos tiene 8 conectores y es capaz de transportar 8 seales en paralelo, esto significa que el bus de datos puede llevar unidades de informacin de 8 dgitos binarios, slo una unidad cada vez. BUS DE DIRECCIONES. Se emplea para transmitir la informacin que ha de reaccionar la memoria. Si el bus de direcciones tiene 16 hilos, se podr direccionar Z16 direcciones de memoria, es decir, se puede acceder a cualquier posicin de memoria de 64 KB. Si se considera la cuestin de forma inversa se precisan dos palabras de 8 bits para conseguir una direccin de memoria. Llevar seales de control especial que provocan la seleccin de la informacin a travs de la computadora. Esta informacin se utiliza para distinguir a la vez entre varios dispositivos de E/S y las miles de celdas de la memoria de la computadora. EL BUS DE CONTROL: Sincroniza el sentido de la transferencia de informacin en el bus de datos (hacia adentro o hacia afuera). Cada una de las seales del bus de control son unidireccionales.

1.2.2

Registros.
a) REGISTROS GENERALES

Los registros de propsito general son capaces de soportar operandos de datos de1, 8, 16 y 32 bits, estos registros tambin soportan operandos de direcciones de 16 y 32 bits. Los 8 registros son AX (acumulador), BX (en base), CX (contador), DX (datos), SP (puntero de pila), BP (puntero base), SI (ndice fuente) y DI (ndice destino). Para acceder a los 32 bits de un registro todas las referencias a registros debe comenzar con la letra "E". Cada uno de los 8 registros de propsito general pueden ser compuestos en sus equivalentes de 16 bits de 8086 bits/80286 referenciando los registros sin usar el prefijo E.

REGISTRO EAX (Acumulador). Generalmente se usa para almacenar resultados de operaciones aritmticas o lgicas, lectura o escritura desde o hacia los puertos y como un rea de memoria principal temporal (SCRATCH PAD). Tambin se direcciona como AX, AH, o AL. REGISTRO EBX ( Base). Sirve como registro apuntadores base o ndice. Conserva la direccin base (desplazamiento) de los datos que hay en la memoria o la direccin base de una tabla de datos. Tambin se direcciona como BX, BH, o BL. REGISTRO ECX (Contador). Se utiliza constantemente en operaciones de interaccin, como un contador que automticamente se incrementa o decrementa de acuerdo con el tipo de cada instruccin usada. Tambin es usado para corrimientos (CL) y rotaciones y ciclos y para las operaciones de cadena y un contador. Tambin se direcciona como CX, CH, CL. REGISTRO EDX ( De Datos). Comnmente se usa como fuente para el acceso de datos. Tambin se direcciona como DX, DH y DL.

b) REGISTROS APUNTADORES (ESP Y EBP). La direccin fsica de cualquier elemento dado en un segmento seleccionado se obtiene por la combinacin de la direccin del segmento y el desplazamiento, este desplazamiento puede estar contenido en uno de los registros puntero, base o ndice.

Las operaciones de la pila son facilitadas por el sector del segmento de pila (SS) y el par de registros de puntero de pila (SP) o puntero base (BP). REGISTRO ESP O APUNTADOR DE PILA. Apunta a un rea especfica de memoria que sirve para almacenar datos bajo la estructura LIFO (LAST, IN, FRIST OUT) mejor conocido como PILA STACK. Esto ocurre cuando se ejecutan las instrucciones PUSH y POP cuando se llama (CALL) o se regresa (RET) de una subrutina de un programa principal. Tambin se direcciona como SP. REGISTRO EBP O BASE. Se usa para manipular la pila sin afectar el registro de segmentos SS, as como para direccionar una matriz de datos en una pila de memoria. Tambin se direcciona como BP.

c) REGISTROS INDICES (ESI Y EDI). Manipulaciones de datos ms complicadas pueden obtenerse utilizando los registros ndice fuente (ESI) e ndice destino (EDI) junto al segmento de datos actualmente activo. REGISTRO SI. Se emplea para direccionar datos de fuente en forma indirecta para utilizarlos con las instrucciones de cadenas o arreglos. REGISTRO DI. Se emplea para direccionar datos destino en forma indirecta para utilizarlos con las instrucciones de cadenas o arreglos. d) REGISTRO DE SEGMENTOS (SS, CS, DS, ES.) Un segmento es un mdulo de cdigo que puede ser accesible simultneamente con los dems. El microprocesador 80386 y 80486 contienen 6 registros segmento de 16 bits, estos mantienen los valores del selector en las posiciones de memoria actualmente direccionables. En modo de direccin real, un segmento puede variar desde un byte hasta un tamao de segmento mximo de 64 Kb. La figura muestra la representacin grfica de los registros de segmento.

CS (cdigo). El segmento de cdigo es una seccin de la memoria que tiene los programas y procedimientos utilizados por los programas. Este define la direccin inicial de la seccin de memoria que tiene el cdigo. El segmento de cdigo direcciona a 4Gbytes en el 80386 y 80486. DS (datos). Es una seccin de memoria que contiene la mayor parte de los datos utilizados por un programa. ES (extra o adicional). El segmento extra o adicional de datos lo utilizan algunas instruucciones para cadenas. SS (pila). El segmento de pila define la superficie de la memoria utilizada para la pila. La ubicacin del punto inicial de entrada a la pila, se determina por el registro apuntador de la pila. FS y GS. Estos registros de segmento adicionales estn disponibles en los microprocesadores 80386 y 80486 a fin de contar con dos segmentos adicionales de memoria para acceso con los programas. e) REGISTRO APUNTADOR DE INSTRUCCIONES (IP).

El puntero de instrucciones (IP) contiene desplazamiento necesario para direccionar la siguiente instruccin que se va a ejecutar en el segmento de cdigo actualmente activo. Para formar la localidad real de la siguiente instruccin se suma el contenido de IP con CS (por) 10H. En general un puntero de 32 bits a la siguiente instruccin secuencial del programa. REGISTRO IP (INSTRUCCIN POINTER). Apunta a la siguiente instruccin que ser ejecutada en memoria. f) REGISTRO DE ESTADO (BANDERAS)

Las banderas o sealizadores indican la direccin del microprocesador a la vez que controlan su movimiento. Los bits de banderas cambian despus de ejecutar muchas de las instalaciones aritmticas y lgicas. En la figura se muestran claramente. Registro de banderas 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 AC VM RF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 NT IOP IOP OF DF IF TF SF ZF AF PF 0 CF

Las banderas indican la condicin del microprocesador a la vez que controlan su miento. Los bits de bandera cambian despus de ejecutar muchas de las instrucciones aritmticas y lgicas.

El sealizador de arrastre (CF) se pone a 1 cuando se genera un arrastre en una operacin aritmtica realizada sobre un operando de 8 16 bits. En cualquier otro caso, est a 0 CF tambin se utiliza en instrucciones de desplazamiento y rotacin y contiene el bit desplazado o rotado fuera del registro. El sealizador de paridad (PF) se utiliza principalmente para aplicaciones de comunicaciones de datos y se pone a 1 para generar paridad impar a 0 para generar paridad par. El sealizador de arrastre auxiliar (AF) se utiliza en aritmtica BCD para indicar si ha habido arrastre o prstamo en los dgitos correspondientes a los 4 bits menos significativos de un valor BCD. El sealizador de cero (ZF). Indica que el resultado de una operacin aritmtica o lgica es cero. Si ZF=1, el resultado es cero, y si ZF=0 el resultado no es cero. El sealizador de signo (SF) se pone a 1 para resultados negativos y a 0 para resultados positivos. Toma el valor que tiene el registro ms significativo. El sealizador de rebose (OF) indica si una operacin ha generado arrastre en el bit de orden superior del resultado pero no de un arrastre de otro bit diferente del orden superior. Tres de los once sealizadores (TF, IF y DF) se utilizan para controlar ciertas operaciones del procesador. El sealizador de trampa - TAP (TF). Cuando s inicializa pone al microprocesador en modo de paso simple y habilita la depuracin de un programa. El sealizador de habilitacin de interrupcin (IF) habilita interrupciones externas cuando se pone uno, y las habilita cuando se pone cero. La direccin de las operaciones con cadenas est controlada por el sealizador de direccin (DF). Con DF a cero, si y/o DI son incrementados automticamente con DF a 1, si IO, DI son decrementados automticamente.

Los sealizadores IOP y NT son dos sealizadores nuevos no suministrados anteriormente y solamente son usados cuando el microprocesador est en modo protegido, el sealizador de niveles E/S de privilegio (10 P) se utiliza para garantizar que una instruccin realiza todas aquellas operaciones que est autorizada a realizar. El sealizador de tareas (NT) se utiliza para indicar si la ejecucin de la tarea actual est anidada en otras tareas. Si NT est a uno, la tarea actual anidada tiene un enlace a la tarea previa. El sealizador RF (de resumen) se usa junto con los "break points" del registro de operacin a pasos simples. Cuando RF est en uno todos los fallos de depuracin se ignoran en la siguiente instruccin, entonces, RF se pondr automticamente a cero (RESET) cuando complete con xito cada instruccin. El VM (sealizador modo virtual) si VM est a uno y el 80386 est en modo protegido, el microprocesador conmutar a la operacin en modo virtual del 8086, haciendo que todas las operaciones de segmentos se ejecuten como si estuvieran corriendo en un 8086. Sealizador (AC) comprobacin de alineacin.

1.2.3

Modos de direccionamiento.
TECNICAS DE DIRECCIONAMIENTO.

Una instruccin del 80286/80386/80486 no solamente contiene informacin sobre la operacin en particular a realizar, sino que tambin incluye las especificaciones para el tipo de operandos a manipular, as como tambin la posicin de estos. La manera en que los operandos se escogen durante la ejecucin del programa depende del modo de direccionamiento de la instruccin. El modo de direccionamiento especifica una regla para interpretar o modificar el campo de direccin de la instruccin antes de que el operando sea en realidad referenciado. Se emplear la instruccin MOV (mover datos) para describir los modos de direccionamiento de datos. En el ejemplo se ilustra la instruccin MOV y define la direccin del flujo de datos a la fuente a la derecha y el destino a la izquierda.
MOV MOV destino, fuente AX, BX

Modo Implicado
En este modo los operandos son especificados implcitamente en la definicin de la instruccin. Por ejemplo, la instruccin complemente el acumulador es una instruccin de modo implicado debido a que el operando en el registro

acumulador est implicado en la definicin de la instruccin.

DIRECCIONAMIENTO DE DATO INMEDIATO


El termino inmediato significa que los datos siguen inmediatamente al cdigo hexadecimal de operacin en la memoria. El direccionamiento inmediato acta en byte o palabra de datos. A continuacin se muestra el funcionamiento del direccionamiento de dato inmediato.
MOV MOV MOV MOV AH,00 AL,04 AX,0FFFFFH AX,302 ;AH se pone a cero (00) ;AL se carga con 0000 0100 en binario

En este modo l operando es especificado en la instruccin misma. Esto es, una instruccin de modo inmediato tiene un campo de operando en vez de un campo de direccin. En la modalidad inmediata, el operando se incluye como parte de la instruccin. Por ejemplo MOV AX, 5. Aqu el nmero 5 forma parte de instruccin en su totalidad, en otras palabras, el nmero se especifica como una constante numrica en la misma instruccin y no hay necesidad de accesar la memoria, la instruccin mueve el valor de 5 al registro AX.
Ejemplos: MOV AX, 60 MOV BX, 01A MOV AX, 083 MOV CX, 2BC MOV DX, 0123

DIRECCIONAMIENTO DIRECTO
Con el direccionamiento directo, el desplazamiento del segmento de operando est contenido en la instruccin como una cantidad de 16 bits. Este desplazamiento se suma al contenido desplazado del registro del segmento de datos (DS) y se devuelve a la EA de 20 bits, o direccin fsica real. Habitualmente, el operando de direccionamiento directo es un rtulo.
Ejemplo: MOV AX, MYDATA
MYDATA CONT DIR. 0005 0004 FF 00 0003 0002 0001 0000 AX

1111111100000000

En la mayor parte de las instrucciones se puede emplear el modo de direccionamiento directo de datos, el cual se aplica en muchas instrucciones en un programa tpico. Hay dos formas bsicas de direccionamiento directo de datos (1) direccionamiento directo y (2) direccionamiento por desplazamiento; en este caso el direccionamiento directo solo se permite con una instruccin MOV que transfiera datos entre una localidad en la memoria, situada dentro de datos y un registro AL (8 bits), AX (16 bits) o EAX (32 bit) . Esta instruccin siempre tiene una longitud de 3 bytes. Ejemplo: La instruccin MOV CX, LIST copia el contenido tamao palabra de la localidad LIST de la memoria y lo coloca en el registro CX.
MOV AX, DDDW MOV BX, DDDY MOV AX, DDDU

DIRECCIONAMIENTO DE REGISTRO
Transfiere un byte o palabra desde el registro fuente o localidad en la memoria, hasta el registro o localidad destino en la memoria. Es fcil comprender el direccionamiento por registro una vez que se aprende los numerosos registros que hay en los 8086-080486. Los 8086-80286 contienen los siguiente registros de 8 bits, utilizando con el direccionamiento por registro AH, AL, BH, BL, CH, CL, DH, y DL. Tambin contienen los siguientes registros de 16 bits AX, BX, CX, DX, SP, BP, SI y DI. En los 80380/80486 los registros, ampliados de 32 bits son EAX, EBX, ECX, EDX, ESP, EBP, EDI y ESI. Pero no se debe mezclar un registro de 8 bits con uno de 16 bits, uno de 8 bits con uno de 32 bits, o uno de 16 bits con uno de 32 bits porque no lo permite el conjunto de instrucciones de 8086-80486. La tabla presenta algunas versiones de instruccin MOV entre registros. Es importante mostrar todas las variables por las numerosas combinaciones posibles.

Lenguaje ensamblador MOV AL, BL MOV CH, CL MOV AX, CX MOV SP, BP MOV DS, AX MOV DI, SI MOV BX, ES MOV ECX, EBX MOV ESP, EDX MOV ES, DS MOV CS, AX

Operacin Copia BL en AL Carga CL en CH Carga CX en AX Carga BP en SP Carga AX en DS Carga SI en DS Carga ES en BX Carga EBX en ECX Carga EDX en ESP No se permite (segmento a segmento) No se permite ( registro de

segmento ) MOV BL, BX No se permite (tamao mixtos)

DIRECCIONAMIENTO DE REGISTRO INDIRECTO


Transfiere un byte o palabra entre un registro y una localidad de memoria direccionada por un registro ndice o base. En lugar de referenciar por un rtulo la direccin del operando fuente, el valor del operando es sealado por una direccin de desplazamiento almacenada en uno de los registros siguientes: SI, DI,BX, o en algunas veces en el BP. La ventaja de la instruccin de modo de registro indirecto es que el campo de direccionamiento en la instruccin utiliza menos bits para seleccionar un registro que lo que hubiera requerido para especificar una direccin. El microprocesador reconoce el direccionamiento indirecto de registros por la sintaxis de la instruccin. El designador del operando fuente es reconocido por corchetes.
EJEMPLOS MOV BP, [DX] LEA AX, [CS] LEA DI, [SS]

DIRECCIONAMIENTO DE REGISTRO RELATIVO


En este modo el contenido del controlador del programa se suma a la parte de direccin de la instruccin para obtener una direccin efectiva. El direccionamiento relativo por registro es similar al direccionamiento base ms ndice y al direccionamiento por desplazamiento. En el direccionamiento relativo por registro, para direccionar datos en un segmento de memoria se agrega un desplazamiento al contenido de un registro base ndice (BP, BX, DI o SI).
Ejemplo: MENSAJE1 DB 'EL LENGUAJE ENSAMBLADOR ES', '#' MENSAJE2 DB 'RAPIDO Y EFICIENTE','#' . . LEA BX, MENSAJE1 MOV AL,[BX]+4

La orden LEA carga la direccin de desplazamiento en el registro BX. Al referencias el cuarto elemento de MENSAJE1 se realiza aadiendo la direccin base (BX) de MENSAJE1 al desplazamiento, +4 en la cadena. El ensamblador reconoce los tres mtodos siguientes para indicar el direccionamiento relativo base.
LEA [BX]+4

LEA 4[BX] LEA [BX+4]

DIRECCIONAMIENTO DE BASE INDEXADO REGISTRO


Con el direccionamiento base indexado, el operando se localiza en el segmento seleccionado en un desplazamiento determinado por la suma de los contenidos del registro base, registro ndice y opcionalmente un desplazamiento
Ejemplos: LEA BX MYDATA MOV SI,25 MOV AX MYDATA [BX] [SI]

DIRECCIONAMIENTO BASE INDEXADO


Con el direccionamiento base indexado, el direccionamiento se localiza en el segmento seleccionado en un desplazamiento determinado por la suma de dos contenidos del registro base, registro ndice y, opcionalmente un desplazamiento.
Ejemplo: LEA BX MY DATA MOV SI, 25 MOV AX MYDATA

DIRECCIONAMIENTO INDEXADO DIRECTO


En el direccionamiento indexado directo, la direccin de desplazamiento del operando se calcula sumando el desplazamiento a un registro ndice (SI o DI) en el segmento seleccionado, frecuentemente, el direccionamiento indexado directo se utiliza para acceder a los elementos de un ARRAY esttico. El valor del desplazamiento localiza el comienzo del ARRAY el valor almacenado en el registro ndice selecciona uno de modo simple en la estructura. Como los elementos son del mismo tipo de datos y tamao, por moverse a travs del ARRAY basta en incrementar o decrementar sistemticamente en el desplazamiento.
Ejemplo: MOV SI, 4 MOV AL, ARRAY 1 [SI] LEA BX MYDATA MOV 51,25 MOV AX MYDATA [BX] [SI]

Internamente el microprocesador tiene 7 registros rotulados A(para el acumulador );B, C, D, E, F H y L estos registros tiene 8 bits de ancho y puede acomodar un bvte . el cdigo de operacin de una instruccin leda de la memoria durante el ciclo de fetch es transferido al registro de instruccin. Es

entonces decodificada por el control para determinar la secuencia de microoperaciones necesarias ejecutar la instruccin.

1.3 Interrupciones.
Una interrupcin es una detensin de la ejecucin del microprocesador para dar oportunidad a la maquina de comunicarse con los dispositivos perifericos. Puede decirse que una interrupcin es el elemento ms importante para ejecutar un programa debido a que estas permiten la interaccin entre el usuario y la maquina. Una interrupcin es un mecanismo de control; bsicamente ocasiona que la CPU detenga la ejecucin del programa actual transfiera el control a una rutina de servicio y al termino de esta prosigue con la ejecucin del programa interrumpido a otros mecanismos para transferencia de control tales como las instrucciones JMPCALL/ RED siempre se encuentran bajo el control del programa, la familia de las microcomputadoras y compatibles aceptan dos tipos de interrupciones las del HARDWARE Y SOFTWARE. EJECUCION DE UNA INTERRUPCION Para que una interrupcin se ejecute correctamente es necesario almacenar el nmero de funcin en el registro acumulador AH (y demas registros de propsito general, si as se requiere), y posteriormente mandar a llamar el tipo de interrupcin requerido. A continuacin se mostrara un fragmento de un programa para ejemplificar la ejecucin de una interrupcin.
;CODIGO PARA BORRAR PANTALLA MOV CX, 0000 MOV DX, 2479H MOV BH, 07 MOV AH, 06 MOV AL, 00 INT 10H RET END

Como puede verse en este ejemplo, para ejecutar la interrupcin 10H, primero fue necesario cargar el valor de la funcin en el registro acumulador y los dems atributos en los dems registros de propsito general. El funcionamiento de una interrupcin existe cuando el microprocesador concluye al ejecutar la instruccin en curso, entonces para determinar si una interrupcin esta activa se comprueba:
1. Alguna instruccin en ejecucin 2. Trampa 3. NMI 4. Sobreflujo del segmento del procesador 5. INTR 6. La instruccin INT en el orden citado si est presente una o ms de estas condiciones de interrupciones ocurre lo siguiente:

1.- Se salva el contenido de registro de banderas en pila. 2.- Se desactivan las banderas de interrupciones IF y TF esto deshabilita la terminal INTR y la caracterstica de trampa, 3.- Se salva el contenido de registro CS de segmentos de cdigo hacia la pila, 4.- Se salva el contenido del apuntador de instruccin IP en la pila, 5.- Se recupera el contenido del vector de la interrupcin y se coloca en IP y en CS de modo que la siguiente instruccin se ejecuta en el procedimiento de servicio de la interrupcin diseccionada por el vector.

TIPOS DE INTERRUPCIONES Recordemos que las interrupciones internas y externas se inician a partir de seales que ocurren en la CPU. Y esta se encuentra lista para atender a la interrupcin a quien le interrumpi, pasa el control ala rutina llamada manejador de interrupciones, esta rutina define la causa de las interrupciones, proporciona el servicio solicitado y regresa el control a la CPU para que esta pueda proseguir a lo que estaba haciendo. INTERNAS (DEL PROGRAMA)
Surgen debido a la utilizacin ilegal o errnea de una instruccin de datos. La interrupcin interna tambin se llama trampa. Algunos ejemplos de las interrupciones preocupadas o condiciones de error internas son los sobre flujos de registro, intentar dividir entre cero un cdigo de operacin no valido, desbordamiento de pila y violacin de la Proteccin. Por lo general estas condiciones de error ocurren, como resultado de una determinacin prematura de la ejecucin de una instruccin. El programa de servicio que procesa la interrupcin interna determina la medida correctiva que se debe tomar. La diferencia entre las interrupciones internas y externas, es que las internas se inician por una condicin excepcional causada por el programa mismo, mas bien que por un evento externo. Las interrupciones internas son sincronas con el programa en tanto que las externas no lo son.
VECTORES PARA INTERRUPCION NUM. 0 1 2 3 4 5 6 7 8 9 DIRECCION OH 3H 4H-7H 8H BH CH-FH 10H-13H 14H-17H 18H-1BH 1CH-1FH 20H-23H 24H-27H MICROPROCESADOR 8086-80486 8086-80486 8086-80486 8086-80486 8086-80486 80286-80486 80286-80486 80286-80486 80386 -80486 80386- 80486 FUNCION Error al dividir Paso a paso Nmi Int. Hardware Punto de ruptura Int. Por sobre flujo Int. de BOUND Cdigo invalido Int. De emulacin Doble falta Desbordamiento de segmento

10 11 12 13 14 15 16 17 18-31 32-255

28H-2BH 2CH-2FH 30H-33H 34H-37H 38H-3BH 3CH-3FH 40H-43H 44H-47H 48H-7FH 80H-3FFH

80386- 80486 80386- 80486 80386- 80486 80386- 80486 80386- 80486 80386- 80486 80386- 80486 80486SX int 8086-80486 8086-80486

Segmento de estado de tarea No hay segmento Falla de pila Falla general de proteccin Falla de pgina Reservado Error de punto decimal De verificacin de alineacin Reservado Int. Por el usuario.

INTERRUPCIONES EXTERNAS Las interrupciones internas provienen de dispositivos de entrada y salida (E/S). De un dispositivo de temporizacion, de un circuito que monitorea la fuente de alimentacin de cualquier otra fuente externa. Algunos ejemplos que producen las interrupciones externas son dispositivos de entrada y salida que terminan la trasferencia de datos, tiempo transcurrido de un evento o falla de energa. Puede ocurrir una interrupcin por tiempo ilimitado de un programa que este en un ciclo que no termina y que, por lo tanto excede su tiempo asignado una interrupcin por falla de energa puede tener como su rutina de servicio a un programa que transfiere el estado completo de la CPU. A una memoria no voltil en pocos segundos anteriores a una falla de energa. UTILIZACION DE LAS INTERRUPCIONES DEL BIOS Y DEL MS DOS Si la pastilla del microprocesador forma el ncleo de la computadora ciertamente la rutina del BIOS Y del DOS son los cerebros de la mquina cada computadora esta programada con una cierta cantidad de informacin antes de dejar la factora, esta informacin esta almacenada en el HARDWARE ROM(memoria slo de lectura). Tpicamente la mayora de las rutinas del BIOS ( sistema bsico de entrada y salida), esta almacenada en ROM y es permanente. EL DOS. Sistema Operativo de discos puede ser considerado como una memoria, aadida en una fecha posterior, realmente es memoria que se aade cada vez que la computadora se conecta o s inicializa con el DOS, es memoria no permanente, memoria que puede ser actualizada y cambiada con cada nueva liberacin del DOS tpicamente las operaciones s del DOS son almacenadas en RAM(memoria de acceso aleatorio o residen en el disco hasta que se necesiten).

INT 1AH

La interrupcion de BIOS, 1AH, permite leer y escribir la fecha y hora actuales desde y al reloj del sistema. La tabla siguiente es un listado de las opciones disponibles con la interrupcin del BIOS tipo 1AH.
INTERRUPCION 1AH Valor AH AH=0 Funcin Lee inicializacion reloj actual CX= DX= Entrada Salida CX--Bytes superiores del reloj DX--Bytes inferiores del reloj AL--0,si temporizador no ha pasado 24 horas Bytes superiores del reloj Bytes inferiores del reloj CH--BCD horas CL--BCD minutos DH--BCD segundos CH= CL= DH= DL= BCD horas BCD minutos BCD segundos 1--hora del diaundos 0--hora estandar CH--BCD siglo CL--BCD ao DH--BCD mes DL--BCD dia CH= CL= DH= DL= CH= CL= DH= BCD BCD BCD BCD siglo ao mes dia

AH=1

Inicializa reloj actual

AH=2

Lee hora--reloj de tiempo real

AH=3

Inicializa hora--reloj de tiempo real

AH=4

Lee fecha-- reloj de tiempo real.

AH=5

Inicialioza Fecha--reloj de tiempo real

AH=6 AH=7

Inicializa alarma (hasta 23:59:59) Reinicializa alarma.

BCD horas BCD minutos BCD segundos

INT 10H
Muchas veces cuando se programa, la entrada o salida de la computadora necesita ser mostrada en la pantalla del monitor. Con frecuencia esto requerir una simple operacin de borrado de pantalla; en otras ocasiones se podr desear cambiar los colores o atributos de la pantalla. El control de la pantalla puede conseguirse fcilmente con las interrupciones del BIOS tipo 10H . La tabla siguiente es un listado de las posibles variaciones programables con las interrupciones tipo 10H.
INTERRUPCION 10H Valor AH Funcin Control de interfaz del CRT AH=0 Inicializa el modo de visualizar AL=0 AL=1 AL=2 AL=3 AL=4 AL=5 40x25 B/W 40x25 COLOR 80x25 B/W 80x25 COLOR 320x200 color grficas 322x200 B/W grficas Salida Entrada

AL=6 AL=10 AH=1 Inicializa tipo de cursor CH= CL= DH= DL= BH= DH= DL= CH= CL= BH=

640x200 B/W grficas 640x350E.G.A.Graficas Bits 4-0 principio de lnea para el cursor Bits 4-0 fin de linea para cursor Fila Columna Nmero pgina de pantalla Fila Columna Modo cursor Modo cursor Nmero pgina de pantalla Conmutacion no abajo/disparo Respuestas validas; sigue: Fila Columna Grafo linea (0-199) Columna Grafica Valor nueva pgina Modos 0 y 1 (0-7) Modos 2 y 3 (0-3) Nmero de lineas; 0 para pantalla entera Fila, esquina superior izquierda Columna, esquina superiorzquierda Fila,esquina inferior derecha Columna, esquina inferior derecha Atributo a ser usado Nmero de lineas; 0 para pantalla entera Fila, esquina superior izquierda Columna, esquina superior izquierda Fila,esquina inferior derecha Columna, esquina inferior derecha Atributo a ser usado

AH=2

Inicializa posicin de cursor

AH=3

Lee posicin de cursor (valores hasta ejecusion)

AH=4

AH=0 AH=1 Obtiene posicion lapiz luminoso (valores hasta DH= ejecusin) DL= CH= BX= Inicializa pgina pantalla activa AL= AL= CH= CL= DH= DL= BH= AL= CH= CL= DH= DL= BH=

AH=5

AH=6

Enrrola pgina activa hacia arriba

AH=7

Enrrola pgina activa hacia abajo

Manipulacion de caracteres AH=8 Lee atributo/caracter en posicin cursor BH= AL= AH= BH= CX= AL= BL= BH = CX = AL = Pgina pantalla Caracter leido Atributo de caracter Pgina pantalla Cuenta de caracteres a escribir Caracter a escribir Atributo de caracter Visualiza pgina Cuenta de caracteres a escribir Caracter a escribir

AH=9

Escribe atributo/caracter en posicion cursor

AH=10

Escribe caracter en posicin cursor Interfaz de grficos

BH = BL = AH=11 Selecciona paleta colores

Paleta ID (0-127) Color para paleta ID 0--Fondo (0-15) 1--paleta 0--Verde(1),rojo(2),amarillo(3) 1-- Cyan (1), magenta (2), Fila (0-199) Columna (0-319/639) Color del punto Fila (0-199) Columna (0-319/639) Valor del punto

AH=12

Dibuja punto en pantalla

DX= CX= AL= DX= CX= AL=

AH=13

Lee informacion punto Salida teletipo ASCII

AH=14

Escribe a pgina activa

AL= BL= AL= AH= BH=

Caracter a escribir Color primer plano Modo actual Nmero de columnas de pantalla Pgina pantalla actual

AH=15 AH=16 AH=17 AH=18

Devuelto a estado video Reservado Reservado Reservado

ES:BP= CX= DX= BH= AL=0 AH=19 Escribe cadena AL=1 AL=2 AL=3

Seala a cadena Longitud de cadena Posicion de cursor para comienzo Nmero de pgina BL= atributo(car,car,car...car) Cursor no transferido BL= atributo (car,car,car...car) Cursor es transferido (car,atr,car...atr) Curso no transferido (car,atr,car...atr) Cursor es transferido.

INTERRUPCION DEL DOS ( 21H)


La interrupcion 21H del DOS es una interrupcion de llamada a funcion. Las especificaciones y requerimientos para utilizar esta interrupcion se muestran en la siguiente tabla:
INTERRUPCION 21H Valor AH AH = 1 AH = 2 AH = 3 AH = 4 AH = 5 AH = 6 AH = 7 AH = 8 AH = 9 AH = A AH = B AH = C AH = D Funcin Espera y visualiza caracter de teclado con comprobacin CTRL-BREAK Visualiza caracter de teclado con comprobacin CTRL-BREAK Entrada asncrona de caracter Salida asncrona de caracter Caracter a escribir Entrada caracter de teclado Espera para caracter de teclado (no visualiza) Espera para caracter de teclado (no visualiza-comprueba CTRL-BREAK) Visualiza cadena Cadena teclado a buffer Status de entrada de teclado Borra buffer teclado y llama funcin Unidad implcita disco (reset) AL = Ninguna DS:DX= DS:DX= DL = DL = DL = 0FFH DL = Entrada Salida AL - Cacter introducido Caracter a visualizar AL - Caracter introducido Caracter a enviar Caracter a escribir Caracter introducido AL - Caracter introducido AL - Caracter introducido Direccin de cadena. Debe finalizar con centinela $ Direccin de buffer. Primer byte=tamao, segundo byte=nmero de caracteres leidos AL-No. caracter=0FFH Caracter = 0 1,6,7,8,0A - Nmero funcin Ninguna

AH = E

Unidad implcita disco (seleccionada)

DL =

AL - Nm. unidades 0 - Unidad A 1 - Unidad B, etc. AL - Nm. unidades 0 - Unidad A 1 - Unidad B, etc.

AH = 19 Cdigo unidad (mplicito) AH = 25 Interrupcin (inicializa) DS:DX = AL= AH=2A Fecha (lee)

Direccin del vector de interrupcin Nmero de interrupcin CX--Ao(80 a 99) DH--Mes DL--Dia(1 a 31) Igual que antes AL--0 si valido OFF si no valido CH--Horas (0-23) CL--Minutos(0-59)

AH=2B

Fecha (inicializa)

CX:DX

AH=2C

Hora (lee)

AH=2D

Hora (inicializa)

CX:DX DL=

Igual que antes AL--0 si valido OFF--si no valido 0 AL= 0 0;verifica off 1;verifica on Nmero de interrupcin ES:BX--apunta a direccion vector Unidad (0--implicita,1--A,2--B,etc.) AX--sectores/apiamiento(FFFF si invalido) BX--Nmero apiamiento libres CX--Bytes por sector DX--Nmero total de apiamientos Direccin de cadena para directorio Direccin de cadena para directorio Direccin de cadena para nuevo directorio Direccin de cadena para archivo AX--Retorno maipula archivo Atributo archivo Direccin de cadena para archivo 0--Abre para leer 1--Abre para escribir 2--Abre para ambos AX--Retorno manipula archivo Manipula archivo Manipula archivo Nmero de bytes a leer Direccion de buffer AX--Nmero de bytes a leer Manipula archivo Nmero de bytes a escribir Direccin de datos a escribir AX--Nmero de bytes a escribir Direccin de archivos cadena Desplazamiento en bytes Puntero desplazado (CX:DX) bytes desde el comienzo del archivo Puntero a posicin actual ms desplazamiento Puntero a EOF ms desplazamiento

AH=2E

Verifica estado(inicializa)

AH=35

Direccion interrupcion (lee)

AL= DL=

AH=36

Disco espacio disponible

AH=39 AH=3A AH=3B AH=3C

Hace directorio Eliminar directorio Cambia directorio Archivo (crea)

DS:DX DS:DX DS:DX DS:DX CX= DS:DX AL=

AH=3D

Archivo (abre)

AH=3E

Manipula archivo(cierra)

BX= BX= CX= DS:DX BX= CX= DS:DX DS:DX CX:DX AL=0 AL=1 AL=2

AH=3F

Archivo o dispositivo(lee)

AH=40

Archivo o dispositivo(escribe)

AH=41

Archivo (suprime)

AH=42

Archivo (pone atributo)

AH=43

Archivo (Inicializa atributo)

DS:DX DL=

Direccin de archivo cadena SI AL=0, atributo devuelto a CX SI AL=1, inicializa archivo con atributo de CX Nmero Unidad (0--implicita,1--unidad A,2-unidad B) Direccin buffer DS:DI--Devuelve direccin de cadena AL--0 si verifica off 1 si verifica on Direccin de cadena para informacin antigua Direccin de cadena para informacin nueva

AH=47

Direccion actual

DS:DI=

AH=54 AH=56

Verifica estado Archivo(renombra)

Ninguna DS:DX ES:DI

Definicin y Tipos de Interrupciones.


La primera cosa de todas, qu son las interrupciones?, bien, las interrupciones son un "mecansmo" por medio del cual hacemos que la CPU deje la tarea en la que estaba para que se vaya a ocupar de otra cosa distinta, es decir, es una forma de llamar la atencin de la CPU de tal forma que cada dispositivo cuando necesita ser atendido por la CPU, emite una interrupcin o seal haciendo que la CPU vaya a atenderla de inmediato. Esto es importantsimo ya que de no existir interrupciones, la CPU debera de ir preguntando, cada cierto tiempo, a los dispositivos para ver si necesitan de su intervencin y como podeis suponer, eso significara lentitud, mucha lentitud. Por tanto, quedaros con que las interrupciones sirven para controlar el hardware, ya que son las que llaman a la CPU cuando este, el hardware, necesita la intervencin de la misma. Las interrupciones se pueden dividir en 2 grupos: 1. Interrupciones de Software. Tambin son conocidas como "falsas interrupciones" ya que se producen como consecuencia de la ejecucin de otra instruccin al no ser el hardware las que las produce. Otra forma de entender estas interrupciones, es verlas desde el punto de vista de llamadas a subrutinas, lgicamente, la gracia est en que esas subrutinas no son nuestras, sino que son las propias de cada sistema operativo, driver o similar tiene. Quedaros pues, con que somos nostros los que hacemos invocamos a la interrupcin. Este tipo de interrupcin es el ms habitual en la programacin. 2. Interrupciones de Hardware. Este tipo de interrupcin es invocado directamente por los dispositivos hardware de nuestro ordenador, por lo que "son bastante ms autnticas" que las anteriores. Al producir algn dispositivo hardware la interrupcin el controlador de interrupciones o PIC se encarga de gestionarla determinando, en el caso de producirse ms de una interrupcin a la vez, cual de ellas tiene ms prioridad y debe de ser gestionada por la CPU. El funcionamiento de este tipo de interrupciones es bastante similar y se suele utilizar mucho para la programacin de sistemas de comunicaciones.

La Tabla de Vectores de Interrupciones.


Seguro que alguno se ha preguntado, "si cuando llamamos a una interrupcin se ejecuta una determinada rutina...dnde narices se encuentra esta rutina?, es ms, cmo sabe nuestra CPU dnde encontrarla?." Bien, la respuesta a estas dos preguntas (y muchas ms) se encuentra en la tabla de vectores de interrupcin. Dicha tabla es una estructura que se crea durante la inicializacin del ordenador y se coloca, en el principio de nuestra memoria (segmento 0 y desplazamiento 0). Dicha estrucutura ocupa y de forma justa 1Kb, ya que dispone de 256 entradas de 4 bytes cada una. Lo importante de todo esto es que, dicha estructura, almacena la direccin, en memoria, de las distintas rutinas que van ligadas a las distintas interrupciones, de tal modo que cuando invocamos, mediante interrupcin software, o se invoca, mediante hardware, una interrupcin, lo que se hace es utilizar un ndice que va ligado a la interrupcin, de tal manera que, con dicho ndice, se acude a la tabla de vectores de interrupcin para que el sistema encuentre la direccin de la rutina en dnde se encuentra el verdadero tratamiento a la interrupcin, es

decir, si se produce la interrupcin x, lo que se hace es acudir a la tabla con el ndice x para encontrar la entrada (recordar que eran 256 entradas con 4 bytes cada una) que contiene la direccin en memoria de la rutina que sirve para tratar a la interrupcin de ndice x. Como cada entrada es de 4 bytes, es fcil adivinar que dichos 4 bytes forman la direccin, ya que 2 de esos bytes se utilizan como segmento y los otros 2 como desplazamiento, total, que ya tenemos la direccin de memoria con la rutina que hay que utilizar. Ahora pensar por un momento que somos nostros los que, conociendo la direccin de memoria de una de esas rutinas, cambiamos dicha rutina por una nuestra para que al producirse una determinada interrupcin ocurra lo que a nosotros nos interese...Como podis observar, las posibilidades son muy interesantes, tan slo tenis que mirar el efecto de luz del Visualizator v:2.0 (ir a senccin de Bjate algo interesante), dicho efecto se consigui poniendo en la rutina que se encargaba de controlar la interrupcin de reloj del sistema, el cdigo necesario para el efecto de luz, con lo que al producirse la interrupcin de reloj se ejecutaba tambin el cdigo del efecto y como la interrupcin de reloj se produce contnuamente, los efectos son muy buenos, vamos, que si queris hacer ese efecto acudiendo a un bucle While lo llevais claro :-(. Espero haber despertado, con este artculo, el inters por saber dominar las interrupciones. Si queris saber ms, tan slo teneis que buscar informacin en libros sobre programacin de dispositivos tales como ratn, VGA, etc, en los que se acude siempre a ellas. Ahora mismo estoy pensando el hacer un artculo sobre como controlar el ratn as que puede que aparezca en esta actualizacin de la revista, adems, es la mejor forma de entender las interrupciones o no?. ;).

http://usuarios.lycos.es/macedoniamagazine/varios2.htm

1.3.1

Hardware.

Ver archivo: Interrupciones 2005.pft


Las interrupciones del HARDWARE son invocadas asincronamente es decir pueden ocurrir en cualquier momento que no se encuentran bajo el control del programa con un dispositivo o evento interno.

Interrupciones internas de hardware Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecucin de un programa. Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas. Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj interno de la computadora, el hardware hace el llamado a esta interrupcin varias veces durante un segundo para mantener la hora actualizada. Aunque no podemos manejar directamente esta interrupcin (no podemos controlar por software las actualizaciones del reloj), es posible utilizar sus efectos en la computadora para nuestro beneficio, por ejemplo para crear un

"reloj virtual" actualizado continuamente gracias al contador del reloj interno. Unicamente debemos escribir un programa que lea el valor actual del contador y lo traduzca a un formato entendible para el usuario. Interrupciones externas de hardware Las interrupciones externas las generan los dispositivos perifericos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. Tambin son generadas por los coprocesadores. No es posible desactivar a las interrupciones externas. Estas interrupciones no son enviadas directamente a la UCP, sino que se mandan a un circuito integrado cuya funcin es exclusivamente manejar este tipo de interrupciones. El circuito, llamado PIC 8259A, si es controlado por la UCP utilizando para tal control una serie de vias de comunicacin llamadas puertos.
http://members.tripod.com/~MoisesRBB/unidad6.htm

1.3.2 Software. Ver archivo: Interrupciones 2005.pft


Por otro lado las interrupciones del SOFTWARE no interrumpen algo si no son variantes de las rutinas las cuales pueden invocarse a voluntad y son controladas por un programa en forma sincrnica o sea, que se conoce con todo lo relacionado con su ejecucin puesto que el programa controla el momento y la manera en que son llamadas mediante la secuencia de instrucciones CALL y RET, cuando un programa ejecuta una instruccin CALL se conoce previamente la direccin de la rutina llamada de tal forma que la CPU pueda saltar al cdigo, que se encuentra ah y ejecutarle. En la mayora de los casos el programa TLINK.EXE determina y asigna las direcciones de las rutinas es claro que el enlazador no puede saber de antemano donde se encuentran las rutinas MS DOS y del BIOS en la memoria de la otra cuando un programa ejecuta una instruccin INT # de interrupcin en la CPU automticamente accesa la memoria baja a fin de obtener el desplazamiento La interrupcin INT n, llama al procedimiento de servicio de instruccin que comienza en la direccin representada en el vector nmero n. La interrupcin IRET es una instruccin especial para retorno y se utiliza para retornar de las instrucciones del Software y Hardware.

Interrupciones de software Las interrupciones de software pueden ser activadas directamente por el ensamblador invocando al nmero de interrupcin deseada con la instruccin INT. El uso de las interrupciones nos ayuda en la creacin de programas, utilizandolas nuestros programas son ms cortos, es ms fcil entenderlos y usualmente tienen un mejor desempeo debido en gran parte a su menor tamao. Este tipo de interrupciones podemos separarlas en dos categorias: las interrupciones del sistema operativo DOS y las interrupciones del BIOS. La diferencia entre ambas es que las interrupciones del sistema operativo son ms fciles de usar pero tambin son ms lentas ya que estas interrupciones hacen uso del BIOS para lograr su cometido, en cambio las interrupciones del BIOS son mucho ms rpidas pero tienen la desventaja que, como son parte del hardware son muy especficas y pueden variar dependiendo incluso de la marca del fabricante del circuito. La eleccin del tipo de interrupcin a utilizar depender unicamente de las caracteristicas que le quiera dar a su programa: velocidad (utilizando las del BIOS) o portabilidad (utilizando las del DOS). Interrupcin 21H Propsito: Llamar a diversas funciones del DOS. Sintaxis: Int 21H Nota: Cuando trabajamos en MASM es necesario especificar que el valor que estamos utilizando es hexadecimal. Esta interrupcin tiene varias funciones, para accesar a cada una de ellas es necesario que el el registro AH se encuentre el nmero de funcin que se requiera al momento de llamar a la interrupcin. Funciones para desplegar informacin al video. 02H Exhibe salida 09H Impresin de cadena (video) 40H Escritura en dispositivo/Archivo

Funciones para leer informacin del teclado. 01H Entrada desde teclado 0AH Entrada desde teclado usando buffer 3FH Lectura desde dispositivo/archivo Funciones para trabajar con archivos. En esta seccin unicamente se expone la tarea especfica de cada funcin, para una referencia acerca de los conceptos empleados refierase a la unidad 7, titulada: "Introduccin al manejo de archivos". Mtodo FCB 0FH Abrir archivo 14H Lectura secuencial 15H Escritura secuencial 16H Crear archivo 21H Lectura aleatoria 22H Escritura aleatoria Handles 3CH Crear archivo 3DH Abrir archivo 3EH Cierra manejador de archivo 3FH Lectura desde archivo/dispositivo 40H Escritura en archivo/dispositivo 42H Mover apuntador de lectura/escritura en archivo Funcin 02H Uso: Despliega un caracter a la pantalla. Registros de llamada: AH = 02H DL = Valor del caracter a desplegar. Registros de retorno: Ninguno Esta funcin nos despliega el caracter cuyo codigo hexagesimal corresponde al valor almacenado en el registro DL, no se modifica ningn registro al utilizar este comando. Es recomendado el uso de la funcin 40H de la misma interrupcin en

lugar de esta funcin. Funcin 09H Uso: Despliega una cadena de carateres en la pantalla. Registros de llamada: AH = 09H DS:DX = Direccin de inicio de una cadena de caracteres Registros de retorno: Ninguno. Esta funcin despliega los caracteres, uno a uno, desde la direccin indicada en el registro DS:DX hasta encontrar un caracter $, que es interpretado como el final de la cadena. Se recomienda utilizar la funcin 40H en lugar de esta funcin. Funcin 40H Uso: Escribir a un dispositivo o a un archivo. Registros de llamada: AH = 40H BX = Va de comunicacin CX = Cantidad de bytes a escribir DS:DX = Direccin del inicio de los datos a escribir Registros de retorno: CF = 0 si no hubo error AX = Nmero de bytes escritos CF = 1 si hubo error AX = Cdigo de error El uso de esta funcin para desplegar informacin en pantalla se realiza dandole al registro BX el valor de 1 que es el valor preasignado al video por el sistema operativo MS-DOS. Funcin 01H Uso: Leer un caracter del teclado y desplegarlo. Registros de llamada: AH = 01H

Registros de retorno: AL = Caracter ledo Con esta funcin es muy sencillo leer un caracter del teclado, el cdigo hexadecimal del caracter ledo se guarda en el registro AL. En caso de que sea un caracter extendido el registro AL contendra el valor de 0 y ser necesario llamar de nuevo a la funcin para obtener el cdigo de este caracter. Funcin 0AH Uso: Leer caracteres del teclado y almacenarlos en un buffer. Registros de llamada: AH = 0AH DS:DX = Direccin del rea de almacenamiento BYTE 0 = Cantidad de bytes en el rea BYTE 1 = Cantidad de bytes ledos desde BYTE 2 hasta BYTE 0 + 2 = caracteres ledos Registros de retorno: Ninguno Los caracteres son ledos y almacenados en un espacio predefinido de memoria. La estructura de este espacio le indica que en el primer byte del mismo se indican cuantos caracteres sern ledos. En el segundo byte se almacena el nmero de caracteres que ya se leyeron, y del tercer byte en adelante se escriben los caracteres ledos. Cuando se han almacenado todos los caracteres indicados menos uno la bocina suena y cualquier caracter adicional es ignorado. Para terminar la captura de la cadena es necesario darle [ENTER]. Funcin 3FH Uso: Leer informacin de un dispositivo o archivo. Registros de llamada: AH = 3FH BX = Nmero asignado al dispositivo CX = Nmero de bytes a procesar DS:DX = Direccin del rea de almacenamiento Registros de retorno: CF = 0 si no hay error y AX = nmero de bytes leidos. CF = 1 si hay error y AX contendra el cdigo del error.

Funcin 0FH Uso: Abrir archivo FCB Registros de llamada: AH = 0FH DS:DX = Apuntador a un FCB Registros de retorno: AL = 00H si no hubo problema, de lo contrario regresa 0FFH Funcin 14H Uso: Leer secuencialmente un archivo FCB. Registros de llamada: AH = 14H DS:DX = Apuntador a un FCB ya abierto. Registros de retorno: AL = 0 si no hubo errores, de lo contrario se regresara el cdigo correspondiente de error: 1 error al final del archivo, 2 error en la estructura del FCB y 3 error de lectura parcial. Esta funcin lo que hace es que lee el siguiente bloque de informacin a partir de la direccin dada por DS:DX, y actualiza este registro. Funcin 15H Uso: Escribir secuencialmente a un archivo FCB Registros de llamada: AH = 15H DS:DX = Apuntador a un FCB ya abierto Registros de retorno: AL = 00H si no hubo errores, de lo contrario contendra el cdigo del error: 1 disco lleno o archivo de solo lectura, 2 error en la formacin o especificacin del FCB. La funcin 15H despus de escribir el registro al bloque actual actualiza el FCB. Funcin 16H Uso: Crear un archivo FCB.

Registros de llamada: AH = 16H DS:DX = Apuntador a un FCB ya abierto. Registros de retorno: AL = 00H si no hubo errores, de lo contrario contendra el valor 0FFH Se basa en la informacin proveida en un FCB para crear un archivo en el disco. Funcin 21H Uso: Leer en forma aleatoria un archivo FCB. Registros de llamada: AH = 21H DS:DX = Apuntador a un FCB ya abierto. Registros de retorno: A = 00H si no hubo error, de lo contrario AH contendra el cdigo del error: 1 si es fin de archivo, 2 si existe error de especificacin de FCB y 3 si se ley un registro parcial o el apuntador del archivo se encuentra al final del mismo. Esta funcin lee el registro especificado por los campos del bloque actual y registro actual de un FCB abierto y coloca la informacin en el DTA (rea de transferencia de disco o Disk Transfer Area). Funcin 22H Uso: Escribir en forma aleatoria en un archivo FCB. Registros de llamada: AH = 22H DS:DX = Apuntador a un FCB abierto. Registros de retorno: AL = 00H si no hubo error, de lo contrario contendr el cdigo del error: 1 si el disco est lleno o es archivo de solo lectura y 2 si hay error en la especificacin de FCB. Escribe el registro especificado por los campos del bloque actual y registro actual de un FCB abierto. Escribe dicha informacin a partir del contenido del DTA (rea de transferencia de disco). Funcin 3CH Uso:

Crear un archivo si no existe o dejarlo en longitud 0 si existe. (Handle) Registros de llamada: AH = 3CH CH = Atributo de archivo DS:DX = Apuntador a una especificain ASCIIZ Registros de retorno: CF = 0 y AX el nmero asignado al handle si no hay error, en caso de haberlo CF ser 1 y AX contendra el cdigo de error: 3 ruta no encontrada, 4 no hay handles disponibles para asignar y 5 acceso negado. Esta funcin sustituye a la 16H. El nombre del archivo es especificado en una cadena ASCIIZ, la cual tiene como caracterstica la de ser una cadena de bytes convencional terminada con un caracter 0. El archivo creado contendra los atributos definidos en el registro CX en la siguiente forma: Valor Atributos 00H Normal 02H Escondido 04H Sistema 06H Escondido y de sistema El archivo se crea con los permisos de lectura y escritura. No es posible crear directorios utilizando esta funcin. Funcin 3DH Uso: Abre un archivo y regrese un handle Registros de llamada: AH = 3DH AL = modo de acceso DS:DX = Apuntador a una especificacin ASCIIZ Registros de retorno: CF = 0 y AX = nmero de handle si no hay errores, de lo contrario CF = 1 y AX = cdigo de error: 01H si no es vlida la funcin, 02H si no se encontr el archivo, 03H si no se encontro la ruta, 04H si no hay handles disponibles, 05H en caso de acceso negado, y 0CH si el cdigo de acceso no es vlido. El handle regresado es de 16 bits.

El cdigo de acceso se especifica en la siguiente forma: BITS 7654321 . . . . 0 0 0 Solo lectura . . . . 0 0 1 Solo escritura . . . . 0 1 0 Lectura/Escritura . . . X . . . RESERVADO Funcin 3EH Uso: Cerrar archivo (Handle). Registros de llamada: AH = 3EH BX = Handle asignado Registros de retorno: CF = 0 si no hubo errores, en caso contrario CF ser 1 y AX contendr el cdigo de error: 06H si el handle es invlido. Esta funcin actualiza el archivo y libera o deja disponible el handle que estaba utilizando. Funcin 3FH Uso: Leer de un archivo abierto una cantdad definida de bytes y los almacena en un buffer especfico. Registros de llamada: AH = 3FH BX = Handle asignado CX = Cantidad de bytes a leer DS:DX = Apuntador a un rea de trabajo. Registros de retorno: CF = 0 y AX = nmero de bytes leidos si no hubo error, en caso contrario CF = 1 y AX = cdigo de error: 05H si acceso negado y 06H si no es vlido el handle. Funcin 40H Uso: Escribe a un archivo ya abierto una cierta cantidad de bytes a partir del buffer designado.

Registros de llamada: AH = 40H BX = Handle asignado CX = Cantidad de bytes a escribir. DS:DX = Apuntador al buffer de datos. Registros de retorno: CF = 0 y AX = nmero de bytes escritos si no hay errores, en caso de existir CF = 1 y AX = cdigo del error: 05H si el acceso es negado y 06H si el handle es invlido. Funcin 42H Uso: Mover apuntador al archivo (Handle) Registros de llamada: AH = 42H AL = mtodo utilizado BX = Handle asignado CX = La parte ms significativa del offset DX = La parte menos significativa del offset Registros de retorno: CF = 0 y DX:AX = la nueva posicin del apuntador. En caso de error CF ser 1 y AX = cdigo de error: 01H si la funcin no es vlida y 06H si el handle no es vlido. El mtodo utilizado se configura como sigue: Valor de AL Mtodo 00H A partir del principio del archivo 01H A partir de la posicin actual 02H A partir del final del archivo Interrupcin 10H Propsito: Llamar a diversas funciones de video del BIOS. Sintaxis: Int 10H Esta interrupcin tiene diversas funciones, todas ellas nos sirven para controlar la entrada y salida de video, la forma de acceso a cada una de las opciones es por medio del registro AH. En este tutorial unicamente veremos algunas de las funciones de esta

interrupcin. Funciones comunes de la interrupcin 10H. 02H Seleccin de posicin del cursor 09H Escribe atributo y caracter en el cursor 0AH Escribe caracter en la posicin del cursor 0EH Escritura de caracteres en modo alfanumrico Funcin 02H Uso: Posiciona el cursor en la pantalla dentro de las coordenadas vlidas de texto. Registros de llamada: AH = 02H BH = Pgina de video en la que se posicionar el cursor. DH = Fila DL = Columna Registros de retorno: Ninguno. Las posiciones de localizacin del cursor son definidas por coordenadas iniciando en 0,0, que corresponde a la esquina superior izquierda hasta 79,24 correspondientes a la esquina inferior derecha. Tenemos entonces que los valores que pueden tomar los registros DH y DL en modo de texto de 80 x 25 son de 0 hasta 24 y de 0 hasta 79 respectivamente. Funcin 09H Uso: Desplegar un caracter un determinado nmero de veces con un atributo definido empezando en la posicin actual del cursor. Registros de llamada: AH = 09H AL = Caracter a desplegar BH = Pgina de video en donde se desplegar BL = Atributo a usar Nmero de repeticiones. Registros de retorno: Ninguno Esta funcin despliega un caracter el nmero de veces especificado en CX

pero sin cambiar la posicin del cursor en la pantalla. Funcin 0AH Uso: Desplegar un caracter en la posicin actual del cursor. Registros de llamada: AH = 0AH AL = Caracter a desplegar BH = Pgina en donde desplegar BL = Color a usar (slo en grficos). CX = Nmero de repeticiones Registros de retorno: Ninguno. La nica diferencia entre esta funcin y la anterior es que sta no permite modificar los atributos, simplemente usa los atributos actuales. Tampoco se altera la posicin del cursor con esta funcin. Funcin 0EH Uso: Deplegar un caracter en la pantalla actualizando la posicin del cursor. Registros de llamada: AH = 0EH AL = Caracter a desplegar BH = Pgina donde se desplegara el caracter BL = Color a usar (solo en grficos) Registros de retorno: Ninguno Interrupcin 16H Propsito: Manejar la entrada/salida del teclado. Sintaxis: Int 16H Veremos dos opciones de la interrupcin 16H, estas opciones, al igual que las de otras interrupciones, son llamadas utilizando el registro AH. Funciones de la interrupcin 16H

00H Lee un caracter de teclado 01H Lee estado del teclado Funcin 00H Uso: Leer un caracter del teclado. Registros de llamada: AH = 00H Registros de retorno: AH = cdigo de barrido (scan code) del teclado AL = Valor ASCII del caracter. Cuando se utiliza esta interrupcin se detiene la ejecucin del programa hasta que se introduzca un caracter desde el teclado, si la tecla presionada es un caracter ASCII su valor ser guardado en el registro AH, de lo contrario el cdigo de barrido ser guardado en AL y AH contendr el valor 00H. El cdigo de barrido fu creado para manejar las teclas que no tienen una representacin ASCII como [ALT], [CONTROL], las teclas de funcin, etc. Funcin 01H Uso: Leer estado del teclado. Registros de llamada: AH = 01H Registros de retorno: Si la bandera de cero, ZF, est apagada significa que hay informacin en el buffer, si se encuentra prendida es que no hay teclas pendientes. En caso de existir informacin el registro AH contendr el cdigo de la tecla guardada en el buffer. Interrupcin 17H Propsito: Manejar la entrada/salida de la impresora. Sintaxis: Int 17H Esta interrupcin es utilizada para escribir caracteres a la impresora, inicializarla y leer su estado.

Funciones de la interrupcin 16H 00H Imprime un caracter ASCII 01H Inicializa la impresora 02H Proporciona el estado de la impresora Funcin 00H Uso: Escribir un caracter a la impresora. Registros de llamada: AH = 00H AL = Caracter a imprimir DX = Puerto a utilizar Registros de retorno: AH = Estado de la impresora. El puerto a utilizar, definido en DX, se especifica as: LPT1 = 0, LPT2 = 1, LPT3 = 2 ... El estado de la impresora se codifica bit por bit como sigue: BIT 1/0 SIGNIFICADO ---------------------------------------0 1 Se agot el tiempo de espera 123 1 Error de entrada/salida 4 1 Impresora seleccionada 5 1 Papel agotado 6 1 Reconocimiento de comunicacin 7 1 La impresora se encuentra libre Los bits 1 y 2 no son relevantes. La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen algunos que soportan 4. Funcin 01H Uso: Inicializar un puerto de impresin. Registros de llamada: AH = 01H

DX = Puerto a utilizar Registros de retorno: AH = Status de la impresora El puerto a utilizar, definido en DX, se especifica as: LPT1 = 0, LPT2 = 1, etc. El estado de la impresora se codifica bit por bit como sigue: BIT 1/0 SIGNIFICADO ---------------------------------------0 1 Se agot el tiempo de espera 123 1 Error de entrada/salida 4 1 Impresora seleccionada 5 1 Papel agotado 6 1 Reconocimiento de comunicacin 7 1 La impresora se encuentra libre Los bits 1 y 2 no son relevantes. La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen algunos que soportan 4. Funcin 02H Uso: Obtener el estado de la impresora. Registros de llamada: AH = 01H DX = Puerto a utilizar Registros de retorno: AH = Status de la impresora. El puerto a utilizar, definido en DX, se especifica as: LPT1 = 0, LPT2 = 1, etc. El estado de la impresora se codifica bit por bit como sigue: BIT 1/0 SIGNIFICADO ---------------------------------------0 1 Se agot el tiempo de espera

123 1 Error de entrada/salida 4 1 Impresora seleccionada 5 1 Papel agotado 6 1 Reconocimiento de comunicacin 7 1 La impresora se encuentra libre Los bits 1 y 2 no son relevantes. La mayoria de los BIOS unicamente soportan 3 puertos paralelos aunque existen algunos que soportan 4.

Introduccin
Todo el semestre hemos usado interrupciones para hacer llamado a servicios de DOS y BIOS; hasta ahora, principalmente las hemos visto como formas de llamar al sistema operativo. La razn por la que este sistema es llamado "interrupcin" es precisamente porque funcionan interrumpiendo la ejecucin del programa en un punto dado, ejecutan una labor determinada y regresan a donde estaban. Es como estar trabajando en la tarea, recibir una llamada telefnica, atenderla y al terminar lograr regresar exactamente al estado previo para continuar con la tarea Existen dos tipos de interrupciones:

Interrupciones de hardware: son las ms primitivas y origen del concepto. Estn diseadas para que el procesador pueda atender a los dispositivos an a mitad de la ejecucin de un programa que no est detectndolos. Interrupciones de software: permiten al software emular las operaciones que se hacen al atender el hardware. Tambin permiten contener una interfase universal a los servicios del sistema operativo, que son independientes de las versiones del sistema operativo.

Cuando un dispositivo requiere atencin del CPU, le avisa por medio de una seal (electrnica) que llamamos "Interrupcin". Esta seal fsicamente llega a un pin del CPU; cuando esto ocurre, el CPU termina la instruccin que estaba ejecutando, salva en la pila la direccin actual (CS, IP) para poder continuar ms adelante en el punto donde se qued, y salta a ejecutar el cdigo de atencin de la interrupcin, que generalmente es parte del sistema operativo. Dado que el cdigo que atiende la interrupcin puede encontrarse en distintos lugares de memoria, se requiere algn mecanismo para que el CPU encuentre eficientemente donde continuar la atencin de la interrupcin. Este mecanismo es conocido como "tabla de interrupciones", y se basa en reconocer por un cdigo a cada interrupcin, el cual ser usado para la bsqueda en esta tabla. Esta tabla de interrupciones la encuentra el 80x86 al inicio de la memoria, en el primer 1 Kb. Est formada por un arreglo de 256 direcciones, cada una de 32 bits, pues contiene al

segmento y al desplazamiento (en orden inverso, como es costumbre en Intel). De modo que si se recibe el cdigo de interrupcin 0, se consulta la informacin en la localidad 0:0, y de ah se obtienen el segmento y el desplazamiento correspondientes. Si se recibe el cdigo de interrupcin 8, se consulta la informacin en la localidad 0:20h (20h = 32 = 8 por 4, dado que cada entrada en el arreglo tiene 4 bytes), y de ah se ejecuta el cdigo correspondiente. Al terminar el cdigo de atencin de la interrupcin, ejecuta una instruccin IRET, que regresa el punto de ejecucin a donde se haba quedado, Funcionan de un modo similar a las de hardware, solamente que en vez de que un dispositivo enve la seal, lo hace el programa utilizando la instruccin INT. Esta instruccin causa que se ejecute todo el proceso anterior, pero sealada por un programa.

Programas residentes / programas transientes


La mayor parte de los programas con los que hemos trabajado son programas "transientes", es decir, se cargan en memoria, se ejecutan y al terminar su ejecucin, regresan el control al sistema operativo y se eliminan de memoria. Un programa residente (Terminate and Stay Resident, de ah las siglas TSR comnmente usadas) consiste en que un programa se carga en memoria, se ejecuta, prepara la ejecucin de la segunda seccin (por medio de un control fino sobre las interrupciones), y libera solamente la memoria del cdigo de preparacin. De este modo, una seccin de su cdigo queda "latente", en espera de ser disparado por un evento: generalmente, una interrupcin. Entre las aplicaciones de los programas residentes tenemos:

El sistema operativo DOS: queda en memoria esperando a que otro programa lo llame, para entonces ejecutar un determinado cdigo. Programas que esperen una combinacin de teclas, para entonces realizar su accin. Por ejemplo, sacar un men con acciones especficas. Programas que sustituyan la funcionalidad del sistema operativo. Por ejemplo, las versiones 2 a 3 de Novell Netware se cargaban despus de DOS, y le anexaban la capacidad de acceder a unidades de red.

Programacin de TSRs
Para programar un TSR, utilizaremos una serie de servicios de interrupciones que nos facilitan la capacidad de dejar una seccin del programa activa, as como cambiar la direccin a la que apunta una interrupcin. Resumiendo, tendremos dos grandes secciones en un programa residente:

La seccin transiente, que lleva a cabo la inicializacin requerida y prepara los vectores de interrupcin (las direcciones que estn en la tabla), de modo que apunten a los procedimientos del programa residente que van a atenderlas. La seccin residente, la cual contiene los procedimientos de atencin a las interrupciones. Terminar un programa y dejar una seccin residente en memoria.

Cuando llamamos al servicio 4Ch de la INT 21h, toda la memoria que ocup nuestro programa se marca como libre y el sistema operativo puede reutilizarla. Esto sera desastroso en el caso de un programa residente, pues el cdigo que atiende interrupciones podra sobreescribirse, con resultados impredecibles. Por ello, se debe terminar el programa de modo que deje ocupada su memoria. Para ello, existen varias opciones:

La interrupcin 27h, que termina el programa y deja residente en memoria la zona indicada por DS:DX, donde DS apunta al segmento donde se encuentra el cdigo, y DX al desplazamiento final del cdigo que debe respetarse. De este modo, no se liberar memoria indebidamente. Servicios de la 21h, que no veremos en este curso.

Interceptar una interrupcin


Para que se ejecute un procedimiento que nosotros desarrollamos, en atencin de una interrupcin, es comn usar la tcnica de "interceptar", que consiste en guardar el vector anterior de interrupcin, cambiarlo para que apunte a nuestro programa residente, y al final de nuestra rutina residente, llamar al vector anterior. Esto conserva la funcionalidad regular, y al mismo tiempo nos permite realizar actividades adicionales. Cabe aclarar algunas de las interrupciones importantes que no hemos comentado por no ser tan usadas en software:

INT 08h - es llamada por el reloj del sistema, 18.2 veces por segundo, y entre otras cosas lleva el tiempo de BIOS. Podemos interceptarla (no sustituirla) para que nuestro programa realice algn proceso peridicamente. INT 09h - es llamada por el teclado, cada vez que se recibe una tecla. INT 0Ch - de software, es llamada por la interrupcin del reloj.

Obviamente hay muchas otras, sirvan estas como ejemplo. Se pueden interceptar las interrupciones generadas por puertos seriales, paralelos, divisin entre 0, una instruccin invlida, etctera.

Sustituir una interrupcin


En ocasiones queremos reemplazar completamente el funcionamiento de una interrupcin; en tal caso, sustituiremos el vector de interrupcin para que apunte a nuestro cdigo, y deberemos terminar la ejecucin de nuestro procedimiento con un IRET, que permitir regresar al punto donde se ejecut nuestra interrupcin. Por otro lado, es conveniente asegurarnos de conservar el valor de los registros (generalmente utilizando la pila) que modifiquemos, de este modo la interrupcin no afecta la ejecucin de otros procesos. Acciones vlidas dentro de una interrupcin En una interrupcin podemos utilizar otros servicios, principalmente de acceso directo al hardware. Sin embargo, como DOS es un sistema operativo que no fue diseado para ser multitarea, diversas funciones no soportan la capacidad de ser reentrantes; esto es, no pueden ser llamadas otra vez si estn a medio ejecutarse. Pero como una interrupcin puede ocurrir en cualquier momento, puede incluso ocurrir cuando est una funcin a medio ejecutarse. Por tanto, esto causara inestabilidad del sistema. Existen dos mtodos para evitar esta inestabilidad:

No usar interrupciones, que es bastante comn y apropiado pues tambin tiene grandes beneficios de desempeo; cuando un programa residente no requiere hacer funciones complejas que estn implementadas en el sistema operativo, sino funciones simples tales como pintar en pantalla, pueden codificarse estas funciones con acceso directo al hardware y de este modo se evita el problema. Revisar si est una funcin del sistema en ejecucin, para no volver a llamarla a mitad de la ejecucin. Esto en DOS se hace por medio de un mtodo que durante mucho tiempo no estaba documentado: la bandera InDOS. Para obtenerla, se llama al servicio 34h de la interrupcin 21h, y nos deja en ES:BX la direccin de un byte que es esta bandera InDOS. El funcionamiento de la bandera es sencillo: si est en 0, no estamos a media funcin de DOS, por lo tanto, podemos sin problemas ejecutar una funcin DOS. De lo contrario, si el valor es 1 o superior, no debemos ejecutar la funcin DOS en este momento y nuestro programa TSR deber posponer el uso de esta funcin, por lo que probablemente deberemos manejar la interrupcin del reloj para intentar despus de un tiempo.

Existen algunas precauciones adicionales que tomar en TSRs, sin embargo, como no siempre son requeridas, se hace la referencia al PC Interno y otros libros de la bibliografa. http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase26.htm

Ejemplos
1. Programa residente muy simple
; RESIDE.ASM: Pequeo programa residente ; Se ejecuta, y cuando se presiona Ctrl + N invierte los colores de fondo y frente ; en toda la pantalla, usando la memoria de video para modificar el atributo. ; PushA Macro PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES EndM POPA Macro POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX EndM ; Buffer del teclado de BIOS

BiosData Segment AT 40h ORG 1Ah Head DW ? Tail DW ? Buffer DW 16 DUP (?) Buffer_End Label Word BiosData EndS ; Segmento de cdigo Code Segment Assume CS:Code Assume DS:Code Assume SS:Code Assume ES:Code ORG 100h Start: JMP Inicio ; Variables OldInt Label Word DirAnt DD BanderaLleno DB 0 ?

; Rutina de atencin de Interrupcin ParteRes Proc Near Assume CS:Code,DS:Code PushA PushF CALL CS:DirAnt rutina que necesaria, el buffer programas

; IMPORTANTE: Es una llamada FAR a la ; anteriormente atenda al teclado; es ; pues esa rutina se encarga de manejar ; de teclado y yo lo voy a usar. Otros ; posiblemente en vez de CALL hagan un ; JMP FAR [CS:DirAnt] ; DESPUS de realizar su funcin

ASSUME DS:BiosData MOV BX,BiosData MOV DS,BX MOV BX,Tail CMP BX,Head JE Fin CALL ChecaTecla CMP AX,310Eh ; ^N JNE Fin MOV Tail,BX ; Invertir color de pantalla MOV CX,2000 MOV AX,0B800h MOV ES,AX MOV DI,0 Ciclo: MOV AX,ES:[DI]

XOR AH,07Fh ; Invierte atributo, todos los bits correspondientes a colores MOV ES:[DI],AX INC DI INC DI LOOP Ciclo Fin:PopA IRET ParteRes EndP ChecaTecla Proc Near MOV DX,Tail SUB DX,2 CMP DX,OFFSET Buffer JAE OK MOV DX,OFFSET Buffer_End SUB DX,2 OK: MOV BX,DX MOV AX,[BX] RET ChecaTecla EndP Inicio: PUSH PUSH POP CLI PUSH XOR MOV MOV (reloj) LEA MOV MOV MOV MOV MOV MOV POP STI LEA INT RET Fin2: Code EndS END Start DS CS DS ES AX,AX ES,AX DI,36 ; 9*4 ; Pues estamos interceptando la interrupcin 9 BX,ParteRes AX,ES:[DI] OldInt,AX ES:[DI],BX AX,ES:[DI+2] OldInt+2,AX ES:[DI+2],DS ES DX,Fin2 27h

http://www.sinergiaweb.com.mx/clases/asm9708/programa/reside.asm
1. Programa de reloj residente
; Programa de reloj residente ; Bruno Guardia Robles. .MODEL TINY ; .COM ; Se ensambla con TASM RELOJRES ; TLINK RELOJRES /t = COM (ver TLINK para ayuda)

.CODE PushA Macro PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES EndM POPA Macro POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX EndM ORG 100h JMP Inicializa ? ? ? 0 0 0 0 0 0 0 0

Start:

; Variables Horas DB Minutos DB Segundos DB PMFlag DB DivHi DW DivLo DW ResultHi DW ResultLo DW Actual DB Divisor DB Contador DB

LeeReloj Proc Near ; Regresa en DX:AX el valor actual del reloj contador interno de BIOS. PUSH ES MOV AX,40h MOV ES,AX MOV DI,6Ch MOV AX,ES:[DI] PUSH AX ADD DI,2 MOV AX,ES:[DI] POP DX POP ES RET LeeReloj EndP DobleDiv Proc Near ; Hace una divisin de Doble Palabra entre Byte dejando Doble Palabra ; Rutina para estar orgulloso, fue latosa y est basada en corrimientos, tal

; como se divide binario a mano. XOR AX,AX MOV Actual,AL MOV ResultLo,AX MOV ResultHi,AX MOV CX,33 ; 32 ciclos Ciclo: MOV AL,Actual CMP AL,Divisor PUSHF JB NoCarry STC ; Encender el Carry si es mayor o igual JMP SHORT Rotar NoCarry: CLC ; Apagar el Carry Rotar: RCL ResultLo,1 RCL ResultHi,1 POPF JB ContCiclos ; Si Actual es menor al Divisor, restar Divisor al Actual SUB AL,Divisor MOV Actual,AL ContCiclos: ; Rotar el dividendo ROL DivLo,1 RCL DivHi,1 ; El bit m s significativo entra a Actual RCL Actual,1 LOOP Ciclo ; En Actual qued el residuo RET DobleDiv EndP ; Calcular la hora en base al valor del contador de reloj de BIOS Calcula2 Proc Near ; Primero multiplicar DX:AX por 5 XCHG AX,DX PUSH DX PUSH AX PUSH DX PUSH AX ROL AX,1 RCL DX,1 ROL AX,1 RCL DX,1 POP BX POP CX ADD AX,BX ADC DX,CX ; Ahora, dividir DX:AX entre 91 MOV DivHi,DX MOV DivLo,AX MOV Divisor,91 CALL DobleDiv ; Calcular el factor de correccin como Ciclos/50269 ; Aproximadamente cada 50000 ciclos se adelanta un segundo ; Las pruebas que hice dan resultados entre 50200 y 50300 ; Como factor promedio usar 50260 ; Con esto el error se reduce a 1 segundo, 1 segundo y medio ; El factor es m s exacto por la noche, mientras que el ; c lculo de Ciclos*5/91 es m s exacto temprano, lo que los ; equilibra bastante.

POP AX POP DX MOV CX,50260 DIV CX MOV BX,AX ; Sacar el resultado de la doble divisin MOV DX,ResultHi MOV AX,ResultLo CLC SUB AX,BX ; Restar factor de correccin SBB DX,0 ; Dividir entre 60 para obtener minutos y segundos. MOV CX,60 DIV CX MOV Segundos,DL DIV CL MOV Minutos,AH MOV Horas,AL ; Establecer la bandera de AM/PM MOV PMFlag,0 CMP Horas,12 JL FinCalcula INC PMFlag CMP Horas,12 JE FinCalcula SUB Horas,12 FinCalcula: RET Calcula2 EndP ; Pintar el valor de dos dgitos en la posicin actual ES:DI DespByte Proc Near MOV CL,10 XOR AH,AH DIV CL ADD AX,3030h MOV BL,AH MOV AH,31 ; Blanco sobre azul MOV ES:[DI],AX ADD DI,2 MOV AL,BL MOV ES:[DI],AX ADD DI,2 RET DespByte EndP ; Pintar el reloj por acceso directo a memoria Despliega Proc Near PUSH ES MOV AX,0B800h MOV ES,AX MOV DI,138 ; Columna 80-11 de ancho=69*2 bytes c/columna=138 MOV AL,Horas CALL DespByte MOV AL,':' MOV ES:[DI],AX ADD DI,2 MOV AL,Minutos CALL DespByte MOV AL,':'

MOV ADD MOV CALL MOV MOV ADD MOV CMP JNE MOV ImpAMPM: MOV ADD MOV MOV POP RET Despliega EndP

ES:[DI],AX DI,2 AL,Segundos DespByte AL,' ' ES:[DI],AX DI,2 AL,'a' PMFlag,1 ImpAMPM AL,'p' ES:[DI],AX DI,2 AL,'m' ES:[DI],AX ES

; Rutina residente!!! ; Podra ser PROC Inicio: PUSHA PUSHF CALL CALL CALL Salir: POPF POPA IRET porque es la ; Guardar todos los registros ; y adems las banderas LeeReloj Calcula2 Despliega ; Restaurar banderas ; y registros ; Terminar rutina de interrupcin; esto solamente

; interrupcin 1Ch, que no tiene una funcin predefinida. Si fuera ; otra, habra que saltar a la rutina que anteriormente atenda la ; interrupcin ; Parte no residente del programa; debe ponerse al final, para que se use la ; Interrupcin 27h Inicializa: ; Ajustar DS PUSH DS PUSH CS POP DS PUSH ES ; Apuntar ES al segmento 0 XOR AX,AX MOV ES,AX ; Muy importante: Desactivar Interrupciones cuando vamos a ajustar el vector CLI LEA BX,Inicio MOV AX,CS ; Ajustar el vector de interrupcin del Reloj: en BX el desplazamiento de la ; rutina que atiende al reloj, en AX el segmento. MOV ES:[1Ch*4],BX MOV ES:[1Ch*4+2],AX STI

; Restaurar ES POP ES ; DS:DX apuntan al final de la zona que va a quedar residente LEA DX,Inicializa INT 27h ; Terminar pero dejar parte residente END Start

http://www.sinergiaweb.com.mx/clases/asm9708/programa/relojres.asm 1.4 Estructura de un programa en ensamblador.


Un programa en lenguaje ensamblador se compone de las siguientes partes:
rea de comentarios Definicin del modelo de memoria rea de datos 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 definicin del modelo de memoria es la parte donde se indica que tipo de cdigo se va generar (16 o 32 bits). En este trabajo slo se escribirn programas ejecutables .COM, por lo que siempre se usa la directiva .MODEL TINY. El rea de datos es el lugar donde deben ser declaradas las constantes y variables del programa. Las variables son declaradas despus de la directiva .DATA y las constantes despus de .CONST. En el cuerpo del programa es donde se colocan las instrucciones en lenguaje ensamblador que se encargarn 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 se debe indicar un punto de entrada al programa. El punto de entrada se indica por medio de una etiqueta antes de la primer instruccin 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 instruccin END INICIO. Cuando se requiere comentar las instrucciones de un programa, se debe colocar un punto y coma (;) y as el ensamblador interpreta todo lo que sigue como un comentario de una sola lnea. Si requiere comentarios de ms de una lnea puede usar la directiva .COMMENT.

http://www.monografias.com/trabajos11/lenen/lenen.shtml FORMATO DE INSTRUCCIONES.


Un programa en lenguaje ensamblador es una serie de sentencias ejecutables que le dicen al ensamblador que operaciones tiene que realizar. Cada sentencia de lenguaje ensamblador esta compuesto de cuatro campos:

CAMPO NOMBRE

CAMPO OPERACIN

CAMPO OPERANDO

CAMPO COMENTARIO

Sin embargo, ciertas instrucciones del ensamblador no utilizan todos los campos. El campo comentario existe para expresar propsitos o documentacin de programacin interna y es opcional.

CAMPO NOMBRE:
El campo del nombre, algunas veces denominado el campo de rtulo, asigna un nombre simblico, a la direccin de comienzo de memoria real de una instruccin del ensamblador. Esto permite al programador que referencie una instruccin por nombre y elimine la necesidad de seguir la pista de direcciones de las instrucciones, esto es especialmente til al generar cdigo reubicable. Al utilizar una referencia simblica, el programador permite al enlazador (linker) seleccionar en que sitio de memoria ser cargado el programa en lenguaje ensamblador. Aunque a cualquier instruccin se le puede dar un nombre, este campo esta habitualmente reservado para aquellas instrucciones que sern reverenciadas en las definiciones de datos, constantes, lazos, bifurcaciones y llamadas a subrutinas. Un nombre debe comenzar con un carcter alfabtico y puede contener hasta 31 caracteres, incluyendo:
Todas las letras de la (A a la Z, a a la z) Dgitos numricos del (0 al 9) Los smbolos especiales siguientes (-$.?@%)

Debe de tenerse precaucin al seleccionar un nombre. No se puede utilizar un nombre que coincida con una palabra reservada o directivo del ensamblador. Si el nombre incluye un punto (.), entonces el punto debe ser el primer carcter. Un campo nombre puede ser un nombre simblico que represente:
Nombre de etiqueta Nombre de constantes Nombre de variables Nombre de procedimiento Nombre de macro

CAMPO OPERACION:
El campo de operacin contiene un mnemotcnico para una instruccin real del microprocesador. El mnemnico de operacin hace el cdigo ms fcil de leer y comprender y es solamente una tabla de conversin interna del valor

binario de cdigo mquina real. Una operacin o nemotcnico, puede representar una instruccin mquina, macroinstruccin o pseudo-operacin.
Ejemplo : INITAL: MOV AX, OH

INITAL es un rtulo y MOV es una operacin. Siguiendo al campo de operacin se encuentra el campo de operando, cada operacin no solo le dice al ensamblador que instruccin debe ejecutar sino cuantas operaciones se necesitan y de que tipo. Una operacin puede contener una referencia a una macro tal referencia indica al ensamblador como procesar una secuencia predefinida de cdigo. El campo operacin, esta representado por un mnemnico. Se tienen dos tipos de mnemnicos:
Pseudo - operacin Cdigo de operacin (directivas) (instrucciones)

Directivas = macros. Instrucciones = programa.

la directiva nos sirve para definir, variables, constantes, son los cdigos que se ejecutan durante la ejecucin del

CAMPO OPERANDO :
El campo operando contiene la posicin o posiciones donde estn los datos que van hacer manipulados por la instruccin de la operacin, si la instruccin requiere uno o dos operados. Los operados estn separados de la instruccin por al menos un espacio en blanco. Si hay operaciones que no requieren operados. Cuando una operacin requiere dos operados, el primer operando se denomina operando destino y el segundo operando fuente. Operaciones de transferencia de datos, registros, almacenamiento inmediato y almacenamiento de memoria. Son ejemplos de instrucciones que requieren dos operandos por ejemplo:
MOV AX, 8

Este es un ejemplo de operando inmediato. Aqu, el dato a ser manipulado se incluye como operando fuente y se desplaza al registro AX, u operando destino.

CAMPO COMENTARIO:
El campo comentario es l ultimo de los cuatro campos y puede ser uno de los mas tiles. El campo comentario se utiliza para documentar internamente el cdigo fuente del ensamblador. Los comentarios son ignorados por el ensamblador y son tiles solo al listar el cdigo fuente. Si un comentario se

incluye con una instruccin de operacin entonces debe estar separado del ltimo campo por al menos un espacio en blanco y comenzar con un punto y coma (;). Un comentario debe ser utilizado para describir aquellas lneas de cdigo fuente que no son comprensibles inmediatamente. Por ejemplo:
MOV AH, 45H ; PARAMETO PARA LEER UN CARACTER

Como se muestra, el comentario explica por que el registro AH esta siendo cargado con 45H. En este caso, el 45H es utilizado para disparar la accin apropiada cuando se llame a una interrupcin. Un programa bien documentado no tiene por que incluir comentarios en cada instruccin y se recomienda:

No utilizar en los comentarios abreviados cuyo significado resulte poco claro. Comentar todas las definiciones de smbolos, reservas de memoria, definicin de constantes, propsito del programa, los subprogramas, etc. Hacer comentarios escuetos, los detalles se adjuntan en documentos apartes. Comentar todos los puntos clave *no comentar instrucciones sin dificultad en su comprensin. Indicar en el comentario la tarea que se quiere ejecutar con una instruccin o secuencia de instrucciones.

Los delimitadores que podemos usar en cada una de las lneas son: : (Dos puntos) despus de una etiqueta (Espacio) entre el cdigo de operacin y operando , (Coma) entre operando del mismo tipo ; (Punto y coma) precede un comentario

FORMATO DE UN PROGRAMA
Existen ciertas normas para crear un programa en lenguaje ensamblador. La primera se refiere al formato interno de cada instruccin del lenguaje. Toda lnea de cdigo debe digitarse bajo ciertas reglas, las cuales pueden considerarse como la sintaxis propia del lenguaje. La segunda norma es el formato externo del programa, que puede equipararse con una capa que rodeara al programa para ayudar a definir su entorno.

EL FORMATO EXTERNO
El formato externo esta formado por varios comandos clave que permiten establecer el entorno operativo del programa.

En el ensamblador se utilizan dos formatos bsicos para desarrollar la programacin. En un mtodo se utilizan modelos de memoria y, en el otro definiciones de segmento completo. Los modelos de memoria son exclusivos del programa MASM para ensamblador. Las definiciones de segmento completo son comunes para casi todos los ensambladores. El mtodo que utiliza los modelos de memoria son ms fciles de usar, pero las definiciones de segmento completo ofrecen mayor control de la tarea del lenguaje ensamblador.

USO DE MODELOS:
PROGRAMA QUE DESPLIEGA UNA CADENA EN LA PANTALLA ; Nombre del programa ; Fecha de creacin ; Autor ; Objetivo ; COMANDO DE ENSAMBLE ; COMANDO DE ENLACE ; COMANDO DE EJECUCION ; Define el modelo de memoria ; . MODEL SMALL . CODE Empieza : MOV AX, @DATA MOV DS, AX MOV DX, OFFSET MENSAJE MOV AH, 9 INT 21H MOV AX, 4c00h INT 21h .DATA Mensaje DB 'Hola, .qu tal!.$' .STACK END Empieza : EJ02CA03.ASM : ABRIL 19 DE 1993 : J.A. Rojas Ponce : Desplegar una cadena : MASM EJ02CA03 ; : LINK EJ02CA03 ; : EJ02CA03 [ENTER] ; Modelo de memoria ; Area de cdigo ; Etiqueta de comienzo de programa ; Inicializa Ds con la ; Direccin de @DATA ; Direccin de mensaje ; en DX para poder desplegarlo ; a travs de la Int 21 de MS-DOS . ; regresa a MS-DOS por medio de la ; Funcin 4c. ; Segmento de datos ; Cadena a desplegar ; Se necesita una PILA. ; Fin del programa

El primer comando .MODEL SMALL, es una directiva simplificada que le indica al ensamblador como sern accesadas las instrucciones y los datos (a travs de sus segmentos especficos). El comando .CODE, tambin es una directiva simplificada, le indica al ensamblador que el siguiente grupo de instrucciones es el cdigo a ejecutar. Las dos instrucciones siguientes lo nico que hacen es regresar el control a MS-DOS (despus de ejecutar el programa) siguiendo ciertas normas, que en este caso consisten en cargar el registro AX con el cdigo 4C00H (cdigo de terminacin del programa) y despus hacer la indicacin a travs de la interrupcin 21H.

El comando .STACK indica que se necesita reservar un espacio de memoria para las operaciones de pila, y finalmente el comando END Empieza seala el final del bloque de cdigo y por END el final del programa. Para crear un programa ejecutable en MASM teclee los siguientes comandos en la lnea de interaccin de MS-DOS:
C:\MASM Ej00ca03 C:\LINK Ej00ca03

DEFINICION DE SEGMENTO COMPLETO


Aqu un programa parece ser ms largo pero esta ms estructurado que en el mtodo de modelo para inicializar un programa. El primer segmento definido es el segmento de PILA, A continuacin el segmento de DATOS y que sirve para definir cada uno de los datos a usar en el programa. Y por ultimo el segmento de CODIGO.
; PROGRAMA EJEMPLO STACK SEGMENT PARA STACK DB 64 DUP STACK ENDS DATA SEGMENT PARA 'DATA' MESAGE DB AHORA LO QUE ABUNDA ES EL AMOR,$ DATA ENDS CODE SEGMENT PARA CODE MAIN PROC FAR ASSUME CS: CODE, DS: DATA, ES: DATA, SS: STACK PUSH DS SUB AX,AX PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX ; RUTINA PARA IMPRIMIR LA CADENA LEA DX, MESAGE MOV AH, 09 INT 21H RET MAIN ENDP CODE ENDS END

Para crear un programa ejecutable se puede utilizar el ensamblador Turbo Asemblet, para esto teclee los siguientes comandos en la lnea de interaccin de MS-DOS:
C:\TASM Ejemplo1 C:\TLINK Ejemplo1

Estructura de un programa en ensamblador Ya hemos estudiado algunas partes del programa en lenguaje ensamblador. Slo nos falta conocer la parte ms importante: las instrucciones. Pero antes de eso, veremos cual es la estructura bsica de un algoritmo en cdigo ensambladora con la finalidad de ener claro cual es la estructura de todos los elemento que acabamos de ver. Esto lo veremos ms a fondo cuando veamos todo lo concerniente a la programacin. Esta estructura contiene los siguientes elementos o partes que deben ser codificadas: - Comentario descriptivo del programa (opcional, pero recomendable) - Definir el microcontrolador que se usar (con las directrices LIST e INCLUDE). - Introducir las opciones de compilacin (que sern vistas ms adelante)(opcional) - Establecer las constantes que se usarn (con la directriz EQU). - Reservar espacios de memoria (directriz RES) (si es necesario) - Configurar los puertos - Desarrollar el programa - Poner comentarios Y su estructura es:

Figura 41. Esquema de un programa

Hemos visto la estructura general. Ahora veremos la posicin de los elementos del cdigo por columnas. Estas se dividen en cuatro: Columna 1: Etiqueta. Las etiquetas se rigen por las siguientes normas: Debe situarse en la primera columna Debe contener nicamente caracteres alfanumricos El mximo de caracteres es de 31 Columna 2: Operacin. En esta columna se situarn las instrucciones

Columna 3: Son los registros (f, l o k , b y w) donde se almacenarn los resultados y con los que se operar Columna 4: Comentario. Aqu se situar cualquier comentario personalizado que deseemos. Estos son tiles para saber qu hace un programa sin tener que descifrar el cdigo entero. El compilador (ensamblador) ignorar todo texto ms all del carcter punto y coma ;. Estos comentarios generalmente se sitan en la cuarta columna para describir la accin de una lnea de cdigo, pero pueden situarse en cualquier parte de programa para describir cualquier otro evento, siempre que estn despus del carcter ; (semicolon en ingls).

Veamos ms detenidamente cual es su posicin:

Figura 42. Esquema de un programa por columnas

Normalmente las columnas son separadas por una tabulacin. El espacio mnimo entre dos columnas es de un carcter, que puede ser un espacio en vez de una tabulacin. http://usuarios.lycos.es/sfriswolker/pic/seis.htm

ver archivo: EstructuraEnsamblador.pdf

1.4.1

Data segment.

DS, Data Segment: Es el segmento destinado a ser usado junto con BX, SI y DI para apuntar a una direccin de memoria. Tambin puede ser usado con BP y SP, pero hace falta expresarlo concretamente.
DS = Registro de segmento de datos. Contiene la direccin del segmento de datos, es decir, el rea de memoria donde se encuentran los datos del programa.

DS: Data Segment (Segmento de Datos) Este registro selecciona una seccin de 64 Kb. que se dedica generalmente a colocar en ella nuestras variables, por lo cual toma su nombre: seccin de memoria dedicada a datos.

1.4.2

Snack segment.

SS, Stack Segment: El segmento de Stack; junto con SP apuntan a la ltima posicin que fue utilizada para "depositar" datos en el Stack. SS = Registro de segmento de pila. Contiene la direccin del segmento de pila. http://www.pablin.com.ar/computer/cursos/varios/introasm.htm SS: Stack Segment (Segmento de Pila) Este registro selecciona la regin de 64 Kb. que va a contener la pila del sistema. Como su nombre lo indica, tendremos una estructura de datos, con poltica LIFO (Last In, First Out = El ltimo elemento en entrar, es el primero en salir), con instrucciones bsicas PUSH y POP para su manejo. Esta estructura es usada por los programas de aplicacin, pero tambin por el procesador para el control de instrucciones que lo requieren, tales como las llamadas a subrutinas yla atencin de interrupciones.

http://members.tripod.com/~MoisesRBB/arq80x86.html 1.4.3 Code segment.

CS = Registro de segmento de cdigo. Contiene la direccin del segmento de cdigo, lo que son las instrucciones del programa.

CS: Code Segment (Segmento de Cdigo) Este registro selecciona el rea de 64 Kb. que generalmente dedicamos al cdigo. En este caso, el CPU (especficamente, el BIU), siempre toma las instrucciones de esta regin de memoria; por lo que cuando requerimos ms de 64 Kb. de cdigo (instrucciones), este registro tendr que moverse, tomando distintos valores segn recorremos distintas regiones de memoria.

http://victorsanchez2.net/tutoriales/asm/asm001.htm

1.4.4

Instrucciones del programa.

La programacin en lenguaje maquina es difcil, por ello se necesitan lenguajes que permitan simplificar este proceso. Los lenguajes de bajo nivel han sido diseados para ese fin. Estos lenguajes dependen de la maquina, es decir, dependen de un conjunto de instrucciones especificas de la computadora. Un lenguaje tpico de bajo nivel es el lenguaje ensamblador. En este lenguaje las instrucciones se escriben en cdigos alfabticos conocidos como nemotcnicos (abreviaturas de palabras inglesas o espaolas). As, por ejemplo, nemotcnicos tpicos son: ADD suma MPY multiplicar LDA cargar acumulador SUB resta DIV dividir STO almacenar Las palabras nemotcnicas son mucho ms fciles de recordar que las secuencias de dgitos 0 y 1. Una instruccin tpica en ensamblador puede ser: ADD X, Y, Z Esta instruccin significa que se deben sumar los nmeros almacenados en las direcciones x, y y almacenar el resultado en la direccin z.

El programa ensamblador traducir la instruccin a cdigo de maquina. Por ejemplo: ADD se puede traducir a 1110 x se puede traducir por 1001, y 1010, z por 1011. La instruccin traducida sera: 1110 1001 1010 1011 Despus que un programa ha sido escrito en lenguaje ensamblador, se necesita un programa --llamado ensamblador-- que lo traduzca a cdigo mquina: Programa fuente ( lenguaje ensamblador) Ensamblador Programa en lenguaje de maquina

Figura 1.12. Programa ensamblador.

http://www.monografias.com/trabajos15/el-software/el-software.shtml#

1.4.5

Directivas.

Directivas del lenguaje ensamblador


Adems de los cdigos para instrucciones de mquina, lenguajes de ensamblador tienen directivas para ensamblar bloques de datos, y asignar localidades de direccin para instrucciones o cdigo. Estos usualmente tienen una capacidad simblica simple para definir valores como expresiones simblicas que se evalan en tiempo de ensamble, haciendo posible escribir cdigo que es mas fcil de leer y entender. Como la mayora de lenguajes de computadora, comentarios textuales pueden ser agregados a el cdigo fuente [source code] que es ignorado por la computadora. Estos tambin usualmente tienen un macro lenguaje integrado para hacer fcil generar piezas complejas de cdigo o datos. En la prctica, la ausencia de comentarios y el reemplazo de smbolos con nmeros actuales hace la interpretacin humana de cdigo desensamblado considerable mas difcil que el cdigo fuente original.

http://www.geocities.com/SiliconValley/Haven/2037/documentos/Lenguaje _Ensamblador.htm

DIRECTIVAS PARA LISTAR: PAGE Y TITLE La directiva PAGE y TITLE ayudan a controlar el formato de un listado de un programa en ensamblador. Este es su nico fin, y no tienen efecto sobre la ejecucin subsecuente del programa. PAGE. Al inicio de un programa, la directiva PAGE designa el numero mximo de lneas para listar en una pagina y el numero mximo de caracteres en una lnea. Su formato general es: PAGE [longitud][, ancho] El ejemplo siguiente proporciona 60 lneas por pagina y 132 caracteres por lnea: PAGE 60, 132 El numero de lneas por pagina puede variar desde 10 hasta 255, mientras que el numero de caracteres por lnea desde 60 hasta 132. La omisin de PAGE causa que el ensamblador tome PAGE 50, 80.

TITLE. Se puede emplear la directiva TITLE para hacer que un titulo para un programa se imprima en la lnea 2 de cada pagina en el listado del programa. Puede codificar TITLE de una vez, al inicio del programa. Su formato general es: TITLE Texto. Para el operando texto, una tcnica recomendada es utilizar el nombre del programa como se registra en el disco. Por ejemplo: TITLE Prog1 Mi primer programa en ensamblador DIRECTIVA SEGMENT

Un programa ensamblado en formato .EXE consiste en uno o mas segmentos. Un segmento de pila define el almacn de la pila, un segmento de datos define los elementos de datos y un segmento de cdigo proporciona un cdigo ejecutable. Las directivas para definir un segmento, SEGMENT y ENDS tienen el formato siguiente:

El enunciado SEGMENT define el inicio de un segmento. El nombre del segmento debe estar presente, ser nico y cumplir las convenciones para nombres del lenguaje. EL enunciado ENDS indica el final del segmento y contiene el mismo nombre del enunciado SEGMENT. El tamao mximo de un segmento es de 64K. El operando de un enunciado SEGMENT puede tener tres tipos de opciones: alineacin, combinar y clase, codificadas en este formato: nombre SEGMENT alineacin combinar ' clase '

TIPO ALINEACION. La entrada alineacin indica el limite en el que inicia el segmento. Para el requerimiento tpico, PARA, alinea el segmento con el limite de un prrafo, de manera que la direccin inicial es divisible entre 16, o 10H. En ausencia de un operando hace que el ensamblador por omisin tome PARA. TIPO COMBINAR. La entrada combinar indica si se combina el segmento con otros segmentos cuando son enlazados despus de ensamblar. Los tipos de combinar son STACK, COMMON, PUBLIC y la expresin AT. Por ejemplo, el segmento de la pila por lo comn es definido como: nombre SEGMENT PARA STACK

Puede utilizar PUBLIC y COMMON en donde tenga el propsito de combinar de forma separada programas ensamblados cuando los enlaza. En otros casos, donde un programa no es combinado con otros, puede omitir la opcin o codificar NONE.

TIPO CLASE. La entrada clase, encerrada entre apstrofos, es utilizada para agrupar segmentos cuando se enlazan. Se utiliza la clase 'code' para el segmento de cdigos, 'data' por segmento de datos y 'stack' para el segmento de la pila. El ejemplo siguiente define un segmento de pila con tipos alineacin, combinar y clase: nombre SEGMENT PARA STACK 'Stack'

DIRECTIVA ASSUME. Un programa utiliza el registro SS para direccionar la pila, al registro DS para direccionar el segmento de datos y el registro CS para direccionar el segmento de cdigo. Para este fin, usted tiene que indicar al ensamblador el propsito de cada segmento en el programa. La directiva para este propsito es ASSEME, codificada en el segmento de cdigo como sigue: OPERACION OPERANDO ASSUME SS:nompila, DS:nomsegdatos, CS: nomsegcodigo,. . . Los operandos pueden aparecer en cualquier orden. Al igual que otras directivas, ASSUME es solo un mensaje que ayuda al ensamblador a convertir cdigo simblico a cdigo maquina; aun puede tener que codificar instrucciones que fsicamente cargan direcciones en registros de segmentos en el momento de la ejecucin.

1 PAGE 60,132 2 TITLE P04ASM1 ESTRUCTURA DE UN PROGRAMA .EXE 3;------------------------------------------------------------------------------4 STACKSG SEGMENT PARA STACK 'Stack' 5 ... 6 STACKSG ENDS 7;------------------------------------------------------------------------------8 DATASG SEGMENT PARA 'Data' 9 ... 10 DATASG ENDS 11;------------------------------------------------------------------------------12 CODESG SEGMENT PARA 'Code'

13 BEGIN PROC FAR 14 ASSUME SS:STACKSG, DS:DATASG,CS:CODESG 15 MOV AX, DATASG del segmento de datos 16 MOV DS, AX en DS 17 ... 18 MOV AX, 4C00H 19 INT 21H 20 BEGIN ENDP 21 CODESG ENDS 22 END BEGIN

;Obtiene la direccin ;Almacena direccin ;Peticion ;Salida al DOS

http://www.itlp.edu.mx/publica/tutoriales/ensamblador/tem5_1_.htm

DIRECTIVAS SIMPLIFICADAS DE SEGMENTOS


Los ensambladores de MicroSoft y de Borland proporcionan algunas formas abreviadas para definir segmentos. Para usar estas abreviaturas, inicialice el modelo de memoria antes de definir algn segmento. El formato general (incluyendo el punto inicial) es: .MODEL modelo de memoria El modelo de memoria puede ser TINY, SMALL, MEDIUM, COMPACT o LARGE. Los requisitos para cada modelo son:

Puede utilizar cualquiera de estos modelos para un programa autnomo (esto es, un programa que no este enlazado con algn otro). El modelo TINY esta destinado para uso exclusivo de programas .COM, los cuales tienen sus datos, cdigo y pila en un segmento. El modelo SMALL exige que el cdigo quepa en un segmento de 64K y los datos en otro segmento de 64K. La directiva .MODELL genera automticamente el enunciado ASSUME necesario. Los formatos generales (incluyendo el punto inicial) para las directivas que define los segmentos de la pila, de datos y de cdigo son: .STACK [tamao] .DATA .CODE [nombre] Cada una de estas directivas hace que el ensamblador genere el enunciado SEGMENT necesario y su correspondiente ENDS. Los nombres por omisin de los segmentos (que usted no tiene que definir) son STACK, DATA y TEXT (para el segmento de cdigo). La figura 4.3 proporciona un ejemplo haciendo uso de las directivas simplificadas de segmento. page 60,132 TITLE P04ASM2 (EXE) Operaciones de mover y sumar ;------------------------------------------------------------------------.MODEL SMALL .STACK 64 ;Se define la pila .DATA ;Se definen los datos FLDA DW 250 FLDB DW 125 FLDC DW ? ;------------------------------------------------------------------------.CODE BEGIN PROC MOV (Prog. anterior) MOV ADD ;Se define el segmento de cdigo FAR AX, @data AX, FLDA AX, FLDB ;Se asigna la direccin de DATASG ;Mover 0250 a AX ;Sumar 0125 a AX

MOV MOV INT BEGIN ENDP END

FLDC, AX AX, 4C00H 21H BEGIN

;Almacenar suma en FLDC ;Salida a DOS ;Fin de procedimiento ;Fin de programa

http://www.itlp.edu.mx/publica/tutoriales/ensamblador/tem5_2_.htm Directivas de ensamble (Seudo instrucciones) Pass32 cuenta con algunas palabras reservadas que cumplen tareas especiales para facilitar la programacin en ensamblador, estas palabras son llamadas seudo instrucciones o directivas de ensamble. La siguiente es una lista de las directivas de ensamble ms utilizadas en Pass32: DB Reserva un byte en memoria DW Reserva una palabra (Word) en memoria o 2 bytes DD Reserva una palabra doble (Double Word) .EQU Se utiliza para reemplazar smbolos por valores PROC-ENDP Se utilizan para declarar procedimientos en los programas .MACRO-ENDM Se utilizan para declarar macros DUP Sirve para inicializar cadenas de caracteres o arreglos numricos .INCLUDE Se utiliza para obtener datos o subrutinas de otros programas .EXTERN Declara un smbolo como externo, trabaja en conjunto con .INCLUDE .PUBLIC Declara un smbolo como pblico Los programas incluidos como ejemplos muestran la forma de utilizar estas directivas. http://www.monografias.com/trabajos11/lenen/lenen.shtml

1.5 Procedimiento de ensamble, enlace y ejecucin.

Proceso de ensamble y ligado de un programa Este proceso es muy sencillo y se describe a continuacin: Si est trabajando en MS-DOS siga estos pasos: 1.- Escriba el programa, tal y como aparece en el listado anterior, usando su editor de texto preferido. 2.- Gurdelo con algn nombre y la extensin .ASM. 3.- En el smbolo del MS-DOS escriba lo siguiente C:\PASS32\BIN\>PASS32 Nombre.ASM t <Enter> 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.
http://www.monografias.com/trabajos11/lenen/lenen.shtml PROCESO DE ENSAMBLE Y LIGADO DE UN PROGRAMA. Las instrucciones simblicas que codifica el lenguaje ensamblador son conocidas como el programa fuente. El programa ensamblador es utilizado para traducir el programa fuente en cdigo mquina. Se debe de crear el programa fuente en un editor, por ejemplo el editor de pascal, el cual genera un archivo en cdigo ASCII que debe ser grabado con la extensin .ASM. El archivo generado, es slo un archivo de texto que no puede ejecutarse, para esto primero debe ensamblarlo y enlazarlo. 1.- El paso de ensamble consiste en la traduccin del cdigo fuente en cdigo objeto y la generacin de un archivo intermedio .OBJ mdulo. Una de las tareas del ensamblador es calcular el desplazamiento de cada elemento en el segmento de datos y de cada instruccin en el segmento de cdigo. El ensamblador tambin crea un encabezado al frente del mdulo .OBJ generado, ste an no est en forma ejecutable. 2.- El paso de enlace implica convertir el mdulo .OBJ en un mdulo de cdigo de mquina .EXE (ejecutable). 3.- El ltimo paso es cargar el programa para su ejecucin. El cargador desecha el encabezado y crea un PSP inmediatamente antes del programa cargando en memoria. COMO ENSAMBLAR UN PROGRAMA FUENTE El programa ensamblador de Microsoft es MASM.EXE, mientras que el programa de Borland es TASM.EXE. Para teclear el comando para ejecutar

MASM o TASM en una lnea de comando o por medio de peticiones. El formato general para un comando o lnea para ensamblar un programa es : MASM/TASM[opciones] fuente [,objeto] [,listado] [,refcruzada] [ ] = Son opcionales.

fuente- Es el nombre del archivo que se encuentracon la extension .ASM . objeto.- Prergunta que nombre le voy a dar al archivo .OBJ. listado.-Si se desea crear un archivo que contenga codigo fuente y codigo objeto se debe especificar con la extensin LST. FORMATO GENERAL PARA ENLAZAR LINK/TLINK ARCHOBJ,ARCHEJE,[,ARCHAMPA] [,ARCHIBIB1] LINK=Microsoft TLINK=Borland ARCHOBJ.- Identifica el archivo objeto que ha generado el ensamblador. ARCHEJE.- Se utiliza para archivos ejecutables. DIRECTIVAS DE ENSAMBLE El lenguaje ensamblador permite usar diferentes enunciados que permiten controlar la manera en que un programa ensambla y lista, llamados directivas. Las directivas que usa el lenguaje ensamblador son:

PAGE DD .LIST ASSUME END ERR

DW COMMENT PROC DT EQU ENDP

COMM LABEL DQ DATA DATA GROUP

INCLUDE SEGMENT CREF ORG PROCED

TITLE DFCONST .MODEL ENDS .ALPHA

DIRECTIVAS DE DEFINICIN DE DATOS (DB,DW,DD,LABEL,EQU,ETC.) DB (definir byte) .- Inicializa un byte completo.


Ejemplo : HOLA MESA CARACTER MENSAJE PERSONA HOY TABLA DIVERSOS DB DB DB DB DB DB DB DB 23 0AH G SOCIEDAD DE CERRO AZUL 0,1,2,3,4,5,6,7,8,9 45 DUP (STACK) 50 DUP (03CH) YES,34,0FADH

DW(Definir palabra).- Se utiliza para definir una variable o tabla (palabra).

Ejemplo : TEST1 TEST2 TEST3 TEST4 TEST5 TEST6

DW DW DW DW DW DW

1234 0ABCDH 1,22,333,4444 23,112 23 DUP (100H) 50 DUP ( ?)

DD(Definir doble palabra).- Se utitliza para definir una variable o tabla para inicializar una funcin de memoria.
Ejemplo : CIELO DD ROSA DD FLOR DD SUMA DD REALES DD DECIMAL DD TABLA DD FRACC DD 0FFFFFFFFH 0H 1,22,333,4444,55555 45H + 23H 2.17654 4.567E12 50 DUP (03CH) 0.12345

DQ (Definir cuadruple palabra).-Iniacializa 4 palabras. Acepta valores de constantes,numricos,tablas.


Ejemplo : TABLA MULTI SUMA LARGO DQ DQ DQ DQ 100,2000,30000,400000 1000 DUP (45.678) -6.345E -5 + 5.0001E45 7989*12H

DT (Definir decabyte).-Inicializa 10 bytes de asignacin de mamoria.


Ejemplo : TABLA MULTI SUMA LARGO TEST1 TEST2 TEST3 TEST4 DT DT DT DT DBIT DBIT DW DW 100,2000,30000,500000 1000 DUP (45.678) -6.345 E -5 + 5,0001E45 7989*12 0001B 011001B 1B,0B,1B 0B

DBIT (Bit).- Define tipo de bits.

EQU.- Inicializa una variable con un valor especifico.


Ejemplo : SUMA DIEZ ... EQU EQU CONTADOR 10

INC SUMA ADD SUMA,DIEZ

ALPHA.- Ordena alfabeticamente los segementos. Se coloca al inicio del programa para listar los elementos en forma ordenada.

PUBLIC.- Se utiliza para enlazar segmentos dentro de un programa o programas externos.


Formato : Programa que llama : DSEG1 SEGMENT PARA CODE PUBLIC CONVAL ... CONVAL DW ? DSEG1 ENDS Subprograma llamado : EXTRN (NOM : TIPO ) EXTRN CONVAL : FAR DSEG2 SEGMENT PARA CODE ... MOV ... DSEG2 ENDS

ORG.- Nos permite indicar la direccin especfica de segementos de memoria. Sirve para cambiar la direccin inicial de localidades, dandole una direccin especifica de los segmentos.
Ejemplo : ORG FLDX FLDY FLDY2 ORG 0 DB ? DW ? DB ? $+5 00 01 02 04

COMMENT.- Sirve para delimitar comentarios.


Ejemplo : COMMENT DELIMITADOR DE COMENTARIO ... DELIMITADOR DE COMENTARIO

NOMBRE GROUP NOM-SEG,....- Ayuda a agrupar con un nombre a varios segmentos.


Ejemplo : GROUP SEG1 ASSUME ... SEDG1 SEG2 ASSUME ... SEG GROUP NOM-SEG1SEG2 SEGMET PARA DATA DS : GROUPX ENDS SEGMENT PARA DATA DS : GROUPX ENDS

LABEL.- Redefine el atributo de una variable.


Formato : Nombre REDEFB REDEFW FIELDB . . . LABEL Especificador DW 2532H LABEL WORD DB 25H DB 32H

MOV AL,REDEFB MOV BX,REDEFW

DIRECTIVAS DE DEFINICIN DE MEMORIA (PROC, SEGMENT, ASSUME, END, ETC.) PROC.- Indica la definicin de un procedimiento pude llevar un atributo FAR o NEAR.
Formato : NOMSEGTO NOMPROC ... NOMPROC NOMSEGTO SEGMENT PROC FAR/NEAR ENDP ENDS ; CODE ; UN PROCEDIMIENTO ; ; DENTRO ; DEL SEGMENTO DE CDIGO

SEGMET (Directiva de memoria).- Nos indica que tanta memoria va a ocupar y sirva para segmentar la memoria en pila, cdigo, datos y extras.
Formato : NOMBRE . . NOMBRE Formato : END SEGMENT (OPCIONES) ENDS ; INICIA EL SEGMENTO ; FIN DE SEGMENTO

END.-Indica fin de programa.

ENDS.- Indica fin de segmento.


Formato : ENDS

ENDP.- Indica fin de procedimiento.


Formato : ENDP

ASSUME.- Se utiliza para direccionar cada uno de los registros del segmento a la direccin del segmento (DS,SS,ES,FS,CS).
Formato : ASSUME CS : CODESG, DS. :DATASG, SS : STACK ;... ES : DATASG

DIRECTIVAS PARA LIGADO DE UN PROGRAMA TLINK .- Convierte un programa fuente a un archivo .OBJ en un archivo .EXE. Se puede teclear LINK o TLINK. Enlazando con una lnea de comando o por medio de peticiones. La lnea de comando es : LINK/TLINK archobj, archeje, [, archmapa] [,archbibl]

Archobj.-Identifica al archivo objeto generado por el ensamblador. El enlazador supone la extensin .OBJ de modo que no tiene que introducirla. Unidad, subdirectorio y nombre de archivo pueden ser iguales o diferentes del archivo fuente. Archeje.- Estipula que se genera un archivo .EXE. Unidad, subdirectorio y nombre del archivo pueden ser iguales o diferentes del archivo fuente. Archmapa.- Estipula que se genera un archivo con extensin MAP que indica la ubicacin relativa y el tamao de cada segmento y cualquier error que LINK haya encontrado. Un error comn es el fallo al definir un segmento de pila. Introducir CON (por consola) le indica al enlazador que muestre el mapa en la pantalla ( en lugar de escribirlo en un disco) de forma que se pueda ver el mapa inmediatamente para los errores. Archbibl.- Estipula la opcin de bibliotecas, que no necesita en estos primeros pasos de programacin en lenguaje ensamblador. DIRECTIVAS DE CONTROL DE LISTADO

.LIST y .XLIST.- Se utilizan para controlar el listado del archivo. .LIST.- Permite listar los cdigod fuente y objeto. .XLIST.-Indica hasta donde se detiene el listado del archivo.
Formato : .LIST, .XLIST Ejemplo: .XLIST MYCODE MYPROC

SEGMENT PARA CODE PROC FAR ASSUME CS : MYCODE, DS : MYDATA,SS : STACK PUSH SUB PUSH

PAGE.-Directiva para listar, inicializa la longitud y achura de cada pgina de listado.


Formato: PAGE [LONGITUD] , [ANCHO] Ejemplo: PAGE 60,132

TITLE.- Permite que sea introducido un ttulo en la segunda lnea de cada pgina de listado.
Formato : TITLE (cadena) Ejemplo: TITLE PROGRAMA EJEMPLO SUBTTL CHEQUEO DE CODIGOS DE ERROR STACK SEGMENT PARA STACK DB 64 DUP (MIPILA)

STACK ENDS ....

FUNCIONAMIENTO INTERNO.
Enseguida se ilustra un ejemplo muy claro de cmo sera un programa en Lenguaje Ensamblador. Para sumar 5+ 7. 1. Necesitamos 3 casillas, dos para los datos 5 y 7 y uno para depositar el resultado. 2. Definir las operaciones y su orden, as como obtener una codificacin adecuada 3. Introducir los datos en memoria. Ocupamos una instruccin para llevar el contenido de una celda al acumulador (o registro contenido en la CPU); otra para hacer la suma y otra para regresar el contenido del acumulador a una celda de la memoria. El formato de la instruccin para llevar el contenido de una celda al acumulador(le llamaremos CARGA_AC) ser como sigue: CARGA_AC Direccin Donde: CARGA_AC = al nombre de la instruccin. Direccin =celda de memoria cuyo valor queremos llevar al acumulador CARGA_AC, es el nombre mnemnico que daremos a la instruccin, debemos asignarle un cdigo numrico interno, sin importar ahora cual sea este, ocupar el contenido de una celda de la memoria. As mismo, la direccin ser un nmero que ocupar un lugar en otra celda. Es decir, CARGA_AC ocupar dos celdas: Una para el cdigo de la operacin y otra para la direccin a la que hace referencia. GUARDA_AC, Direccin; que deposita el valor del acumulador en una celda de la memoria(esta es la inversa de la anterior). SUMA Direccin; que suma de memoria descrita por la direccin: Ahora nuestro diccionario ser como sigue:

INSTRUCCIN CARGA_AC GUARDA_AC SUMA RESTA

CODIGO LONG. DE LA INTERNO INSTRUCCIN 21 96 57 42 2 2 2 2

Ahora escribiremos el programa en forma tabular. En la parte izquierda del rengln pondremos la instruccin mnemnica seguida de la direccin a la que haga referencia, luego pondremos su equivalente en el cdigo interno extrado del diccionario y, por ltimo, describiremos el rengln para lo que sigue suponemos que la celda 21 contiene un 5 y que la celda 22 contiene un 7.

INSTRUCCIN DIRECCION CODIGO COMENTARIOS CARGA_AC SUMA GUARDA_AC ALTO 21 22 23 .. 2121 5722 9623 70 Colocamos el 1er. Nm. En el acumulador Efectuamos la suma Dejamos el resultado en la casilla 23 finaliza

ALTO= Instruccin nueva para lograr que cuando se ejecute la secuencia, llegue a su fin. Esta instruccin toma una sola casilla de memoria, ya que no requiere hacer referencia a algunas direcciones. Observemos dos nuevos programas; uno escrito en lenguaje mnemnico y otro escrito en lenguaje numrico. Llamaremos programa fuente al primero y programa objeto al segundo.

PROGRAMA FUENTE: Esta escrito en un lenguaje cercano al del ser humano. PROGRAMA OBJETO: Este ya est traducido al lenguaje que habla la mquina.

En este caso escribimos ambos programas, pero en un caso general, el programador escribir el programa fuente y la computadora lo traducir al lenguaje objeto. PASOS PARA EJECUCCION DE UN PROGRAMA El programa objeto, entonces es: "21215722962370" que, obviamente, ininteligible para un ser humano. Este programa funciona para sumar cualquier par de nmeros, siempre y cuando resida en las casillas 21y22. Ahora introduciremos el programa en la memoria de la computadora, para que pueda ejecutarse luego. en que seccin de la memoria lo vamos a cargar?, decidimos hacerlo a partir de la celda 10 (o cualquiera que este desocupada y disponga de suficientes celdas secuenciales vacas). La forma en que quedara

nuestro programa objeto en la memoria es:

Cod. 21 21 57 22 96 23 70

05 07 .

Dir. 10 11 12 13 14 15 16 . 21 22 23 . Mem. Ya cargado nuestro programa objeto a partir de la celda 10 de la memoria, tenemos que encontrar un procedimiento para lograr que la computadora comience la ejecucin del mismo y as poder obtener los resultados deseados. La unidad de control (UC) ejecutar el programa de la siguente forma: 1. Cuando el programa empieza a partir de la celda 10, indicaremos a la unidad de control que esta celda contiene las primeras instrucciones por medio de un apuntador que recibe el nombre de CONTADOR DE PROGRAMA(CP). Este es un paso externo, no forma parte del programa. 2. La unidad de control ejecutar el paso a) e ir a la casilla 10 para leer su contenido que es 21. 3. La unidad de control ejecutar el paso b) con lo que decodifica el 21 recin ledo y determina que se trata de una operacin CARGA_AC. 4. La unidad de control ejecutar el paso c) con lo que efectuar la operacin de carga. Para esto la computadora debe ir a la celda 11 y extraer su contenido, pero ahora ya no lo considerar como instruccin, sino como direccin, por lo cual ir a la celda 21 para extraer el valor que contenga(que es 5). Esta instruccin completa "21 21" puede leerse as: "Carga el acumulador con el valor que est contenido en la celda cuya direccin aparece a la derecha de donde ests leyendo ahora. 5. La unidad de control ejecuta el paso d) para luego ejecutar todo el ciclo de nuevo. Esto es un ciclo infinito, que slo terminar cuando se ejecute la instruccin ALTO. El CP=12, o sea apuntar a la celda 12. 6. Se ejecutar(por segunda vez) el paso a) de la unidad de control. Como CP=12, se leer esa celda, que contiene un 57. 7. Se decodifica esa instruccin que resulta ser SUMA_AC, por lo que el CP se preparar para apuntar a la siguiente celda. 8. Se ejecuta la instruccin 57 con lo que se aade el contenido de la celda 22 al acumulador(la direccin 22 reside en la celda 13, que es a la que actualmente apunta el contador de programa como resultado del paso anterior).Ahora el acumulador contendr un 12 (o sea 5+7). 9. El CP se actualiza para apuntar a la celda 14, en la cual reside el cdigo de la siguiente instruccin. 10. Se lee la celda nmero 14 y se extrae su contenido, 96.

11. Se decodifica la instruccin, que resulta ser GUARDA_AC, por lo que CP se alista para apuntar a la siguiente celda, que contendr la direccin de la celda en donde se va a guardar el contenido del acumulador.

1.6 Entorno de programacin.

Unidad 2. Elementos del lenguaje


2.7 Instrucciones lineales. 2.7.1Movimiento.
Movimiento de datos En todo programa es necesario mover datos en la memoria y en los registros de la UCP; existen diversas formas de hacer esto: puede copiar datos de la memoria a algun registro, de registro a registro, de un registro a una pila, de la pila a un registro, transmitir datos hacia dispositivos externos asi como recibir datos de dichos dispositivos. Este movimiento de datos est sujeto a reglas y restricciones. Algunas de ellas son las que se citan a continuacin. No es posible mover datos de una localidad de memoria a otra directamente, es necesario primero mover los datos de la localidad origen hacia un registro y luego del registro a la localidad destino. No se puede mover una constante directamente a un registro de segmentos, primero se debe mover a un registro de la UCP. Es posible mover bloques de datos por medio de las instrucciones movs, que copia una cadena de bytes o palabras; movsb que copia n bytes de una localidad a otra; y movsw copia n palabras de una localidad a otra. Las dos ltimas instrucciones toman los valores de las direcciones definidas por DS:SI como grupo de datos a mover y ES:DI como nueva localizacin de los datos. Para mover los datos tambien existen las estructuras llamadas pilas, en este tipo de estructuras los datos se introducen con la instruccin push y se extraen con la instruccin pop En una pila el primer dato introducido es el ltimo que podemos sacar, esto es, si en nuestro programa utilizamos las instrucciones: PUSH AX PUSH BX PUSH CX

Para devolver los valores correctos a cada registro al momento de sacarlos de la pila es necesario hacerlo en el siguiente orden: POP CX POP BX POP AX Para la comunicacin con dispositivos externos se utilizan el comando out para mandar informacin a un puerto y el comando IN para leer informacin recibida desde algun puerto. La sintaxis del comando OUT es: OUT DX,AX Donde DX contiene el valor del puerto que se utilizar para la comunicacin y AX contiene la informacin que se mandar. La sintaxis del comando IN es: IN AX,DX Donde AX es el registro donde se guardar la informacin que llegue y DX contiene la direccin del puerto por donde llegar la informacin.

http://usuarios.lycos.es/patricio/ensam/ensam2.htm
La orden MOV. La funcin de la orden MOV es, como su nombre da a entender, "mover" un valor. Pongamos un ejemplo: MOV AX,BX Esta orden en lenguaje Ensamblador, copiar el contenido de BX en AX, conservando el valor de BX. He aqu algn ejemplo ms: MOV AX,DS MOV ES,AX MOV DX,AX MOV AL,DH

Como se ve, no se puede realizar MOV AL,BX, ya que en AL no cabe BX Tambin se puede introducir un valor directamente en un registro. Sera el caso de: MOV AX,0FEA2h MOV BL,255 MOV DH,01110101b Pongamos ejemplos de cmo se utiliza la numeracin. El primero era un nmero hexadecimal, el segundo decimal, que no va acompaado por nada para indicarlo, y el tercero binario, con la b al final. A veces, para representar un nmero decimal, se pone una 'd' al final (p.ej., 10d) Ms utilidades de MOV. Podemos transferir bytes que estn en memoria a un registro, o de un registro a memoria. Vayamos con los ejemplos: MOV AX,[BX] Y pongamos que en BX est 0EEEEh. En vez de transferir a AX el valor 0EEEEh, le transferiremos el valor que haya en la posicin de memoria CS:BX; si CS por ejemplo vale 0134h y BX 03215h, transferiramos el byte que hay en 0134:03215h y el siguiente a AX. Se puede hacer tambin al revs; MOV [AX],CX Escribiramos en la direccin de memoria CS:AX el valor de CX. Y tambin podremos usar valores numricos: MOV AX,[2325h] (lo que hay en CS:2325h) MOV AX,DS:[2325h] (el valor en DS:2325h) MOV AX,DS:DX (el valor en DS:DX) MOV DX,CS:CX (a DX, valor en CS:CX)

MOV BX,CS:1241h (a BX, valor en CS:1241h) Muchas veces, se utiliza Word Ptr o Byte Ptr, que aclaran el tamao a transferir: MOV AL,BYTE PTR [BX+SI-30h] MOV AX,WORD PTR [BX+DI] Como acabamos de ver, es posible hacer "sumas" de valores al buscar una direccin en memoria. Otros ejemplos seran: MOV AX,[BX+3] MOV [BP+SI],AH Y para acabar este apartado, he aqu una tablilla de ejemplos sobre MOVs que se pueden hacer: Formatos de la instruccin MOV Ejemplos MOV reg,reg MOV AX,BX MOV mem,reg MOV [BX],AL MOV reg,mem MOV CH,[40FFh] MOM mem,inmed MOV BYTE PTR [DI],0 MOV reg,inmed MOV BX,0FFFFh MOV segreg,reg16 MOV DS,AX MOV mem,segreg MOV [SI],ES MOV segreg,mem MOV SS,[1234h] reg: registro mem:memoria inmed:nmero inmediato segreg: registro de segmento reg16: registro de 16 bits Y vista la orden MOV, seguimos adelante.

La instruccin de transferencia de datos por excelencia es: MOV destino, fuente

entendiendo por fuente el contenido que se va a transferir a una determinada zona o registro de memoria denominada destino. Esta instruccin, por tanto, nos va a permitir transferir informacion entre registros y memoria, memoria y registros y entre los propios registros utilizando alguno de los diferentes modos de direccionamiento. Con la instruccin MOV diremos que se pueden realizar todo tipo de movimientos teniendo en cuenta las siguientes restricciones: 1.- No se puede realizar una transferencia de datos entre dos posiciones de memoria directamente, por esta razn, siempre que queramos efectuarlas tendremos que utilizar un registro intermedio que haga de puente. Por ejemplo, para hacer la operacion DATO1 <-- DATO2, la instruccin MOV DATO2,DATO1 sera incorrecta. Lo que s sera correcto sera utilizar el registro DX, u otro, como puente y hacer: MOV DX,DATO1 MOV DATO2,DX 2.- Tampoco se puede hacer una transferencia directa entre dos registros de segmento. Por eso, como en el caso anterior, si fuera preciso se utilizara un registro como puente. 3.- Asimismo, tampoco se puede cargar en los registros de segmento un dato utilizando direccionamiento inmediato, es decir, una constante, por lo que tambin habr que recurrir a un registro puente cuando sea preciso. Una instruccin util pero no imprescindible es: XCHG DATO1, DATO2 que intercambia los contenidos de las posiciones de memoria o registros representadospor DATO1 y DATO2. Por ejemplo, si queremos intercambiar los contenidos de los registros AX y BX, podemos hacer:

MOV AUX, AX MOV AX, BX MOV BX, AUX en donde AUX es una variable auxiliar que hace de puente, o simplemente utilizar: XCHG AX, BX Las restricciones que presenta esta operacin es que no se pueden efectuar intercambios directamente entre posiciones de memoria ni tampoco entre registros de segmento. La instruccin XLAT tabla carga en el registro AL el contenido de la posicin [BX][AL], en donde el registro BX ha de apuntar al comienzo de una tabla. Dichio de otra manera, AL hace de ndice de la tabla y de almacn destino del contenido de la tabla. Por ejemplo, el siguiente programa: DATOS SEGMENT TABLA DB 2,3,5,8,16,23 DATOS ENDS CODIGO SEGMENT MOVE BX, OFFSET TABLA ; Inicializa BX con la direccin donde comienza la tabla MOVE AL, 5 XLAT TABLA CODIGO ENDS hace que al final el contenido de AL se 16 ya que es el 5to. elemento de la tabla y AL antes de XLAT TABLA contenia el valor 5. Para finalizar con las instrucciones de transferencia veremos un grupo de tres instrucciones: - LEA o cargar direccin efectiva. - LDS o cargar el puntero en DS. - LES o cargar el puntero en ES. denominadas de transferencia de direcciones. La primera, LEA, carga el desplazamiento u OFFSET correspondiente al operando fuente en el operando destino. Por ejemplo, la instruccin

MOVE BX, OFFSET TABLA del ejemplo anterior sera equivalente a LEA BX, TABLA. La segunda, LDS, se utiliza para cargar el valor del segmento de una variable en el registro DS y el desplazamiento correspondiente en el registro o posicin de memoria indicada en la instruccin. Por ejemplo, la instruccin LDS BX, NUM1 hara esquemticamente lo siguiente:

La tercera y ultima de las instrucciones, LES, es similar a LDS, con la nica salvedad de que el valor del segmento se carga sobre el registro de segmento ES en vez del DS.

2.7.2Pila.
Instrucciones para la pila La pila es un grupo de localidades de memoria que se reservan con la finalidad de proporcionar un espacio para el almacenamiento temporal de informacin. 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 bsicas: Push (Meter) y Pop (sacar). El formato de estas instrucciones es el siguiente: Push operando Pop operando Cuando se ejecuta la instruccin Push, el contenido del operando se almacena en la ultima posicin de la pila. Por ejemplo, si AX se carga previamente con el valor 5, una instruccin Push AX almacenara el valor 5 en la ultima posicin de la pila. Por otro lado la instruccin Pop saca el ltimo dato almacenado en la pila y lo coloca en el operando. Siguiendo el ejemplo anterior, la instruccin Pop BX obtendra el nmero 5 y lo almacenara en el registro BX. El siguiente ejemplo muestra como implementar la instruccin XCHG por medio de las instrucciones Push y Pop. Recuerde que la instruccin XCHG intercambia el contenido de sus dos operandos. .COMMENT Programa: PushPop.ASM Autor: Juan Carlos Guzmn C. Descripcin: Este programa demuestra el uso de las instrucciones para el manejo de la pila, implementando la instruccin XCHG con Push y Pop *

.MODEL tiny .CODE Inicio: ;Punto de entrada al programa Mov AX,5 ;AX=5 Mov BX,10 ;BX=10 Push AX ;Pila=5 Mov AX,BX ;AX=10 Pop BX ;BX=5 Mov AX,4C00h ;Terminar programa y salir al DOS Int 21h ; END Inicio END

INSTRUCCIONES DE MANEJO DE LA PILA.

POP (extraer de la pila) Sintaxis: POP destino


Indicadores: OF DF IF TF SF ZF AF PF CF -

Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instruccin POP CS, poco til, no funciona correctamente en los 286 y superiores.
Ejemplos: pop pop ax pepe

PUSH (introduce en la pila) Sintaxis: PUSH origen


Indicadores: OF DF IF TF SF ZF AF PF CF -

Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aqu s se puede especificar como origen, al contrario de lo que afirman algunas publicaciones.
Ejemplo: push cs

POPF (extrae los indicadores de la pila) Sintaxis: POPF


Indicadores: OF x DF x IF x TF x SF x ZF x AF x PF x CF x

Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuacin el puntero de pila SP se incrementa en dos.

PUSHF (introduce los indicadores en la pila) Sintaxis: PUSHF


Indicadores: OF DF IF TF SF ZF AF PF CF -

Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los indicadores.
http://meltingpot.fortunecity.com/uruguay/978/libro/04.html

LA PILA La pila es una especie de "almacn de variables" que se encuentra en una direccin determinada de memoria. Nos encontramos con dos rdenes bsicas respecto a la pila, que son PUSH y POP. La orden PUSH empuja una variable a la pila, y la orden POP la saca. Sin embargo, no podemos sacar el que queramos, no podemos decir "quiero sacar el valor de DX que he metido antes y que fue el cuarto que met", por ejemplo. La estructura de la pila se denomina LIFO, siglas inglesas que indican 'Last In First Out'. Esto significa que al hacer un POP, se sacar el ltimo valor introducido en la pila. Veamos esto con unos ejemplos: PUSH DX ; Mete en la pila el contenido de DX PUSH CX ; Y ahora el contenido de CX POP AX ; Ahora saca el ltimo valor introducido ( CX ) ;y lo coloca en AX. POP BP ; Y ahora saca en valor anterior introducido, que ;es el contenido de DX cuando hicimos el PUSH DX

;y se lo asigna a BP. Ahora, una rutina algo ms detallada: MOV DX,0301h ; DX vale ahora 0301 hexadecimal. PUSH DX ; Empuja DX a la pila. SP se decrementa en dos. MOV DX,044C4h ; Ahora DX vale 044C4h POP CX ; Y con esto, CX vale 0301 hexadecimal, el valor que habamos introducido con anterioridad. Dijimos en la segunda lnea: SP se decrementa en dos. Cuando por ejemplo ejecutamos un .COM, SS es el segmento del programa (o sea, igual que CS, y si no han sido modificados, DS y ES), y SP apunta al final, a 0FFFFh. Cuando empujamos un valor a la pila, SP se decrementa en dos apuntando a 0FFFDh, y en esta direccin queda el valor introducido. Cuando lo saquemos, se incrementar de nuevo en dos el valor de SP, y el valor se sacar de la pila. Se puede operar con esta instruccin con los registros AX, BX, CX, DX, SI, DI, BP, SP, CS, DS y ES; sin embargo no se puede hacer un POP CS, slo empujarlo a la pila. He aqu un ejemplo de lo que hace en realidad un POP en trminos de MOVs; aunque sea un gasto intil de cdigo, tiene su aplicacin, por ejemplo, para saltarse la heurstica en un antivirus, que busca un POP BP y SUB posterior. Partamos de que hay cierto valor en la pila que queremos sacar. MOV BP,SP ; Ahora BP es igual al offset al que apunta SP MOV BP,Word ptr [BP] ; Y ahora BP vale el contenido del offset al ;que apunta, que al ser el offset al que apunta ;el de pila, ser el valor que sacaramos

;haciendo un POP BP. ADD SP,2 ; Para acabarlo, sumamos dos al valor de offset ;de la pila. Y esto es lo que hace un POP BP, simplemente. Para ver lo que hace un PUSH no habra ms que invertir el proceso. Vemoslo. SUB SP,2 MOV BP,SP MOV Word ptr[BP],DX Como ltima recomendacin, hay que tener bastante cuidado con los PUSH y POP, sacar tantos valores de la pila como se metan, y estar pendiente de que lo que se saca es lo que se tiene que sacar. La pila bien aprovechada es fundamental para hacer programas bien optimizados, ya que entre otras cosas las instrucciones PUSH y POP solo ocupan un byte. Es por ejemplo mucho mejor usar un PUSH al principio y un POP al final en vez de dejar partes de cdigo para almacenar variables, ms velocidad y menos tamao. Y finalmente, hay otras dos rdenes interesantes respecto a la pila, PUSHF y POPF, que empujan el registro (16 bits) de flags y lo sacan, respectivamente.

2.7.3Matemticos.
Instrucciones aritmticas Las cuatro operaciones aritmticas bsicas son suma, resta, multiplicacin y divisin. La mayora de las computadoras proporcionan instrucciones para las cuatro operaciones. Algunas computadoras pequeas slo tienen las instrucciones suma y, tal vez, resta. La multiplicacin y la divisin deben generarse mediante

subrutinas del software. Las cuatro operaciones aritmticas bsicas son suficientes para formular soluciones a problemas cientficos cuando se expresan en trminos de mtodos de anlisis numrico. En la tabla 8-7 se proporciona una lista de las instrucciones aritmticas tpicas. La instruccin de incrementar suma 1 al valor almacenado en un registro o palabra de memoria. Una caracterstica comn de las operaciones de incrementar, cuando se ejecutan en registros de procesador, es que un nmero binario que contiene slo dgitos 1, produce un resultado de solo dgitos 0 cuando se incrementa. La instruccin para Decrementar resta 1 de un valor: almacenado en un registro o palabra de memoria. Un nmero con slo dgitos 0, produce un nmero con slo dgitos 1 cuando se decrementa.

TABLA 8-7 Instrucciones aritmticas tpicas

NOMBRE Incrementar Decrementar Sumar Restar Multiplicar Dividir Sumar con acarreo Restar con prstamo Negar (complemento a 2) INC DEC ADD SUB MUL DIV

MNEMONICO

ADDC SUBB NEG

Las instrucciones sumar, restar, multiplicar y dividir pueden estar disponibles para diferentes tipos de datos. Los tipos de datos que se considera que estn en los registros del procesador durante la ejecucin de estas operaciones aritmticas, se incluyen en la definicin del cdigo de operacin. Una instruccin aritmtica puede especificar datos

de punto fijo o flotante. datos binarios o decimales, datos de precisin nica o de doble precisin. Los diferentes tipos de datos se presentaron en el captulo 3. No es extrao encontrar computadoras con tres o ms instrucciones de suma: una para enteros binarios, una para operandos de punto flotante y una para operandos decimales. Enseguida, se muestran los mnemnicos para tres instrucciones de suma que especifican tipos de datos diferentes. ADDI Sumar dos nmeros enteros de punto flotante ADDF Sumar dos nmeros de punto flotante ADDD Sumar dos nmeros decimales en BCD. Los algoritmos para operaciones con enteros, punto flotante y aritmtica ~ decimal se desarrollan en el captulo 10. La cantidad de bits en cualquier registro es de extensin finita y, por lo tanto, los resultados de las operaciones aritmticas son de precisin finita. Algunas computadoras proporcionan operaciones de hardware de doble precisin, en las cuales el tamao de cada operando es de dos palabras de memoria. La mayora de las computadoras pequeas proporcionan instrucciones especiales para facilitar la aritmtica de doble precisin. Un flip-flop especial de acarreo se utiliza para almacenar el acarreo de una operacin. la instruccin "sumar con acarreo" realiza la suma de dos operandos ms el valor del acarreo del clculo previo. De igual manera, la instruccin "restar con prstamo" resta dos palabras y un prstamo que puede haberse producido de una operacin de resta previa. La instruccin negar forma el complemento a 2 de un nmero, invirtiendo en forma efectiva el signo de un entero cuando se representa en forma de complemento a 2 con signo. http://members.fortunecity.es/roy8/cpu.htm Las instrucciones ADD y SUB Se trata de dos operadores que contiene cualquier lenguaje de programacin: la suma y la resta. Tienen dos operandos, uno de destino y otro fuente. Para la suma, se suman los dos operandos y se almacena en el primero (destino), y para la resta, se resta al primero el segundo, almacenndose en destino, el primero. Aqu estn algunos formatos de estas instrucciones: ADD AX,BX ; Sumara AX y BX y lo guardara en AX ADD [AX],BX ; Suma el contenido de la direccin de AX a BX,

;y se almacena en la direccin de AX ADD AX,[BX] ; Se suman AX y el contenido de la direccin de ;BX, y se almacena esta suma en AX ADD AX,3 ; Lo mismo pero utilizando un valor inmediato ;en vez de la BX sealada anteriormente. SUB CL,DL ; Resta de CL el valor de DL, y se almacena en CL SUB [CX],DX ; Se resta al contenido de la direccin de CX ;el valor de DX, y se almacena en la dir. de CX SUB CX,23h ; Se resta de CX el valor 23h, y queda en CX el ;resultado Y si el resultado excede lo que puede contener el byte, o la palabra?. Esto se puede saber mediante los flags, que trataremos ms adelante. Tambin es resaltable que separa con ; los comentarios. Bien, sta es la manera en Ensamblador de poner comentarios, como sera en Basic la orden "REM", o en C la convencin "/* [...] */" 5.-3.- NEG, NOT y operaciones lgicas Neg pone el registro o el lugar al que apunta en memoria en negativo segn la aritmtica de complemento a dos tal que : NEG AX o NEG [AX] Not es la que, como vimos, "invierte" los valores de los bits. Y el resto de operaciones lgicas tambin las vimos anteriormente. Pondremos ahora tan slo su sintaxis: NOT SI ; (o Not AX, etc.,... o sea, con un registro) NOT Word ptr es:[ax] ; Lo realiza sobre la palabra ( 2 bytes ) ;que se encuentra en es:[ax] AND AX,BX ; Efecta un AND entre AX y BX, almacenando

;el resultado en AX ( siempre en el primer ;trmino ) AND [AX],BX ; Lo dicho, pero AX apunta a un lugar de ;memoria AND AX,[BX] AND Byte ptr [15],3 ; Un AND en la direccin :0015 con lo que ;haya ah y el valor "3" OR AX,BX OR [AX],BX OR Byte ptr [15],3 OR DH,55h ;Tambin podra hacerse en el AND, se ;confrontan DH y 55h en un OR. Y todo lo dicho para OR y AND vale para XOR, de tal manera que las operaciones son realizables entre: Registro y registro CX,DX Lugar de memoria y registro [DX],BX Registro y lugar de memoria AX,[SI] Lugar de memoria y nmero word ptr ES:[AX],0D533h Registro y nmero AX,0CD32h 5.-4.- Multiplicacin y divisin, MUL y DIV Estas operaciones multiplican al acumulador por el operando indicado. Si el operando es de 8 bits (1 byte), el acumulador es AL. Si el operando es de 16 bits, el acumulador es AX. El resultado se almacena en AX o en el par DX-AX respectivamente, si el operando es de 8 bits o 16 bits.

Tambin tendremos que diferenciar entre dos tipos de multiplicaciones y divisiones que entiende el procesador. Los que comienzan con una I operan con nmeros con signo, si queremos usar nmeros negativos, y los que no, con nmeros sin signo. Visto esto, podremos decir que: MUL Byte Ptr [CX] Va a multiplicar el byte que hay en la direccin que marca CX por el contenido que hay en AL, y una vez hecho esto, va a almacenarlo en AX. MUL SI Multiplicara SI por el contenido de AX, almacenndose en el par AX-DX. La palabra superior, de ms valor, se devolvera en DX, y la inferior en AX. IMUL SI Esto y el ejemplo anterior sera lo mismo, slo que operando con nmeros con signo. Para la divisin, el dividendo ha de estar en AX, y ser 16 bits por tanto. El divisor se indica en el operando, por ejemplo en DIV BL; este divisor estara en BL. Se dividira AX entre BL y el resultado quedara en AL, quedando el resto en AH. Vamos a ver algn ejemplo. En la divisin de un nmero de diecisis bits entre otro de 8 bits, el cociente y resto sern de 8 bits (1 byte). El dividendo ha de estar en AX, y el divisor es el operando de la instruccin, que puede ser un registro o un sitio en la memoria, y se necesita poner lo de byte ptr. O sea, sera tal que: DIV CL o IDIV BYTE PTR ES:[BP]

El resultado se devuelve en AL, y el resto en AH. Si por ejemplo AX valiese 501d y cl valiese 2, al hacer el DIV CL, en AL quedara 255 y en AH quedara 1. Se puede dividir tambin un nmero de 32 bits (4 bytes) entre otro de 16 bits (2 bytes), con lo que cociente y resto seran de 16 bits. El dividendo estara formado por el par DX/AX. Al hacer por ejemplo un: DIV SI Se dividira DX-AX entre SI, almacenndose el resultado en AX, y el resto en DX. Por ejemplo: Si en DX est el valor 003Fh y en AX 5555h, el par sera 3F5555h, con lo que al dividirlo por SI (que pongamos que vale 0CCC4h), se almacenara en AX el resultado y en DX el resto.

http://platea.pntic.mec.es/~jdelucas/ensamblador.htm

SUMA Y RESTA.
Las instrucciones ADD y SUB realizan sumas y restas sencillas de datos binarios. Los nmeros binarios negativos estn representados en la forma de complemento a dos: Invierta todos los bits del numero positivo y sume 1. Los formatos generales para las instrucciones ADD y SUB son:

Como en otras instrucciones, no existen operaciones directas de memoria a memoria. El ejemplo siguiente utiliza el registro AX para sumar WORDA a WORDB:

WORDA DW 123 ;Define WORDA WORDB DW 25 ;Define WORDB ... MOV AX, WORDA ;Mueve WORDA al AX ADD AX, WORDB ;Suma WORDB al AX MOV WORDB, AX ;Mueve AX a WORDB La figura 6.1. proporciona ejemplos de ADD y SUB para el procesamiento de valores en un byte y en una palabra. El procedimiento B10ADD utiliza ADD para procesar bytes y el procedimiento C10SUB utiliza SUB para procesar palabras. TITLE P13ADD (COM) Operaciones ADD y SUB .MODEL SMALL .CODE ORG 100H BEGIN: JMP SHORT MAIN ;---------------------------------------------------------------------------BYTEA DB 64H ;DATOS BYTEB DB 40H BYTEC DB 16H WORDA DW 4000H WORDB DW 2000H WORDC DW 1000H ;---------------------------------------------------------------------------MAIN PROC NEAR ;Procedimiento principal: CALL B10ADD ;Llama a la rutina ADD CALL C10SUB ;Llama a la rutina SUB INT 21H MAIN ENDP ; Ejemplos de suma (ADD) de bytes: ;---------------------------------------------------------------------------B10ADD PROC MOV AL, BYTEA MOV BL, BYTEB ADD AL, BL ;registro a registro ADD AL, BYTEC ;memoria a registro ADD BYTEA, BL ;registro a memoria ADD BL, 10H ;inmediato a registro ADD BYTEA, 25H ;inmediato a memoria RET B10ADD ENDP ; Ejemplos de resta (SUB) de palabras:

;---------------------------------------------------------C10SUB PROC MOV AX, WORDA MOV BX, WORDB SUB AX,BX ;Registro a registro SUB AX,WORDC ;Memora de registro SUB WORDA, BX ;Registro de memoria SUB BX, 1000H ;Inmediato de registro SUB WORDA, 256H ;Inmediato de memoria RET C10SUB ENDP END BEGIN

Desbordamientos Este alerta con los desbordamientos en las operaciones aritmticas. Ya que un byte solo permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operacin aritmtica puede exceder con facilidad la capacidad de un registro de un byte. Y una suma en el registro AL, que exceda su capacidad puede provocar resultados inesperados.
*** SUMA ***

AAA (ajuste ASCII para la suma) Sintaxis: AAA


Indicadores: OF ? DF IF TF SF ? ZF ? AF x PF ? CF x

Convierte el contenido del registro AL en un nmero BCD no empaquetado. Si los cuatro bits menos significativos de AL son mayores que 9 si el indicador AF est a 1, se suma 6 a AL, 1 a AH, AF se pone a 1, CF se iguala a AF y AL pone sus cuatro bits ms significativos a 0.
Ejemplo: add aaa al,bl

En el ejemplo, tras la suma de dos nmeros BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue siendo un nmero BCD no empaquetado.

ADC (suma con acarreo) Sintaxis: ADC destino, origen


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF x

Suma los operandos origen, destino y el valor del indicador de acarreo (0 1) y el resultado lo almacena en el operando destino. Se utiliza normalmente para sumar nmeros grandes, de ms de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la suma anterior.
Ejemplo: adc ax,bx

ADD (suma) Sintaxis: ADD destino, origen


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF x

Suma los operandos origen y destino almacenando el resultado en el operando destino. Se activa el acarreo si se desborda el registro destino durante la suma.
Ejemplos: add add ax,bx cl,dh

DAA (ajuste decimal para la suma) Sintaxis: DAA


Indicadores: OF ? DF IF TF SF x ZF x AF x PF x CF x

Convierte el contenido del registro AL en un par de valores BCD: si los cuatro bits menos significativos de AL son un nmero mayor que 9, el indicador AF se pone a 1 y se suma 6 a AL. De igual forma, si los cuatro bits ms significativos de AL tras la operacin anterior son un nmero mayor que 9, el indicador CF se pone a 1 y se suma 60h a AL.
Ejemplo: add daa al,cl

En el ejemplo anterior, si AL y CL contenan dos nmeros BCD empaquetados, DAA hace que el resultado de la suma (en AL) siga siendo tambin un BCD empaquetado.

INC (incrementar) Sintaxis: INC destino


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF -

Incrementa el operando destino. El operando destino puede ser byte o palabra. Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar un desbordamiento por este procedimiento (utilcese ZF).
Ejemplos: inc inc inc inc al es:[di] ss:[bp+4] word ptr cs:[bx+di+7]

***RESTA***

AAS (ajuste ASCII para la resta) Sintaxis: AAS


Indicadores: OF ? DF IF TF SF ? ZF ? AF x PF ? CF x

Convierte el resultado de la sustraccin de dos operandos BCD no empaquetados para que siga siendo un nmero BCD no empaquetado. Si el nibble inferior de AL tiene un valor mayor que 9, de AL se resta 6, se decrementa AH, AF se pone a 1 y CF se iguala a AF. El resultado se guarda en AL con los bits de 4 a 7 puestos a 0.
Ejemplo: sub aas al,bl

En el ejemplo, tras la resta de dos nmeros BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAS) sigue siendo un nmero BCD no empaquetado.

CMP (comparacin) Sintaxis: CMP destino, origen


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF x

Resta origen de destino sin retornar ningn resultado. Los operandos quedan inalterados, paro los indicadores pueden ser consultados mediante instrucciones de bifurcacin condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma dimensin.
Ejemplo: cmp cmp bx, mem_pal ch,cl

DAS (ajuste decimal para la resta) Sintaxis: DAS


Indicadores: OF DF IF TF SF x ZF x AF x PF x CF x

Corrige el resultado en AL de la resta de dos nmeros BCD empaquetados, convirtindolo tambin en un valor BCD empaquetado. Si el nibble inferior tiene un valor mayor que 9 o AF es 1, a AL se le resta 6, AF se pone a 1. Si el nibble mas significativo es mayor que 9 CF est a 1, entonces se resta 60h a AL y se activa despus CF.
Ejemplo: sub das al,bl

En el ejemplo anterior, si AL y BL contenan dos nmeros BCD empaquetados, DAS hace que el resultado de la resta (en AL) siga siendo tambin un BCD empaquetado.

DEC (decrementar) Sintaxis: DEC destino


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF -

Resta una unidad del operando destino. El operando puede ser byte o palabra. Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar un desbordamiento por este procedimiento (utilcese ZF).
Ejemplo: dec dec ax mem_byte

NEG (negacin) Sintaxis: NEG destino


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF x

Calcula el valor negativo en complemento a dos del operando y devuelve el resultado en el mismo operando.
Ejemplo: neg al

SBB (resta con acarreo) Sintaxis: SBB destino, origen


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF x

Resta el operando origen del operando destino y el resultado lo almacena en el operando destino. Si est a 1 el indicador de acarreo adems resta una unidad ms. Los operandos pueden ser de tipo byte o palabra. Se utiliza normalmente para restar nmeros grandes, de ms de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la resta anterior.
Ejemplo: sbb sbb ax,ax ch,dh

SUB (resta) Sintaxis: SUB destino, origen


Indicadores: OF x DF IF TF SF x ZF x AF x PF x CF x

Resta el operando destino al operando origen, colocando el resultado en el operando destino. Los operandos pueden tener o no signo, siendo necesario que sean del mismo tipo, byte o palabra.
Ejemplos: sub sub al,bl dx,dx

*** MULTIPLICACION ***

AAM (ajuste ASCII para la multiplicacin) Sintaxis: AAM


Indicadores: OF ? DF IF TF SF x ZF x AF ? PF x CF ?

Corrige el resultado en AX del producto de dos nmeros BCD no empaquetados, convirtindolo en un valor BCD tambin no empaquetado. En AH sita el cociente de AL/10 quedando en AL el resto de dicha operacin.

Ejemplo:

mul aam

bl

En el ejemplo, tras el producto de dos nmeros BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue siendo, en AX, un nmero BCD no empaquetado.

IMUL (multiplicacin entera con signo) Sintaxis: IMUL origen (origen no puede ser operando inmediato en 8086, s en 286)
Indicadores: OF x DF IF TF SF ? ZF ? AF ? PF ? CF x

Multiplica un operando origen con signo de longitud byte o palabra por AL o AX respectivamente. Si origen es un byte el resultado se guarda en AH (byte ms significativo) y en AL (menos significativo), si origen es una palabra el resultado es devuelto en DX (parte alta) y AX (parte baja). Si las mitades ms significativas son distintas de cero, independientemente del signo, CF y OF son activados.
Ejemplo: imul imul bx ch

MUL (multiplicacin sin signo) Sintaxis: MUL origen (origen no puede ser operando inmediato)
Indicadores: OF x DF IF TF SF ? ZF ? AF ? PF ? CF x

Multiplica el contenido sin signo del acumulador por el operando origen. Si el operando destino es un byte el acumulador es AL guardando el resultado en AH y AL, si el contenido de AH es distinto de 0 activa los indicadores CF y OF. Cuando el operando origen es de longitud palabra el acumulador es AX quedando el resultado sobre DX y AX, si el valor de DX es distinto de cero los indicadores CF y OF se activan.
Ejemplo: mul mul mul byte ptr ds:[di] dx cl

*** DIVISION ***

AAD (ajuste ASCII para la divisin) Sintaxis: AAD


Indicadores: OF ? DF IF TF SF x ZF x AF ? PF x CF ?

Convierte dos nmeros BCD no empaquetados contenidos en AH y AL en un dividendo de un byte que queda almacenado en AL. Tras la operacin AH queda a cero. Esta instruccin es necesaria ANTES de la operacin de dividir, al contrario que AAM.
Ejemplo: aad div bl

En el ejemplo, tras convertir los dos nmeros BCD no empaquetados (en AX) en un dividendo vlido, la instruccin de dividir genera un resultado correcto.

DIV (divisin sin signo) Sintaxis: DIV origen (origen no puede ser operando inmediato)
Indicadores: OF ? DF IF TF SF ? ZF ? AF ? PF ? CF ?

Divide, sin considerar el signo, un nmero contenido en el acumulador y su extensin (AH, AL si el operando es de tipo byte o DX, AX si el operando es palabra) entre el operando fuente. El cociente se guarda en AL o AX y el resto en AH o DX segn el operando sea byte o palabra respectivamente. DX o AH deben ser cero antes de la operacin. Cuando el cociente es mayor que el resultado mximo que puede almacenar, cociente y resto quedan indefinidos producindose una interrupcin 0. En caso de que las partes ms significativas del cociente tengan un valor distinto de cero se activan los indicadores CF y OF.
Ejemplo: div div bl mem_pal

IDIV (divisin entera) Sintaxis: IDIV origen (origen no puede ser operando inmediato)
Indicadores: OF ? DF IF TF SF ? ZF ? AF ? PF ? CF ?

Divide, considerando el signo, un nmero contenido en el acumulador y su extensin entre el operando fuente. El cociente se almacena en AL o AX segn el operando sea byte o palabra y de igual manera el resto en AH o DX. DX o AH deben ser cero antes de la operacin. Cuando el cociente es positivo y superior al valor mximo que puede almacenarse (7fh 7fffh), o cuando el cociente es negativo e

inferior al valor mnimo que puede almacenarse (81h u 8001h) entonces cociente y resto quedan indefinidos, generndose una interrupcin 0, lo que tambin sucede si el divisor es 0.
Ejemplo: idiv idiv bl bx

*** CONVERSIONES***

CBW (conversin de byte en palabra) Sintaxis: CBW


Indicadores: OF DF IF TF SF ZF AF PF CF -

Copia el bit 7 del registro AL en todos los bits del registro AH, es decir, expande el signo de AL a AX como paso previo a una operacin de 16 bits.

CWD (conversin de palabra a doble palabra) Sintaxis: CWD


Indicadores: OF DF IF TF SF ZF AF PF CF -

Expande el signo del registro AX sobre el registro DX, copiando el bit ms significativo de AH en todo DX.

http://meltingpot.fortunecity.com/uruguay/978/libro/04.h tml 2.7.4Ajustes.


Las instrucciones INC y DEC: Son las ms bsicas a la hora de hacer operaciones con registros: INC incrementa el valor de un registro,o de cualquier posicin en memoria, en una unidad, y DEC lo decrementa. Veamos: INC AX

Incrementa en uno el valor de AX INC WORD PTR [BX+4] Incrementa la palabra situada en CS:[BX+4] en uno. DEC AX Decrementa AX, le resta uno. DEC WORD PTR [BX+4] Decrementa la palabra situada en CS:[BX+4] en una unidad. Estas dos instrucciones, equivalentes a "a++" en C, nos servirn bastante como contadores para bucles.

http://platea.pntic.mec.es/~jdelucas/ensamblador.htm 2.7.5Comparacin.
INSTRUCCIONES DE COMPARACION Nos van a servir para realizar las comparaciones, y son: CMP y TEST CMP compara dos registros, o un registro y una direccin de memoria. Tiene el mismo formato que el SUB (por ejemplo CMP AX,BX), tan slo que ninguno de los registros es alterado. Si por ejemplo son iguales, el flag de cero se pondr en uno. Es en realidad un SUB del que no se almacena el resultado. TEST, comprobar, se puede realizar con el mismo formato de AND, ya que es equivalente a ella, tan slo que no se guarda el resultado, aunque s se modifican los flags. Y en el prximo captulo veremos cmo se aplican estos flags, y cmo realizar los saltos comparativos.

LA INSTRUCCION CMP

La instruccin CMP pro lo comn es utilizada para comparar dos campos de datos, uno de los cuales estn contenidos en un registro. El formato general para CMP es: | [etiqueta:] | CMP | {registro/memoria}, {registro/memoria/inmediato} | El resultado de una operacin CMP afecta la banderas AF, CF, OF, PF, SF y ZF, aunque no tiene que probar estas banderas de forma individual. El cdigo siguiente prueba el registro BX por un valor cero: X CMP BX, 00 ;Compara Bx con cero JZ B50 ;Si es cero salta aB50 . ;(Accin si es diferente de cero) . B50: ... ;Destino del salto, si BX es cero Si el BX tiene cero, cmp establece ZF a 1 y puede o no cambiar la configuracin de otras banderas. La instruccin JZ (salta si es cero) solo prueba la bandera ZF. Ya que ZF tiene 1 (que significa una condicin cero), JZ transfiere el control (salta) a la direccin indicada por el operando B50. Observe que la operacin compara el primer operando con el segundo; por ejemplo, el valor del primer operando es mayor que, igual o menor que el valor del segundo operando?

LA INSTRUCCION CMPS

CMPS compara el contenido de una localidad de memoria (direccionada por DS:SI). Dependiendo de la bandera de direccin, CMPS incrementa o disminuye tambin los registros SI y DI en 1 para bytes, en 2 para palabras y en 4 para palabras dobles. La operacin establece las banderas AF, CF, OF, PF, SF y ZF. Cuando se combinan con un prefijo REP y una longitud en el CX, de manera sucesiva CMPS puede comparar cadenas de cualquier longitud. Pero observe que CMPS proporciona una comparacin alfanumrica, esto es, una comparacin de acuerdo a con los valores ASCII.

Considere la comparacin de dos cadenas que contienen JEAN y JOAN. Una comparacin de izquierda a derecha, tiene el resultado siguiente: J:J Iguales E:O Diferentes (E es menor) A:A Iguales N:N Iguales Una comparacin de los 4 bytes termina con una comparacin de N con N (iguales). Ahora ya que los dos nombres no son idnticos, la operacin debe terminar tan pronto como la comparacin entre 2 caracteres sea diferente. Algunas derivaciones de CMPS son las siguientes:

CMPSB. Compara bytes. CMPSD. Compara palabras dobles. CMPSW. Compara palabras.

A continuacin se muestra la codificacin del uso del CMPS y sus derivaciones: TITLE P12CMPST (COM) Uso de CMPS para operaciones en cadenas .MODEL SMALL .CODE ORG 100H BEGIN: JMP SHORT MAIN ;------------------------------------------------------------------------------------NOM1 DB 'Assemblers' ;Elementos de datos NOM2 DB 'Assemblers' NOM3 DB 10 DUP (' ') ;------------------------------------------------------------------------------------MAIN PROC NEAR ;Procedimiento principal CLD ;Izquierda a derecha MOV CX, 10 ;Iniciar para 10 bytes LEA DI, NOM2 LEA SI, NOM1 REPE CMPSB ;Compare NOM1:NOM2 JNE G20 ;No es igual, saltarlo

MOV G20: MOV LEA LEA REPE JE MOV G30: MOV INT MAIN ENDP END

BH,01 CX, 10 DI, NOM3 SI, NOM2 CMPSB G30 BL, 02 AX, 4C00H 21H BEGIN

;Igual, fijar BH ;Iniciar para 10 bytes ;Compare NOM2:NOM3 ;Igual, salir ;No es igual, fijar BL ;Salir a DOS

2.8 Saltos.
Salto. Este trmino suele aplicarse sobre todo en programacin, donde suele distinguirse entre salto incondicional y salto condicional. El salto incondicional sera aquella instruccin del programa que nos enva a otra parte del programa sin tener en cuenta ninguna condicin. Al contrario, el salto condicional sera una, o varias instrucciones, que comprobaran primero una condicin; si esta condicin es cierta salta a una parte del programa, si es falsa a otra. Una instruccin muy conocida en programacin (por aparecer en muchos lenguajes) es GOTO, que sera la instruccin de salto incondicional por excelencia. No se suele recomendar mucho su uso (o nada), pues su utilizacin implica la creacin de un cdigo fuente para el programa, poco estructurado. http://www.lawebdelprogramador.com/diccionario/mostrar.php?letra=J

Ver archivo:saltos.doc
Saltos, ciclos y procedimientos Los saltos incondicionales en un programa escrito en lenguaje ensamblador estn dados por la instruccin jmp, un salto es alterar el flujo de la ejecucin de un programa enviando el control a la direccin indicada. Un ciclo, conocido tambien como iteracin, es la repeticin de un proceso un cierto nmero de veces hasta que alguna condicin se cumpla. En estos ciclos se utilizan los brincos condicionales basados en el estado de las banderas. Por ejemplo la instruccin jnz que salta solamente si el resultado de una operacin es diferente de cero y la instruccin jz que salta si el resultado de la operacin es cero. Por ltimo tenemos los procedimientos o rutinas, que son una serie de pasos que se usaran repetidamente en el programa y en lugar de escribir todo el conjunto de pasos unicamente se les llama por medio de la instruccin call.

Un procedimiento en ensamblador es aquel que inicie con la palabra Proc y termine con la palabra ret. Realmente lo que sucede con el uso de la instruccin call es que se guarda en la pila el registro IP y se carga la direccin del procedimiento en el mismo registro, conociendo que IP contiene la localizacin de la siguiente instruccin que ejecutara la UCP, entonces podemos darnos cuenta que se desv'a el flujo del programa hacia la direccin especificada en este registro. Al momento en que se llega a la palabra ret se saca de la pila el valor de IP con lo que se devuelve el control al punto del programa donde se invoc al procedimiento. Es posible llamar a un procedimiento que se encuentre ubicado en otro segmento, para sto el contenido de CS (que nos indica que segmento se est utilizando) es empujado tambin en la pila. http://usuarios.lycos.es/patricio/ensam/ensam2.htm

Hasta este punto los programas que hemos examinado han sido ejecutados en forma lineal, esto es con una instruccin secuencialmente a continuacin de otra. Sin embargo, rara vez un programa programable es tan sencillo. La mayora de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito especifico y varias pruebas para determinar que accin se realiza de entre varias posibles. Requisitos como este implican la transferencia de control a la direccin de una instruccin que no sigue de inmediato de la que se esta ejecutando actualmente. Una transferencia de control puede ser hacia adelante, para ejecutar una serie de pasos nuevos, o hacia atrs, para volver a ejecutar los mismos pasos. Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal aadiendo un valor de desplazamiento al IP. Direcciones Corta, cercana y lejana Una operacin de salto alcanza una direccin corta por medio de un desplazamiento de un byte, limitado a una distancia de -128 a 127 bytes. Una operacin de salto alcanza una direccin cercana por medio de un desplazamiento de una palabra, limitado a una distancia de -32, 768 a 32, 767 bytes dentro del mismo segmento. Una direccin lejana puede estar en otro segmento y es alcanzada por medio de una direccin de segmento y un desplazamiento; CALL es la instruccin normal para este propsito.

La tabla siguiente indica las reglas sobre distancias para la operaciones JMP, LOOP y CALL. Hay poca necesidad de memorizar estas reglas, ya que el uso normal de estas instrucciones en rara ocasin causa problemas.

Etiquetas de instrucciones Las instrucciones JMP, Jnnn (salto condicional) y LOOP requieren un operando que se refiere a la etiqueta de una instruccin. El ejemplo siguiente salta a A90, que es una etiqueta dada a una instruccin MOV: JMP A90 ... A90: MOV AH, 00 ... La etiqueta de una instruccin, tal como A90:, terminada con dos puntos (:) para darle atributo de cercana - esto es, la etiqueta esta dentro de un procedimiento en el mismo segmento de cdigo. Cuidado: Un error comn es la omisin de los dos puntos. Note que una etiqueta de direccin en un operando de instruccin (como JMP A90) no tiene un carcter de dos puntos.

2.8.1

Incondicional.
Incondicional

CALL (llamada a subrutina) Sintaxis: CALL destino


Indicadores: OF DF IF TF SF ZF AF PF CF -

Transfiere el control del programa a un procedimiento, salvando previamente en la pila la direccin de la instruccin siguiente, para poder volver a ella una vez ejecutado el procedimiento. El procedimiento puede estar en el mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o indirecta, indicando la direccin donde se encuentra el puntero. Segn la llamada sea cercana o lejana, se almacena en la pila una direccin de retorno de 16 bits o dos palabras de 16 bits indicando en este ltimo caso tanto el offset (IP) como el segmento (CS) a donde volver.
Ejemplos: dir call dd call proc1 0f000e987h dword ptr dir

En el segundo ejemplo, la variable dir almacena la direccin a donde saltar. De esta ltima manera -conociendo su direccin- puede llamarse tambin a un vector de interrupcin, guardando previamente los flags en la pila (PUSHF), porque la rutina de interrupcin retornar (con IRET en vez de con RETF) sacndolos.

JMP (salto) Sintaxis: JMP direccin o JMP SHORT direccin


Indicadores: OF DF IF TF SF ZF AF PF CF -

Transfiere el control incondicionalmente a la direccin indicada en el operando. La bifurcacin puede ser tambin directa o indirecta como anteriormente vimos, pero adems puede ser corta (tipo SHORT) con un desplazamiento comprendido entre -128 y 127; o larga, con un desplazamiento de dos bytes con signo. Si se hace un JMP SHORT y no llega el salto (porque est demasiado alejada esa etiqueta) el ensamblador dar error. Los buenos ensambladores (como TASM) cuando dan dos pasadas colocan all donde es posible un salto corto, para economizar memoria, sin que el programador tenga que ocuparse de poner short. Si el salto de dos bytes, que permite desplazamientos de 64 Kb en la memoria sigue siendo insuficiente, se puede indicar con far que es largo (salto a otro segmento).
Ejemplos: jmp jmp etiqueta far ptr etiqueta

RET / RETF (retorno de subrutina) Sintaxis: RET [valor] o RETF [valor]


Indicadores: OF DF IF TF SF ZF AF PF CF -

Retorna de un procedimiento extrayendo de la pila la direccin de la siguiente direccin. Se extraer el registro de segmento y el desplazamiento en un procedimiento de tipo FAR (dos palabras) y solo el desplazamiento en un procedimiento NEAR (una palabra). si esta instruccin es colocada dentro de un bloque PROC-ENDP (como se ver en el siguiente captulo) el ensamblador sabe el tipo de retorno que debe hacer, segn el procedimiento sea NEAR o FAR. En cualquier caso, se puede forzar que el retorno sea de tipo FAR con la instruccin RETF. Valor, si es indicado permite sumar una cantidad valor en bytes a SP antes de retornar, lo que es frecuente en el cdigo generado por los compiladores para retornar de una funcin con parmetros. Tambin se puede retornar de una interrupcin con RETF 2, para que devuelva el registro de estado sin restaurarlo de la pila. http://meltingpot.fortunecity.com/uruguay/978/libro/04.html Condicional Las siguientes instrucciones son de transferencia condicional de control a la instruccin que se encuentra en la posicin IP+desplazamiento (desplazamiento comprendido entre -128 y +127) si se cumple la condicin. Algunas condiciones se pueden denotar de varias maneras. Todos los saltos son cortos y si no alcanza hay que aparselas como sea. En negrita se realzan las condiciones ms empleadas. Donde interviene SF se consideran con signo los operandos implicados en la ltima comparacin u operacin aritmetico-lgica, y se indican en la tabla como '' (-128 a +127 -32768 a +32767); en los dems casos, indicados como '+', se consideran sin signo (0 a 255 0 a 65535): JA/JNBE JAE/JNB JB/JNAE/JC JBE/JNA JCXZ JE/JZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG JNC JNE/JNZ JNO JNP/JPO
Salto si mayor (above), si no menor o igual (not below or equal), si CF=0 y ZF=0. Salto si mayor o igual (above or equal), si no menor (not below), si CF=0. Salto si menor (below), si no superior ni igual (not above or equal), si acarreo, si CF=1. Salto si menor o igual (not below or equal), si no mayor (not above), si CF=1 ZF=1. Salto si CX=0. Salto si igual (equal), si cero (zero), si ZF=1. Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y SF=0. Salto si mayor o igual (greater or equal), si no menor (not less), si SF=0. Salto si menor (less), si no mayor ni igual (not greater or equal), si SF<>OF. Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=0 y SF<>OF. Salto si no acarreo, si CF=0. Salto si no igual, si no cero, si ZF=0. Salto si no desbordamiento, si OF=0. Salto si no paridad, si paridad impar, si PF=0.

+ + + +

JNS JO JP/JPE JS

Salto si no signo, si positivo, si SF=0. Salto si desbordamiento, si OF=1. Salto si paridad, si paridad par, si PF=1. Salto si signo, si SF=1.

SALTOS INCONDICIONALES Empecemos por el salto sin condiciones, con el que podremos cambiar el control a cualquier punto del programa. Sera como el "Goto" del Basic, simplemente transferir el control a otro punto del programa. La orden es JMP (de Jump, salto) Si se recuerdan los registros CS:IP, se podr ver qu es lo que hace realmente la instruccin, y no es ms que incrementar o decrementar IP para llegar a la zona del programa a la que queremos transferir el control (IP es el Offset que indica la zona de memoria que contiene la siguiente instruccin a ejecutar, y CS el segmento). El formato ms sencillo para el salto sera JMP 03424h, lo que saltara a esa zona. Pero es algo complejo calcular en qu direccin va a estar esa instruccin, con lo que utilizaremos etiquetas. He aqu un ejemplo: MOV AX,0CC34h MOV CL,22h JMP PALANTE VUELVE: CMP BX,AX JMP FIN PALANTE: MOV BX,AX JMP VUELVE FIN: XOR CX,CX

Ahora comentaremos un poco el programa. Tras la primera instruccin, AX vale 0CC34h, y tras la segunda, CL vale 22h. Despus se realiza un salto a la instruccin etiquetada con "PALANTE". La etiqueta ha de estar continuada por dos puntos ':', y puede ser llamada desde cualquier lugar del programa. Tambin podremos hacer un MOV AX,[PALANTE], como hacamos antes con un MOV AX,[BX], pero asignando a AX el valor que haya en la direccin en la que est "PALANTE". El caso es que tras el salto a "PALANTE", se copia el valor del registro BX en AX, y se vuelve a "VUELVE". Se realiza una comparacin entre AX y BX, que pondr el flag de cero a 1 (recordemos la anterior leccin), se saltar a "FIN", donde tan slo se realizar la orden Xor CX,CX cuyo resultado, por cierto, es poner CX a cero, tenga el valor que tenga. Volvamos con la sintaxis del JMP con algunos ejemplos de cmo utilizarlo: JMP 100h Salta a la direccin 100h. Un archivo .COM comienza normalmente en esa direccin, as que es posible verlo en algunos virus. JMP 542Ah:100h Salta a la direccin 100h pero del segmento 542Ah. JMP SHORT 223Ah Salto corto a la direccin 223Ah. JMP NEAR 55AAh Salto cercano, es diferente al corto JMP [100h] Salta a la direccin contenida en 100h. Sin embargo es un error, ya que no se especifica si es cercano, lejano, si se lee un solo byte,es decir,

esta instruccin no es vlida. JMP WORD PTR [BX] Ahora s vale. Salta a la direccin contenida en la palabra (dos bytes) a la que apunta BX. O sea, si BX valiese 300h y en 300h los dos bytes fuesen 0CC33h, el JMP saltara a esta direccin. JMP DWORD PTR [BX+SI+5] Dword son 32 bits, o sea, un salto lejano. Y saltara al contenido en la direccin de memoria a la que apuntan la suma de BX,SI y 5. Veamos el significado de los saltos lejanos, cercanos y cortos. El salto corto se realiza entre el punto en el que se est y +127 o -128, o sea, la cantidad que se puede contener en un byte con signo. A veces es necesario indicar que se trata de salto corto, cercano o lejano. El salto cercano se realiza contando como distancia el contenido de dos bytes, o sea, que el rango sera desde 32767 a -32768 bytes de distancia. Y el lejano se realiza contando como distancia el contenido de cuatro Bytes. Por ejemplo, es incorrecto que haya en la direccin 100h una instruccin que diga JMP SHORT 500h, ya que la distancia no corresponde a un salto corto. Adems, el salto dependiendo de que sea cercano, corto o largo se codifica de manera diferente en modo hexadecimal.

La instruccin JMP (Salto incondicional) Una instruccin usada comnmente para la transferencia de control es la instruccin JMP (jump, salto, bifurcacin). Un salto es incondicional, ya que la operacin transfiere el control bajo cualquier circunstancia. Tambin JMP vaca el resultado de la instruccin previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento. El formato general para

JMP es: | [etiqueta] | JMP | direccin corta, cercana o lejana |

Una operacin JMP dentro del mismo segmento puede ser corta o cercana (o de manera tcnica, lejana, si el destino es un procedimiento con el atributo FAR). En su primer paso por un programa fuente, el ensamblador genera la longitud de cada instruccin. Sin embargo, una instruccin JMP puede ser de dos o tres bytes de longitud. Una operacin JMP a una etiqueta dentro de -128 a + 127 bytes es un salto corto. El ensamblador genera un byte para la operacin (EB) y un byte para el operando. El operando acta como un valor de desplazamiento que la computadora suma al registro IP cuando se ejecuta el programa. El ensamblador ya puede haber encontrado el operando designado (un salto hacia atrs) dentro de -128 bytes, como en: A50: ... JMP A50 En este caso, el ensamblador genera una instruccin de maquina de dos bytes. Una JMP que excede -128 a 127 bytes se convierte en un salto cercano, para que el ensamblador genere un cdigo de maquina diferente (E9) y un operando de dos bytes (procesadores 8088/8086) o un operando de cuatro bytes (procesadores 80386 y posteriores). En un salto hacia adelante, el ensamblador aun no ha encontrado el operando designado: JMP A90 ... A90: Ya que algunas versiones del ensamblador no saben en este punto si el salto es corto o cercano, generan de forma automtica una

instruccin de tres bytes. Page 60,132 P08JUMP (COM) Uso de JMP para iterar .MODEL SMALL .CODE ORG 100H PROC NEAR MOV AX,01 ;Iniciacin de AX, MOV BX,01 ;BX y MOV CX,01 ;CX a 01 ADD ADD SHL JMP ENDP END AX, 01 BX, AX CX, 1 A20 MAIN ;Sumar 01 a AX ;Sumar AX a BX ;Multiplicar por dos a CX ;Saltar a la etiqueta A20

TITLE

MAIN

A20:

MAIN

La instruccin LOOP La instruccin LOOP, requiere un valor inicial en el registro CX. En cada iteracin, LOOP de forma automtica disminuye 1 de CX. Si el valor en el CX es cero, el control pasa a la instruccin que sigue; si el valor en el CX no es cero, el control pasa a la direccin del operando. La distancia debe ser un salto corto, desde -128 hasta +127 bytes. Para una operacin que exceda este limite, el ensamblador enva un mensaje como "salto relativo fuera de rango". El formato general de la instruccin LOOP es: | [etiqueta:] | LOOP | direccin corta |

El siguiente programa muestra el funcionamiento de la instruccin LOOP.

Page 60,132 TITLE P08LOOP (COM) Ilustracin de LOOP .MODEL SMALL .CODE ORG 100H MAIN PROC NEAR MOV AX,01 ;Iniciacin de AX, MOV BX,01 ;BX y MOV CX,01 ;CX a 01 MOV CX,10 ;Iniciar A20: ;Nmero de iteraciones ADD AX, 01 ;Sumar 01 a AX ADD BX, AX ;Sumar AX a BX SHL DX, 1 ;Multiplicar por dos a DX LOOP A20 ;Iterar si es diferente de cero MOV AX, 4C00H ;Salida a DOS MAIN ENDP END MAIN Existen dos variaciones de la instruccin LOOP, ambas tambin decrementan el CX en 1. LOOPE/LOOPZ (repite el ciclo mientras sea igual o repite el ciclo mientras sea cero) continua el ciclo mientras que el valor en el CX es cero o la condicin de cero esta establecida. LOOPNE/LOOPNZ (repite el ciclo mientras no sea igual o repite el ciclo mientras sea cero) continua el ciclo mientras el valor en el CX no es cero o la condicin de cero no esta establecida.

2.8.2Condicional.
SALTOS CONDICIONALES Recuerdan el IF-THEN-ELSE, o el FOR, o el WHILE-DO ? Bien, pues aqu est lo que suple a estas instrucciones en lenguaje Ensamblador. Se basan completamente en los flags, pero estn simplificados. Los saltos podran resumirse en un modo "Basic" de la manera IF-THEN-GOTO de forma que cuando se cumple una condicin se salta a un sitio

determinado. He aqu los tipos de saltos condicionales (las letras en maysculas son las instrucciones): JO: Jump if overflow. Salta si el flag de desbordamiento est a uno JNO: Jump if not overflow. Salta si el flag de desbordamiento est a cero. JC, JNAE, JB: Los tres sirven para lo mismo. Significan: Jump if Carry, Jump if Not Above or Equal y Jump if Below. Saltan por lo tanto si al haber una comparacin el flag de acarreo se pone a 1; es entonces equivalente a < en una operacin sin signo. Vamos, que se compara as: CMP 13h,18h, saltar, ya que 13h es menor que 18h. Tambin se suelen usar para detectar si hubo fallo en la operacin, ya que muchas interrupciones al acabar en fallo encienden el carry flag. JNC, JAE, JNB: Otros tres que valen exactamente para lo mismo. Jump if not Carry, Jump if Above or Equal y Jump if Not Below. Saltan por tanto si al haber una comparacin el flag de acarreo vale 0, o sea, es equivalente al operador >=. En la comparacin CMP 0,0 o CMP 13h,12h saltar, ya que el segundo operando es MAYOR O IGUAL que el primero. JZ o JE: Jump if Zero o Jump if Equal. Salta si el flag de cero est a 1, o sea, si las dos instrucciones comparadas son iguales. Saltara en el caso CMP 0,0 JNZ o JNE: Jump if Not Zero o Jump if Not Equal. Salta si el flag de cero est a 0, o sea, si las dos instrucciones comparadas no son iguales. JBE o JNA: Jump if Below or Equal o Jump if Not Above. Saltara si en resultado de la comparacin el primer miembro es menor o igual que el

segundo ( <= ) JA o JNBE: Jump if Above o Jump if Not Below of Equal. Justo lo contrario que la anterior, salta si en el resultado de la comparacin el primer miembro es mayor al segundo. JS: Jump if Sign. Salta si el flag de signo est a uno. JNS: Jump if Not Sign. Salta si el flag de signo est a cero. JP, JPE: Jump if Parity o Jump if Parity Even. Salta si el flag de paridad est a uno. JNP, JPO: Jump if Not Parity, Jump if Parity Odd. Salta si el flag de paridad est a cero. JL, JNGE: Jump if Less, Jump if Not Greater of Equal. Salta si en el resultado de la comparacin, el primer nmero es inferior al segundo, pero con nmeros con signo. JGE, JNL: Jump if Greater or Equal, Jump if Not Less. Salta si en el resultado de la comparacin, el primer nmero es mayor o igual que el segundo, pero con nmeros con signo. JLE, JNG: Jump if Lower or Equal, Jump if Not Greater. Salta si en el resultado de la comparacin, el primer nmero es menor o igual que el segundo, pero con nmeros con signo. JG, JNLE: Jump if Greater, Jump if Not Lower or Equal. Salta si en el resultado de la comparacin, el primer nmero es mayor que el segundo, para nmeros con signo. Veamos algunos ejemplos de los ms utilizados: MOV AX,1111h MOV BX,1112h

CMP AX,BX ; AX es menor que BX JB tirapalante ; Saltar a tirapalante HLT ; Esta orden bloquea el ordenador, halt tirapalante: DEC BX ; Ahora BX valdr 1111h CMP AX,BX ; Ahora valen igual JNE Acaba ; No saltar, ya que son iguales JE Continua ; Esta vez si Continua: DEC BX ; Ahora BX vale 1110h CMP AX,BX JE Acaba ; No son iguales, por tanto no saltar JB Acaba ; No es menor, tampoco salta JG Acaba ; Es mayor, ahora SI saltar Acaba: XOR AX,AX XOR BX,BX ; AX y BX valen ahora cero. Espero que con esto haya aclarado un poco la utilidad de los saltos. Evidentemente, ahora al escribir sabemos cuando uno es menor o mayor, pero a veces mediante interrupciones sacaremos valores que no conoceremos al ir a programar, o quiz lo hagamos de la memoria, y querremos comprobar si son iguales, etctera. Por cierto, que en los saltos condicionales se puede hacer como en los incondicionales, o sea, formatos como: JE 0022h JNE 0030h JNO AL Sin embargo, estamos limitados a saltos cortos, o sea, de rango a 127

bytes hacia delante o 128 hacia atrs, no pudiendo superar esta distancia.

INSTRUCCIONES DE SALTO CONDICIONAL El ensamblador permite usar una variedad de instrucciones de salto condicional que transfieren el control dependiendo de las configuraciones en el registro de banderas. Por ejemplo, puede comparar dos campos y despus saltar de acuerdo con los valores de las banderas que la comparacin establece. El formato general para el salto condicional es: | [etiqueta:] | Jnnn | direccin corta |

Como ya se explico la instruccin LOOP disminuye el registro CX; si es diferente de cero, transfiere el control a la direccin del operando. podra reemplazar el enunciado LOOP A20 de la figura anterior con dos enunciados - uno que decremente el CX y otro que realice un salto condicional: DEC CX ;Equivalente a LOOP JNZ A20 ... DEC y JNZ realizan exactamente lo que hace LOOP. DEC decrementa en 1 CX y pone a 1 o a 0 la bandera de cero (ZF) en el registro de banderas. Despus JNZ prueba la configuracin de la bandera de cero; si el CX es diferente de cero, el control pasa a A20, y si el CX es cero el control pasa a la siguiente instruccin hacia abajo Datos con signo y sin signo Distinguir el propsito de los saltos condicionales debe clarificar su uso. El tipo de datos (sin signo o con signo) sobre los que se realizan las comparaciones o la aritmtica puede determinar cual es la instruccin a utilizar. Un dato sin signo trata todos los bits como bits de datos; ejemplos tpicos son las cadenas de caracteres, tal como nombres o direcciones, y valores numricos tal como nmeros de

cliente. Un dato con signo trata el bit de mas a la izquierda como un signo, en donde 0 es positivo y 1 es negativo. En el ejemplo siguiente, el AX contiene 11000110 y el BX contiene 00010110. La siguiente instruccin CMP AX, BX compara el contenido de AX con el contenido del BX. Para datos sin signo, el valor AX es mayor; sin embargo, para datos con signo el valor AX es menor a causa del signo negativo. Saltos con base en datos sin signo Las instrucciones siguientes de salto condicional se aplican a datos sin signo:

Cada una de estas pruebas las puede expresar en uno de dos cdigos simblicos de operacin. Saltos con base en datos con signo Las instrucciones siguientes de salto condicional se aplican a datos con signo:

Pruebas aritmticas especiales Las siguientes instrucciones de salto condicional tienen usos especiales:

No espere memorizar todas estas instrucciones; sin embargo, como recordatorio note que un salto para datos sin signo es igual, superior o inferior, mientras que un salto para datos con signo es igual, mayor que o menor. Los saltos que prueban banderas de acarreo, de desbordamiento y de paridad tienen propsitos nicos.

2.9 Tipos de ciclos.


Gestin de bucle

LOOP (bucle) Sintaxis: LOOP desplazamiento


Indicadores: OF DF IF TF SF ZF AF PF CF -

Decrementa el registro contador CX; si CX es cero, ejecuta la siguiente instruccin, en caso contrario transfiere el control a la direccin resultante de sumar a IP + desplazamiento. El desplazamiento debe estar comprendido entre -128 y +127. Ejemplo:
mov cx,10 bucle: ....... ....... loop bucle

Con las mismas caractersticas que la instruccin anterior:

LOOPE/LOOPZ

Bucle si igual, si cero. Z=1 y CX<>0

LOOPNE/LOOPNZ Bucle si no igual, si no cero. Z=0 y CX<>0 BUCLES He aqu el equivalente al FOR-TO-NEXT en Ensamblador, se trata de la orden LOOP. Lo que hace esta orden es comparar CX con cero; si es igual, sigue adelante, si no lo es, vuelve al lugar que se indica en su operando decrementando CX en uno. Por lo tanto, CX ser un contador de las veces que ha de repetirse el bucle. Veamos un ejemplo: MOV CX,0005h bucle: INC DX CMP DX,0000h JE Acaba LOOP bucle

Acaba: ... Veamos como funciona este programa. Se mueve a CX el valor 5h, que van a ser las veces que se repita el bucle. Ahora, llegamos al cuerpo del bucle. Se incrementa DX y se compara con 0, cuando es igual salta a "Acaba". Si llega a la orden LOOP, CX se decrementar y saltar a bucle. Esto se repetir cinco veces. En fin, que el programa acabar en el grupo de instrucciones de "Acaba" cuando la comparacin d un resultado positivo o cuando el bucle se haya repetido cinco veces. Tambin tiene la limitacin de que slo realiza saltos cortos, as como puede usarse como el JMP, de la forma: LOOP 0003h LOOP [AL] En resumen, la orden LOOP es la equivalente a CMP CX,0/JNZ par metro, donde par metro es el operando de LOOP.

2.10

Operadores Lgicos.

Operaciones lgicas y aritmticas Las instrucciones de las operaciones lgicas son: AND, not, or y xor, stas trabajan sobre los bits de sus operandos. Para verificar el resultado de operaciones recurrimos a las instrucciones cmp y test. Las instrucciones utilizadas para las operaciones algebraicas son: para sumar add, para restar sub, para multiplicar mul y para dividir div. Casi todas las instrucciones de comparacin estn basadas en la informacin contenida en el registro de banderas. Normalmente las banderas de este registro que pueden ser directamente manipuladas por el programador son la bandera de direccin de datos DF, usada para definir las operaciones sobre cadenas. Otra que tambien puede ser manipulada es la bandera IF por medio de las instrucciones sti y cli, para activar y desactivar respectivamente las interrupciones.

http://usuarios.lycos.es/patricio/ensam/ensam2.htm
INSTRUCCIONES DE OPERACIONES LGICAS A NIVEL DE BIT. AND (y lgico) Sintaxis: AND destino, origen
Indicadores: OF 0 DF IF TF SF x ZF x AF ? PF x CF 0

Realiza una operacin de Y lgico entre el operando origen y destino quedando el resultado en el destino. Son vlidos operandos byte o palabra, pero ambos del mismo tipo.
Ejemplos: and and ax,bx bl,byte ptr es:[si+10h]

NOT (no lgico) Sintaxis: NOT destino


Indicadores: OF DF IF TF SF ZF AF PF CF -

Realiza el complemento a uno del operando destino, invirtiendo cada uno de sus bits. Los indicadores no resultan afectados.
Ejemplo: not ax

OR (O lgico) Sintaxis: OR destino, origen


Indicadores: OF 0 DF IF TF SF x ZF x AF ? PF x CF 0

Realiza una operacin O lgico a nivel de bits entre los dos operandos, almacenndose despus el resultado en el operando destino.
Ejemplo: or ax,bx

TEST (comparacin lgica) Sintaxis: TEST destino, origen


Indicadores: OF 0 DF IF TF SF x ZF x AF ? PF x CF 0

Realiza una operacin Y lgica entre los dos operandos pero sin almacenar el resultado. Los indicadores son afectados con la operacin.
Ejemplo: test al,bh

XOR (O exclusivo) Sintaxis: XOR destino, origen


Indicadores: OF 0 DF IF TF SF x ZF x AF ? PF x CF 0

Operacin OR exclusivo a nivel de bits entre los operandos origen y destino almacenndose el resultado en este ltimo.
Ejemplo: xor di,ax

http://meltingpot.fortunecity.com/uruguay/978/libro/04.html Instrucciones lgicas y de manipulacin de bits. Las instrucciones lgicas ejecutan operaciones binarias sobre series de bits almacenadas en registros. son tiles para manipular bits individuales o un grupo de bits que represente informacin en cdigo binario. Las instrucciones lgicas consideran en forma separada cada bit del operando y la tratan como una variable booleana. Mediante una aplicacin adecuada de las instrucciones lgicas, es posible cambiar los valores de bits, emplear un es que un grupo de bits o insertar nuevos valores de bits en los operandos almacenados en registros o palabras de memoria. Algunas instrucciones lgicas y de manipulacin de bits tpicas se listan en la tabla 8-8. La instruccin de borrar hace que el operando especificado se sustituya con 0. La instruccin complementar produce el complemento a 1 al invertir todos los bits del operando. Las instrucciones AND, OR y XOR producen las operaciones lgicas correspondientes sobre los bits individuales de los operandos. Aunque realizan operaciones booleanas, deben considerarse que las instrucciones ejecutan operaciones de manipulacin de bits cuando se usan en instrucciones de computadora. Existen tres operaciones de manipulacin de bits posibles: un bit seleccionado puede borrarse a 0, activarse en 1, o puede complementarse. Por lo general, se aplican las tres instrucciones lgicas para hacer slo eso. La instruccin AND se utiliza para borrar un bit o un grupo seleccionado de bits de un operando. Para cualquier variable booleana x, las relaciones xb0 = 0 y xb1 = x dictan que una variable binaria ala que se le haya aplicado un AND con un 0 produce un 0; pero la variable no cambia de valor cuando se le aplica un AND con un 1. Por lo tanto, la instruccin AND puede utilizarse para borrar bits de un operando en forma selectiva al aplicar AND al operando con otro operando que tiene 0 en las posiciones de bit que deben borrarse. La instruccin AND tambin se llama mscara, y aritmtica porque enmascara o inserta 0 en una parte seleccionada de un operando.

La instruccin OR se utiliza para activar un bit o un grupo seleccionado de bits de un operando. Para cualquier variable booleana x, las relaciones x + 1 = 1 y x + 0 = x dictan que una variable binaria ala que se le aplica OR con un 1 produce un 1; pero la variable no cambia cuando se .le aplica OR con un 0. Por lo tanto, la instruccin OR puede utilizarse para activar bits de un operando en forma selectiva, al aplicar OR con otro operando Con dgitos 1 en las posiciones de bits que deben activarse en 1.

TABLA 8-8 Instrucciones lgicas y de manipulacin de bits tpicas

NOMBRE Borrar complementar Aplicar la funcin AND Aplicar la funcin OR CLR

MNEMONICO

COM AND OR

Aplicar la funcin OR exclusiva XOR Desactivar acarreo Activar acarreo Complementar acarreo Habilitar interrupcin Deshabilitar interrupcin CLRC SETC COMC EI DI

De igual forma, la instruccin XOR se utiliza para complementar bits de un operando en forma selectiva. Esto se debe a la relacin boolena x(+) 1= x' y x (+) 0 = x. Por lo tanto, una variable binaria se complementa cuando se le aplica XOR con un 1, pero no cambia

en valor cuando se le aplica XOR con un 0. En la seccin 4-5 se muestran ejemplos numricos de las tres operaciones lgicas. En la tabla 8-8 se incluyen algunas otras instrucciones de manipulacin de bits. Los bits individuales (como los de un acarreo) pueden borrarse, activarse o complementarse con las instrucciones apropiadas. Otro ejemplo es un flip-flop que controla la opcin de interrupcin y se habilita o deshabilita mediante instrucciones de manipulacin de bits. http://members.fortunecity.es/roy8/cpu.htm

2.11 Desplazamiento. Ver archivo: algo_desplazamientos.pdf


INSTRUCCIONES DE ROTACIN Y DESPLAZAMIENTO.

RCL (rotacin a la izquierda con acarreo) Sintaxis: RCL destino, contador


Indicadores: OF x DF IF TF SF ZF AF PF CF x

Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF el nmero de bits especificado en el segundo operando. Si el nmero de bits a desplazar es 1, se puede especificar directamente, en caso contrario el valor debe cargarse en CL y especificar CL como segundo operando. No es conveniente que CL sea mayor de 7, en bytes; 15, en palabras.

Ejemplos:

rcl rcl rcl

ax,1 al,cl di,1

RCR (rotacin a la derecha con acarreo) Sintaxis: RCR destino, contador


Indicadores: OF x DF IF TF SF ZF AF PF CF x

Rotar a la derecha los bits del operando destino junto con el indicador de acarreo CF el nmero de bits especificado en el segundo operando. Si el nmero de bits es 1 se puede especificar directamente; en caso contrario su valor debe cargarse en CL y especificar CL como segundo operando:

Ejemplos:

rcr rcr

bx,cl bx,1

ROL (rotacin a la izquierda) Sintaxis: ROL destino, contador


Indicadores: OF x DF IF TF SF ZF AF PF CF x

Rota a la izquierda los bits del operando destino el nmero de bits especificado en el segundo operando, que puede ser 1 CL previamente cargado con el valor del nmero de veces.

Ejemplos:

rol rol

dx,cl ah,1

ROR (rotacin a la derecha) Sintaxis: ROR destino, contador


Indicadores: OF x DF IF TF SF ZF AF PF CF x

Rota a la derecha los bits del operando destino el nmero de bits especificado en el segundo operando. Si el nmero de bits es 1 se puede poner directamente, en caso contrario debe ponerse a travs de CL.

Ejemplos:

ror ror

cl,1 ax,cl

SAL/SHL (desplazamiento aritmtico a la izquierda) Sintaxis: SAL/SHL destino, contador


Indicadores: OF x DF IF TF SF x ZF x AF ? PF x CF x

Desplaza a la izquierda los bits del operando el nmero de bits especificado en el segundo operando que debe ser CL si es mayor que 1 los bits desplazados.

SAR (desplazamiento aritmtico a la derecha) Sintaxis: SAR destino, contador


Indicadores: OF x DF IF TF SF x ZF x AF ? PF x CF x

Desplaza a la derecha los bits del operando destino el nmero de bits especificado en el segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer operando. Si el nmero de bits a desplazar es 1 se puede especificar directamente, si es mayor se especifica a travs de CL.

Ejemplos:

sar sar

ax,cl bp,1

SHR (desplazamiento lgico a la derecha) Sintaxis: SHR destino, contador


Indicadores: OF x DF IF TF SF x ZF x AF ? PF x CF x

Desplaza a la derecha los bits del operando destino el nmero de los bits especificados en el segundo operando. Los bits de la izquierda se llena con cero. Si el nmero de bits a desplazar es 1 se puede especificar directamente en el caso en que no ocurra se pone el valor en CL:

Ejemplos:

shr shr

ax,cl cl,1

http://meltingpot.fortunecity.com/uruguay/978/libro/04.html

2.11.1

Lineal.

Instrucciones de corrimiento Las instrucciones para recorrer el contenido de un operando son muy tiles y se ofrecen con frecuencia en diversas variaciones. Los corrimientos son operaciones en las cuales los bits de una palabra se recorren a la izquierda o derecha. El bit que se recorre al extremo de la palabra determina el tipo de corrimiento que utiliza. Las instrucciones de corrimiento pueden especificar corrimientos lgicos, aritmticos u operaciones de tipo rotatorio. En cualquier caso, el corrimiento puede ser a la derecha o a la izquierda. ,

La tabla 8-9 lista cuatro tipos de instrucciones de corrimiento. El corrimiento lgico inserta un 0 al de la posicin final de bit. La posicin final es el bit al extremo izquierdo para el corrimiento a la derecha y el bit al extremo derecho para el corrimiento a la izquierda. Por lo general, los corrimientos aritmticos se apegan a las reglas para los nmeros de complemento a 2 con signo. Estas reglas se proporcionan en la seccin 4-6. La instruccin aritmtica de corrimiento a la derecha debe preservar el bit de signo en la posicin al extremo izquierdo. El bit de signo se desplaza ala derecha. TABLA 8-9 Instrucciones de corrimiento tpicas

NOMBRE Corrimiento a la derecha lgico Corrimiento a la izquierda lgico Corrimiento a la derecha aritmtico Corrimiento a la izquierda aritmtico Rotar a la derecha Rotar a la izquierda Rotar a la derecha mediante acarreo Rotar a la izquierda mediante acarreo

MNEMONICO SHR SHL SHRA SHLA ROR ROL RORC ROLC

Junto con el resto del nmero, pero el bit de signo no cambia. Esta es una operacin de corrimiento a la derecha en la que el bit final permanece igual. La instruccin de corrimiento aritmtico a la izquierda inserta 0 en la posicin fina.! y es idntica a la instruccin lgica de corrimiento a la izquierda. Por esta razn muchas computadoras no proporcionan una instruccin distinta de corrimiento aritmtico a la izquierda cuando ya est disponible la instruccin de corrimiento lgico a la izquierda. Las instrucciones de rotacin producen un corrimiento circular. Los bits recorridos en un extremo de la palabra no se pierden en un desplazamiento lgico, pero se hacen circular hasta el otro extremo. La instruccin de rotacin a travs del bit de acarreo trata al bit de acarreo como una extensin del registro cuya palabra se est rotando. Por lo tanto una instruccin de rotacin ala izquierda a travs del acarreo transfiere el. bit de acarreo a la posicin de bit a la extrema derecha del registro, transfiere la posicin de la extrema izquierda al acarreo y, al mismo tiempo, recorre todo el registro a la izquierda.

Algunas computadoras tienen un formato de campo mltiple para las instrucciones de corrimiento. Un campo contiene el cdigo de operacin y los otros especifican el tipo de corrimiento y la cantidad de veces que se va a recorrer un operando. Un formato de cdigo de instruccin posible de una instruccin de desplazamiento puede incluir cinco campos de la manera siguiente. OP REG TYPE RL COUNT Aqu OP es el campo de cdigo de operacin; REG es una direccin de registro que especifica la posicin del operando; TYPE es un campo de 2 bits que especifica los cuatro diferentes tipos de corrimientos; LR es un campo de 1 bit que especifica un corrimiento a la derecha o ala izquierda y COUNT es un campo de k bits que especifica hasta 2k -1 corrimientos. Con tal formato es posible especificar el tipo de corrimiento, la direccin y la cantidad de corrimientos, todo en una sola instruccin.

CORRIMIENTO DE BITS. Las instrucciones de corrimiento, que son parte de la capacidad lgica de la computadora, pueden realizar las siguientes acciones: 1. Hacer referencia a un registro o direccin de memoria. 2. Recorre bits a la izquierda o a la derecha. 3. Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 4. Corrimiento lgico (sin signo) o aritmtico (con signo). El segundo operando contiene el valor del corrimiento, que es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de corrimiento mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes de corrimiento inmediato hasta 31. El formato general para el corrimiento es

| [etiqueta:] | Corrim. | {registro/memoria}, {CL/inmediato} |

Corrimiento de bits hacia la derecha. Los corrimientos hacia la derecha (SHR y SAR) mueven los bits hacia la derecha en el registro designado. El bit recorrido fuera del registro mete la bandera de acarreo. Las instrucciones de corrimiento a la derecha estipulan datos lgicos (sin signo) o aritmticos (con signo):

Las siguientes instrucciones relacionadas ilustran SHR y datos con signo:

INSTRUCCION MOV CL, 03 MOV AL, 10110111B SHR AL, 01 SHR AL, CL a la derecha SHR AX, 03 posteriores

AL

COMENTARIO

; 10110111 ; 11011011 Un corrimiento a la derecha ; 00001011 Tres corrimientos adicionales ; Vlido para 80186 y procesadores

El primer SHR desplaza el contenido de AL un bit hacia la derecha. El bit de mas a la derecha es enviado a la bandera de acarreo, y el bit de mas a la izquierda se llena con un cero. El segundo SHR desplaza tres bits mas al AL. La bandera de acarreo contiene de manera sucesiva 1, 1 y 0; adems, tres bits 0 son colocados a la izquierda del AL. SAR se difiere de SHR en un punto importante: SAR utiliza el bit de signo para llenar el bit vacante de mas a la izquierda. De esta manera, los valores positivos y negativos retienen sus signos. Las siguientes instrucciones relacionadas ilustran SAR y datos con signo en los que el signo es un bit 1:
INSTRUCCION AL COMENTARIO

MOV MOV SHR SHR derecha SHR

CL, 03 AL, 10110111B AL, 01 AL, CL AX, 03

;; 10110111 ; 11011011 Un corrimiento a la derecha ; 00001011 Tres corrimientos adicionales a la ; Vlido para 80186 y procesadores posteriores

En especial, los corrimientos a la derecha son tiles para (dividir entre 2) obtener mitades de valores y son mucho mas rpidas que utilizar una operacin de divisin. Al terminar una operacin de corrimiento, puede utilizar la instruccin JC (Salta si hay acarreo) para examinar el bit desplazado a la bandera de acarreo.

Corrimiento de bits a la izquierda. Los corrimientos hacia la izquierda (SHL y SAL) mueven los bits a la izquierda, en el registro designado. SHL y SAL son idnticos en su operacin. El bit desplazado fuera del registro ingresa a la bandera de acarreo. Las instrucciones de corrimiento hacia la izquierda estipulan datos lgicos (sin signo) y aritmticos (con signo): SHL: Desplazamiento lgico a la izquierda aritmtico a la izquierda SAL: Desplazamiento

Las siguientes instrucciones relacionadas ilustran SHL para datos sin signo:
INSTRUCCION MOV CL, 03 MOV AL, 10110111B SHR AL, 01 SHR AL, CL AL COMENTARIO

; 10110111 ; 01101110 Un corrimiento a la izquierda ; 01110000 Tres corrimientos mas

SHR AX, 03 posteriores

; Vlido para 80186 y procesadores

El primer SHL desplaza el contenido de AL un bit hacia la izquierda. El bit de mas a la izquierda ahora se encuentra en la bandera de acarreo, y el ultimo bit de la derecha del AL se llena con cero. El segundo SHL desplaza tres bits mas a el AL. La bandera de acarreo contiene en forma sucesiva 0, 1 y 1, y se llena con tres ceros a la derecha del AL. Los corrimientos a la izquierda llenan con cero el bit de mas a la derecha. Como resultado de esto, SHL y SAL don idnticos. Los corrimientos a la izquierda en especial son tiles para duplicar valores y son mucho mas rpidos que usar una operacin de multiplicacin. Al terminar una operacin de corrimiento, puede utilizar la instruccin JC (Salta si hay acarreo) para examinar el bit que ingreso a la bandera de acarreo.

http://www.itlp.edu.mx/publica/tutoriales/ensamblador/ 2.11.2
3

Circular.

ROTACION DE BITS (Desplazamiento circular)

Las instrucciones de rotacin, que son parte de la capacidad lgica de la computadora, pueden realizar las siguientes acciones: 1. Hacer referencia a un byte o a una palabra. 2. Hacer referencia a un registro o a memoria. 3. Realizar rotacin a la derecha o a la izquierda. El bit que es desplazado fuera llena el espacio vacante en la memoria o registro y tambin se copia en la bandera de acarreo. 4. Realizar rotacin hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 5. Realizar rotacin lgica (sin signo) o aritmtica (con signo).

El segundo operando contiene un valor de rotacin, el cual es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de rotacin mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes inmediatas hasta el 31. El formato general para la rotacin es:

| [etiqueta:] | Rotacin | {registro/memoria}, {CL/inmediato} |

Rotacin a la derecha de bits Las rotaciones a la derecha (ROR y RCR) desplazan a la derecha los bits en el registro designado. Las instrucciones de rotacin a la derecha estipulan datos lgicos (sin signo) o aritmticos (con signo):

Las siguientes instrucciones relacionadas ilustran ROR:


INSTRUCCION MOV CL, 03 MOV BH, 10110111B SHR BH, 01 SHR BH, CL SHR BX, 03 posteriores BH COMENTARIO

; 10110111 ; 11011011 Una rotacin a la derecha ; 00001011 Tres rotaciones a la derecha ; Vlido para 80186 y procesadores

El primer ROR desplaza el bit de mas a la derecha del BH a la posicin vacante de mas a la izquierda. La segunda y tercera operaciones ROR realizan la rotacin de los tres bits de mas a la derecha.

RCR provoca que la bandera de acarreo participe en la rotacin. Cada bit que se desplaza fuera de la derecha se mueve al CF y el bit del CF se mueve a la posicin vacante de la izquierda. Rotacin a la izquierda de bits Las rotaciones a la izquierda (ROL y RCL) desplazan a la izquierda los bits del registro designado. Las instrucciones de rotacin a la izquierda estipulan datos lgicos (sin signo) y aritmticos (con signo):

Las siguientes instrucciones relacionadas ilustran ROL:


INSTRUCCION MOV CL, 03 MOV BL, 10110111B SHR BL, 01 SHR BL, CL SHR BX, 03 posteriores BL COMENTARIO

; 10110111 ; 11011011 Una rotacin a la izquierda ; 00001011 Tres rotaciones a la izquierda ; Vlido para 80186 y procesadores

El primer ROL desplaza el bit de mas a la izquierda del BL a la posicin vacante de mas a la derecha. La segunda y tercera operaciones ROL realizan la rotacin de los tres bits de mas a la izquierda. De manera similar a RCR, RCL tambin provoca que la bandera de acarreo participe en la rotacin. Cada bit que se desplaza fuera por la izquierda se mueve al CF, y el bit del CF se mueve a la posicin vacante de la derecha. Puede usar la instruccin JC (salta si hay acarreo) para comprobar el bit rotado hacia la CF en el extremo de una operacin de rotacin.
http://www.itlp.edu.mx/publica/tutoriales/ensamblador/tem6_4_.htm

3.1 Procesos de control. 3.1.1Banderas.


FLAGS La explicacin de los "flags" est relacionada con los saltos condicionales. Los que hayis visto un mnimo de otros lenguajes recordaris las sentencias FOR y NEXT (en Basic), o el IF/THEN/ELSE tambin en estilo Basic pero que tambin se encuentran en otros lenguajes. Pues bien, los flags y las instrucciones condicionales va a ser lo que os encontris en este captulo. Veamos el registro de flags. A las flags, "banderas", las agrupa un solo registro de 16 bits, aunque ste no est utilizado por completo, ya que cada flag ocupa un solo bit. Qu son los flags? Se trata de varios bits, que, como siempre, pueden valer uno o cero, y dependiendo de su valor indican varias cosas. El registro de flags es como sigue: ODITSZAPC O: Overflow D: Direccin I: Interrupciones rehabilitadas T: Trampa S: Signo Z: Cero A: Acarreo auxiliar P: Paridad C: Acarreo : No utilizado Cada cuadro representa un bit como es fcil adivinar. Tambin est claro que cada bit que se utiliza tiene un nombre, y como se ver, tambin una utilidad. Aqu explico el significado de los ms importantes: EL FLAG DE ACARREO Hay veces en la operaciones en las que el nmero se desborda, o sea, no

cabe en el registro o en la posicin de memoria. Imaginemos que tenemos en AX el nmero 0FFFFh y le sumamos 0CCCCh. Como es lgico, el resultado no nos cabr en AX. Al realizar esta suma, tenemos que tener en cuenta que el siguiente nmero a 0FFFFh es 0000h, con lo que podremos ver el resultado. Igual pasar si a 0000h le restamos, por ejemplo, 1 (el resultado ser 0FFFFh). Pero de alguna manera nos tenemos que DAR CUENTA de que esto ha sucedido. Cuando se opera y hay acarreo en el ltimo bit sobre el que se ha operado, el flag de acarreo se pone a uno, es decir, cuando ese nmero se ha desbordado. Hay que recordar tambin que las instrucciones INC y DEC no afectan a este flag. Veamos los efectos de estas operaciones: MOV AX,0FFFFh INC AX ; AX vale ahora 0, el flag de acarreo tambin DEC AX ; AX vale 0FFFFh, y el flag sigue inalterado ADD AX,1 ; AX vale 0, y el flag de acarreo est a 1 MOV BX,0000h ADD BX,50h ; El flag de acarreo se pone a 0, no ha habido ;acarreo en esta operacin SUB AX,1 ; Ahora AX vale otra vez 0FFFFh, y el flag de acarreo ;se pone de nuevo a uno. En resumen, se activa cuando tras una operacin hay un paso del valor mximo al mnimo o viceversa. Este flag nos va a ser tambin til al comprobar errores, etc. Por ejemplo, si buscamos el primer archivo del directorio y no hay ninguno, este flag se activar, con lo que podremos usar los saltos condicionales,

pero esto ya se explicar ms adelante. EL FLAG DE SIGNO A veces interesa conocer cundo un nmero con signo es negativo o positivo. Evidentemente, esto slo tiene efecto cuando estamos tratando con nmeros enteros con signo, en complemento a dos. Indica cuando tras una operacin aritmtica (ADD, SUB, INC, DEC o NEG o lgica (AND, OR o XOR) el resultado es un nmero en complemento a dos. En realidad, es la copia del bit de mayor peso del byte, el que indica cundo el nmero es negativo. Por lo tanto, cuando vale 1 es que el nmero es negativo y si vale 0 es que es positivo. EL FLAG DE DESBORDAMIENTO ("Overflow") Se trata de un flag bastante parecido al de acarreo, pero que acta con nmeros en complemento a dos y se activa cuando se pasa del mayor nmero positivo (127 en un solo byte) al menor negativo (-128 en tamao de un byte). Este flag, al contrario que el de acarreo, SI es afectado por las instrucciones de decremento e incremento. EL FLAG DE CERO Es de los ms sencillos de comprender. Simplemente se activa cuando el resultado de una operacin aritmtica o lgica es cero. Es evidente la gran utilidad del flag. Tenemos, por ejemplo, dos registros, AX y CX, que queremos comparar para saber si son iguales. Para saberlo, no tendramos ms que restar uno del otro, y si el resultado es cero (o sea, si el flag de cero se pone en uno), podremos hacer un salto condicional.

O sea, de un SUB CX,AX Si son iguales, el flag de cero se pondr a uno. EL FLAG DE PARIDAD Se utiliza especialmente en la transmisin de datos para la comprobacin de errores, ya que comprueba si el resultado de la ltima operacin aritmtica o lgica realizada tiene un nmero par o impar de bits puestos a uno. Se pondr a uno cuando haya un nmero par de bits, y a cero cuando sea impar. RESTO DE FLAGS No describir ms flags detalladamente, ya que su importancia es casi nula; por ejemplo est el flag de interrupcin, que, cuando est activado, evita la posibilidad de interrupciones en secciones crticas de cdigo, o el de trampa, que cuando est activado provoca una INT 1h cada vez que se ejecuta otra instruccin, pero creo que su inters es escaso, al menos por el momento.

3.1.2Cadenas.
INSTRUCCIONES DE CADENA Son un subconjunto de instrucciones muy tiles para diversas funciones: inicializar zonas de memoria, copiar datos de una zona a otra, encontrar valores determinados o comparar cadenas, etc., etc. Su comportamiento depende del flag de direccin del que hablbamos unas lecciones ms atrs, y que se puede cambiar directamente con estas dos instrucciones:

STD: SeT Direction flag, lo pone a uno. CLD: CLear Direction flag, lo pone a cero. Las instrucciones que vamos a usar como de cadena siempre tienen una S de String al final, y casi siempre adems una B o una W indicando Byte o Word (el tamao). Y estas son: LODSB/LODSW Lee un byte/palabra en la direccin de memoria dada por DS:SI y la almacena dependiendo de su tamao en AL o AX. Si el flag de direccin est a cero, segn sea byte o palabra, SI aumentar en 1 o 2 unidades (para poder continuar la operacin de lectura). Si est a uno el flag, se decrementar en 1 o 2 unidades dependiendo del tamao (byte/palabra) STOSB/STOSW Es el equivalente a "grabar" si lo anterior era "cargar". Almacenar el contenido de AL o AX (como siempre, dependiendo del tamao ) en ES:DI, copiando segn si es B o W uno o dos bytes cada vez que se ejecute. Si el flag de direccin est a cero, DI aumentar cada vez que se realice la orden en una o dos unidades (dependiendo del tamao, B o W ). Si est a uno, decrecer. MOVSB/MOVSW Mueve el byte o palabra contenido en la direccin de memoria a la que apunta DS:SI a la direccin de memoria de ES:DI. Si el flag de direccin est a 0, con cada MOVS que realicemos SI y DI aumentarn en una unidad (MOVSB) o dos (MOVSW). Si est a uno, se decrementarn de igual manera.

REP Acabo de hablar sobre l. Pues bien, si se utiliza como operando suyo una de estas rdenes, la repetir CX veces. Por ejemplo, si queremos copiar la tabla de vectores de interrupcin a un lugar que hemos reservado: cld ; A asegurarnos de que el flag de direccin est. ;a cero. mov cx,400h xor dx,dx ; pone dx a 0 push dx pop ds ; No est permitido hacer xor ds,ds, por lo que ;metemos dx, que vale 0, en la pila, y sacamos ;DS valiendo 0. xor si,si ; SI que valga 0. push cs pop es ; Vamos a asegurarnos de que ES valga CS, o sea, ;el segmento en el que est el programa ahora. mov di,buffer ; DI apunta al lugar donde vamos a guardar la ;tabla. rep movsb ; Repite esto 400h veces, y cada vez que lo hace ;incrementa DI y SI. int 20h ; Acaba la ejecucin. buffer: db 400h dup (?) ; Esto deja un espacio de 400h bytes que nos ;va a servir para almacenar la tabla de ;vectores de interrupcin.

Podemos, para empezar, reducir el 400h a 200h en CX, y hacer un rep movsw, con lo que trasladaremos de palabra en palabra las instrucciones. INSTRUCCIONES DE MANIPULACIN DE CADENAS.

CMPS/CMPSB/CMPSW (compara cadenas) Sintaxis: CMPS cadena_destino, cadena_origen CMPSB (bytes) CMPSW (palabras)
OF x DF IF TF SF x ZF x AF x PF x CF x

Indicadores:

Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran, pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan segn el valor del indicador DF (vanse CLD y STD) en una o dos unidades, dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos redundantes que slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de segmento, ste sustituir en la cadena origen al DS ordinario. Ejemplo:
lea lea cmpsb si,origen di,destino

LODS/LODSB/LODSW (cargar cadena) Sintaxis: LODS cadena_origen LODSB (bytes) LODSW (palabras)
OF DF IF TF SF ZF AF PF CF -

Indicadores:

Copia en AL o AX una cadena de longitud byte o palabra direccionada sobre el segmento de datos (DS) con el registro SI. Tras la transferencia, SI se incrementa o decrementa segn el indicador DF (vanse CLD y STD) en una o dos unidades, segn se estn manejando bytes o palabras. Cadena_origen es un operando redundante que slo indica el tipo del dato (byte o palabra) a cargar, es ms cmodo colocar LODSB o LODSW para indicar bytes/palabras.
Ejemplo: cld lea si,origen

lodsb

MOVS/MOVSB/MOVSW (mover cadena) Sintaxis: MOVS cadena_destino, cadena_origen MOVSB (bytes) MOVSW (palabras)
OF DF IF TF SF ZF AF PF CF -

Indicadores:

Transfiere un byte o una palabra de la cadena origen direccionada por DS:SI a la cadena destino direccionada por ES:DI, incrementando o decrementando a continuacin los registros SI y DI segn el valor de DF (vanse CLD y STD) en una o dos unidades, dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos redundantes que slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo colocar MOVSB o MOVSW para indicar bytes/palabras. Si se indica un registro de segmento, ste sustituir en la cadena origen al DS ordinario.
Ejemplo: lea lea movsw si,origen di,destino

SCAS/SCASB/SCASW (explorar cadena) Sintaxis: SCAS cadena_destino SCASB (bytes) SCASW (palabras)
OF x DF IF TF SF x ZF x AF x PF x CF x

Indicadores:

Resta de AX o AL una cadena destino direccionada por el registro DI sobre el segmento extra. Ninguno de los valores es alterado pero los indicadores se ven afectados. DI se incrementa o decrementa segn el valor de DF (vanse CLD y STD) en una o dos unidades -segn se est trabajando con bytes o palabras- para apuntar al siguiente elemento de la cadena. Cadena_destino es un operando redundante que slo indica el tipo del dato (byte o palabra), es ms cmodo colocar SCASB o SCASW para indicar bytes/palabras.
Ejemplo: lea mov scasb di,destino al,50

STOS/STOSB/STOSW (almacena cadena) Sintaxis: STOS cadena_destino

STOSB (bytes) STOSW (palabras)


Indicadores: OF DF IF TF SF ZF AF PF CF -

Transfiere el operando origen almacenado en AX o AL, al destino direccionado por el registro DI sobre el segmento extra. Tras la operacin, DI se incrementa o decrementa segn el indicador DF (vanse CLD y STD) para apuntar al siguiente elemento de la cadena. Cadena_destino es un operando redundante que slo indica el tipo del dato (byte o palabra) a cargar, es ms cmodo colocar STOSB o STOSW para indicar bytes/palabras.
Ejemplo: lea mov stosw di,destino ax,1991

REP/REPE/REPZ/REPNE/REPNZ (repetir) REP repetir operacin de cadena REPE/REPZ repetir operacin de cadena si igual/si cero REPNE/REPNZ repetir operacin de cadena si no igual (si no 0) Estas instrucciones se pueden colocar como prefijo de otra instruccin de manejo de cadenas, con objeto de que la misma se repita un nmero determinado de veces incondicionalmente o hasta que se verifique alguna condicin. El nmero de veces se indica en CX. Por sentido comn slo deben utilizarse las siguientes combinaciones:
Prefijo Instrucciones -------------------------REP REPE/REPZ REPNE/REPNZ Funcin ------------------------------Repetir CX veces Repetir CX veces mientras ZF=1 Repetir CX veces mientras ZF=0 MOVS, STOS CMPS, SCAS CMPS, SCAS

Ejemplos: 1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se supone tabla en el segmento ES):
LEA MOV MOV CLD REPNE JE DI,tabla CX,200 AL,69 SCASB encontrado

2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se supone datos en el segmento ES):

LEA MOV MOV CLD REP

DI,datos AX,0 CX,2500 STOSW

3) Copiar la memoria de pantalla de texto (adaptador de color) de un PC en un buffer (se supone buffer en el segmento ES):
MOV MOV LEA MOV MOV CLD REP CX,0B800h DS,CX DI,buffer SI,0 CX,2000 MOVSW ; ; ; ; ; ; ; segmento de pantalla en DS destino en ES:DI copiar desde DS:0 2000 palabras hacia adelante copiar CX palabras

http://meltingpot.fortunecity.com/uruguay/978/libro/04.html

3.1.3Carga.
Las primeras dos instrucciones permiten el intercambio de datos entre la memoria y el registro del procesador. La instruccion LOAD copia un dato de la memoria al registro, mientras que la instruccion STORE lo hace en el sentido inverso. La instruccion LOADI permite cargar un operando inmediato en el registro, es decir, un valor constante que se incluye en la instruccion misma. Por ejemplo, LOADI 5 hace que el valor 5 se copie al registro. Observe la diferencia con LOAD 5, que copia al registro el contenido de la celda cuya direccion es 5.

INSTRUCCIONES DE CARGA DE REGISTROS Y DIRECCIONES.

MOV (transferencia) Sintaxis: MOV dest, origen.


Indicadores: OF DF IF TF SF ZF AF PF CF -

Transfiere datos de longitud byte o palabra del operando origen al operando destino. Pueden ser operando origen y operando destino cualquier registro o posicin de memoria direccionada de las formas ya vistas, con la nica condicin de que origen y destino tengan la misma dimensin. Existen ciertas limitaciones, como que los registros de segmento no admiten el direccionamiento inmediato: es incorrecto MOV DS,4000h; pero no lo es por ejemplo MOV DS,AX o MOV DS,VARIABLE. No es posible, as mismo, utilizar CS como destino (es incorrecto hacer MOV CS,AX aunque pueda admitirlo algn ensamblador). Al hacer MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta despus de ejecutarse la siguiente instruccin (8086/88 de 1983 y procesadores posteriores).

Ejemplos:

mov mov mov

ds,ax bx,es:[si] si,offset dato

En el ltimo ejemplo, no se coloca en SI el valor de la variable dato sino su direccin de memoria o desplazamiento respecto al segmento de datos. En otras palabras, SI es un puntero a dato pero no es dato. En el prximo captulo se ver cmo se declaran las variables.

XCHG (intercambiar) Sintaxis: XCHG destino, origen


Indicadores: OF DF IF TF SF ZF AF PF CF -

Intercambia el contenido de los operandos origen y destino. No pueden utilizarse registros de segmentos como operandos.
Ejemplo: xchg xchg bl,ch mem_pal,bx

XLAT (traduccin) Sintaxis: XLAT tabla


Indicadores: OF DF IF TF SF ZF AF PF CF -

Se utiliza para traducir un byte del registro AL a un byte tomado de la tabla de traduccin. Los datos se toman desde una direccin de la tabla correspondiente a BX + AL, donde bx es un puntero a el comienzo de la tabla y AL es un ndice. Indicar tabla al lado de xlat es slo una redundancia opcional.
Ejemplo: mov mov xlat bx,offset tabla al,4

LEA (carga direccin efectiva) Sintaxis: LEA destino, origen


Indicadores: OF DF IF TF SF ZF AF PF CF -

Transfiere el desplazamiento del operando fuente al operando destino. Otras instrucciones pueden a continuacin utilizar el registro como desplazamiento para acceder a los datos que constituyen el objetivo. El operando destino no puede ser un registro de segmento. En general, esta instruccin es equivalente a MOV

destino,OFFSET fuente y de hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un byte de memoria. Sin embargo, LEA es en algunos casos ms potente que MOV al permitir indicar registros de ndice y desplazamiento para calcular el offset:
lea dx,datos[si]

En el ejemplo de arriba, el valor depositado en DX es el offset de la etiqueta datos ms el registro SI. Esa sola instruccin es equivalente a estas dos:
mov add dx,offset datos dx,si

LDS (carga un puntero utilizando DS) Sintaxis: LDS destino, origen


Indicadores: OF DF IF TF SF ZF AF PF CF -

Traslada un puntero de 32 bits (direccin completa de memoria compuesta por segmento y desplazamiento), al destino indicado y a DS. A partir de la direccin indicada por el operando origen, el procesador toma 4 bytes de la memoria: con los dos primeros forma una palabra que deposita en destino y, con los otros dos, otra en DS.
Ejemplo: punt dd lds 12345678h si,punt

Como resultado de esta instruccin, en DS:SI se hace referencia a la posicin de memoria 1234h:5678h; 'dd' sirve para definir una variable larga de 4 bytes (denominada punt en el ejemplo) y ser explicado en el captulo siguiente.

LES (carga un puntero utilizando ES) Sintaxis: LES destino, origen Esta instruccin es anloga a LDS, pero utilizando ES en lugar de DS.

LAHF (carga AH con los indicadores) Sintaxis: LAHF


Indicadores: OF DF IF TF SF ZF AF PF CF -

Carga los bits 7, 6, 4, 2 y 0 del registro AH con el contenido de los indicadores SF, ZF, AF, PF Y CF respectivamente. El contenido de los dems bits queda sin definir.

SAHF (copia AH en los indicadores) Sintaxis: SAHF


Indicadores: OF DF IF TF SF x ZF x AF x PF x CF x

Transfiere el contenido de los bits 7, 6, 4, 2 y 0 a los indicadores SF, ZF, AF, PF y CF respectivamente.

http://ing.utalca.cl/~fmeza/cursos/cyp/tema3.pdf
1. La instruccin load (cargar) se ha usado principalmente para designar una transferencia de memoria aun registro de programacin, por lo general un acumulador. La instruccin store (almacenar) representa una transferencia de un registro de procesador a la memoria. La instruccin mov (mover) se ha usado en las computadoras con registros mltiples de CPU para designar una transferencia de un registro a otro. Tambin se ha usado para transferencias de datos entre registros de CPU y la memoria o entre dos palabras de memoria. La instruccin exchange (intercambiar) cambia la informacin entre dos registros o un registro y una palabra de memoria. Las instrucciones input (introducir) y output (sacar) transfieren datos entre registros del procesador y terminales de entrada o salida. Las instrucciones push (empujar) y pop (saltar) transfieren datos entres registros del procesador y una pila de memoria. Debe recordarse que las instrucciones que se listan en la tabla 8-5, al igual que en las tablas siguientes en esta seccin, con frecuencia estn asociadas con diversos modos de direccionamiento. Algunas normas del lenguaje ensamblador modifican el smbolo mnemnico para diferenciar entre los diversos modos de direccionamiento. Por ejemplo, el mnemnico para

TABLA 8-5 Instrucciones de transferencia de datos tpica

Nombre Cargar Almacenar

Mnemnico LD ST

Mover Intercambiar Entrada Salida Empujar Saltar

MOV XCH IN OUT PUSH POP

TABLA 8-6 Ocho modos de direccionamiento para la introduccin cargar

Modo

Convencin en ensamblador

Transferencia de registros

Direccionamiento directo

LD ADR

AC = M[M[ADR]]

Direccionamiento indirecto

LD @ ADR

AC = M[M[ADR]]

Direccionamiento relativo

LD $ ADR

AC = M[PC +ADR]

Operando inmediato

LD # NBR

AC = NBR

Direccionamiento indexado

LD ADR (X)

AC = M[ADR+ XR]

Registro

LD R1

AC = R1

Indirecto por registro

LD (R1)

AC = M [R1]

Autoincremento

LD (R1) +

AC = M[R1], R1 = R1 + 1

Cargar de inmediato se convierte en LDI. Otras normas del lenguaje ensamblador utilizan un carcter especial para asignar el modo de direccionamieto. Por ejemplo, el modo inmediato se reconoce por un signo # colocado antes del operando. En cualquier caso, lo importante es entender que cada instruccin puede ocurrir con diversos modos de direccionamiento. Como ejemplo, consideremos la instruccin cargar al acumulador cuando se usa con ocho modos de direccionamiento diferentes. La tabla 8-6 muestra la convencin recomendada del lenguaje ensamblador y la transferencia real que se logra en cada caso. ADR representa una direccin, NBR es un nmero u operando, X es un registro de ndice, Rl es un registro de procesador, y AC es el registro acumulador. El carcter 8 simboliza una direccin indirecta. El carcter $ antes de una direccin hace el direccionamiento relativo al contador de programa PC. El carcter $ precede al operando en una instruccin de modo inmediato. Una instruccin de modo indexado se reconoce por un registro que se coloca entre parntesis despus de la direccin simblica. El modo de registro se simboliza al proporcionar el nombre de un registro de procesador. En el modo indirecto por registro, el nombre del registro que contiene la direccin de memoria se encierra entre parntesis. El modo de autoincremento se distingue del modo indirecto por registro al colocar un signo de ms despus del registro entre parntesis. A su vez el modo de autodecremento utilizara un signo de menos. Para poder escribir programas del lenguaje ensamblador para una computadora es necesario conocer el tipo de instrucciones disponibles y tambin estar familiarizado con .1os modos de direccionamiento utilizados en la computadora particular. http://members.fortunecity.es/roy8/cpu.htm

Unidad 3. Modularizacin
3.3 Macros.
MACROS. Cuando un conjunto de instrucciones en ensamblador aparecen frecuentemente repetidas a lo largo de un listado, es conveniente agruparlas bajo un nombre simblico que las sustituir en aquellos puntos donde aparezcan. Esta es la misin de las macros; por el hecho de soportarlas el ensamblador eleva su categora a la de macroensamblador, al ser las macros una herramienta muy cotizada por los programadores. No conviene confundir las macros con subrutinas: es estas ltimas, el conjunto de

instrucciones aparece una sola vez en todo el programa y luego se invoca con CALL. Sin embargo, cada vez que se referencia a una macro, el cdigo que sta representa se expande en el programa definitivo, duplicndose tantas veces como se use la macro. Por ello, aquellas tareas que puedan ser realizadas con subrutinas siempre ser ms conveniente realizarlas con las mismas, con objeto de economizar memoria. Es cierto que las macros son algo ms rpidas que las subrutinas (se ahorra un CALL y un RET) pero la diferencia es tan mnima que en la prctica es despreciable en el 99,99% de los casos. Por ello, es absurdo e irracional realizar ciertas tareas con macros que pueden ser desarrolladas mucho ms eficientemente con subrutinas: es una pena que en muchos manuales de ensamblador an se hable de macros para realizar operaciones sobre cadenas de caracteres, que generaran programas gigantescos con menos de un 1% de velocidad adicional. 5.4.1. - DEFINICIN Y BORRADO DE LAS MACROS. La macro se define por medio de la directiva MACRO. Es necesario definir la macro antes de utilizarla. Una macro puede llamar a otra. Con frecuencia, las macros se colocan juntas en un fichero independiente y luego se mezclan en el programa principal con la directiva INCLUDE:
IF1 INCLUDE fichero.ext ENDIF

La sentencia IF1 asegura que el ensamblador lea el fichero fuente de las macros slo en la primera pasada, para acelerar el ensamblaje y evitar que aparezcan en el listado (generado en la segunda fase). Conviene hacer hincapi en que la definicin de la macro no consume memoria, por lo que en la prctica es indiferente declarar cientos que ninguna macro:
nombre_simblico MACRO [parmetros] ... ... ENDM

macro

; instrucciones de la

El nombre simblico es el que permitir en adelante hacer referencia a la macro, y se construye casi con las mismas reglas que los nombres de las variables y dems smbolos. La macro puede contener parmetros de manera opcional. A continuacin vienen las instrucciones que engloba y, finalmente, la directiva ENDM seala el final de la macro. No se debe repetir el nombre simblico junto a la directiva ENDM, ello provocara un error un tanto curioso y extrao por parte del ensamblador (algo as como Fin del fichero fuente inesperado, falta directiva END), al menos con MASM 5.0 y TASM 2.0. En realidad, y a diferencia de lo que sucede con los dems smbolos, el nombre de una macro puede coincidir con el de una instruccin mquina o una directiva del ensamblador: a partir de ese momento, la instruccin o directiva machacada pierde su significado original. El ensamblador dar adems un aviso de advertencia si se emplea una instruccin o directiva como nombre de macro, aunque tolerar la operacin. Normalmente se las asignar nombres normales, como a las variables. Sin embargo, si alguna vez se redefiniera una instruccin mquina o directiva, para restaurar el

significado original del smbolo, la macro puede ser borrada -o simplemente porque ya no va a ser usada a partir de cierto punto del listado, y as ya no consumir espacio en las tablas de macros que mantiene en memoria el ensamblador al ensamblar-. No es necesario borrar las macros antes de redefinirlas. Para borrarlas, la sintaxis es la siguiente: PURGE nombre_simblico[,nombre_simblico,...] 5.4.2. - EJEMPLO DE UNA MACRO SENCILLA. Desde el 286 existe una instruccin muy cmoda que introduce en la pila 8 registros, y otra que los saca (PUSHA y POPA). Quien est acostumbrado a emplearlas, puede crear unas macros que simulen estas instrucciones en los 8086:
SUPERPUSH MACRO PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH ENDM AX CX DX BX SP BP SI DI

La creacin de SUPERPOP es anloga, sacando los registros en orden inverso. El orden elegido no es por capricho y se corresponde con el de la instruccin PUSHA original, para compatibilizar. A partir de la definicin de esta macro, tenemos a nuestra disposicin una nueva instruccin mquina (SUPERPUSH) que puede ser usada con libertad dentro de los programas. 5.4.3. - PARMETROS FORMALES Y PARMETROS ACTUALES. Para quien no haya tenido relacin previa con algn lenguaje estructurado de alto nivel, har un breve comentario acerca de lo que son los parmetros formales y actuales en una macro, similar aqu a los procedimientos de los lenguajes de alto nivel. Cuando se llama a una macro se le pueden pasar opcionalmente un cierto nmero de parmetros de cierto tipo. Estos parmetros se denominan parmetros actuales. En la definicin de la macro, dichos parmetros aparecen asociados a ciertos nombres arbitrarios, cuya nica misin es permitir distinguir unos parmetros de otros e indicar en qu orden son entregados: son los parmetros formales. Cuando el ensamblador expanda la macro al ensamblar, los parmetros formales sern sustituidos por sus correspondientes parmetros actuales. Considerar el siguiente ejemplo:
SUMAR MACRO a,b,total PUSH AX MOV AX,a ADD AX,b MOV total,AX POP AX ENDM .... SUMAR positivos, negativos, total

En el ejemplo, a, b y total son los parmetros formales y positivos, negativos y total son los parmetros actuales. Tanto a como b pueden ser variables, etiquetas, etc. en otro punto del programa; sin embargo, dentro de la macro, se comportan de manera independiente. El parmetro formal total ha coincidido en el ejemplo y por casualidad con su correspondiente actual. El cdigo que genera el ensamblador al expandir la macro ser el siguiente:
PUSH MOV ADD MOV POP AX AX,positivos AX,negativos total,AX AX

Las instrucciones PUSH y POP sirven para no alterar el valor de AX y conseguir que la macro se comporte como una caja negra; no es necesario que esto sea as pero es una buena costumbre de programacin para evitar que los programas hagan cosas raras. En general, las macros de este tipo no deberan alterar los registros y, si los cambian, hay que tener muy claro cules. Si se indican ms parmetros de los que una macro necesita, se ignorarn los restantes. En cambio, si faltan, el MASM asumir que son nulos (0) y dar un mensaje de advertencia, el TASM es algo ms rgido y podra dar un error. En general, se trata de situaciones atpicas que deben ser evitadas. Tambin puede darse el caso de que no sea posible expandir la macro. En el ejemplo, no hubiera sido posible ejecutar SUMAR AX,BX,DL porque DL es de 8 bits y la instruccin MOV DL,AX sera ilegal. 5.4.4. - ETIQUETAS DENTRO DE MACROS. VARIABLES LOCALES. Son necesarias normalmente para los saltos condicionales que contengan las macros ms complejas. Si se pone una etiqueta a donde saltar, la macro slo podra ser empleada una vez en todo el programa para evitar que dicha etiqueta aparezca duplicada. La solucin est en emplear la directiva LOCAL que ha de ir colocada justo despus de la directiva MACRO:
MINIMO MACRO LOCAL MOV CMP JB MOV MOV ENDM dato1, dato2, ya_esta AX,dato1 AX,dato2 ya_esta AX,dato2 resultado,AX resultado ; es dato1 el menor? ; s ; no, es dato2

ya_esta:

En el ejemplo, al invocar la macro dos veces el ensamblador no generar la etiqueta ya_esta sino las etiquetas ??0000, ??0001, ... y as sucesivamente. La directiva LOCAL no slo es til para los saltos condicionales en las macros, tambin permite declarar variables internas a los mismos. Se puede indicar un nmero casi indefinido de etiquetas con la directiva LOCAL, separndolas por comas. 5.4.5. - OPERADORES DE MACROS.

* Operador ;; Indica que lo que viene a continuacin es un comentario que no debe aparecer al expansionar la macro. Cuando al ensamblar se genera un listado del programa, las macros suelen aparecer expandidas en los puntos en que se invocan; sin embargo slo aparecern los comentarios normales que comiencen por (;). Los comentarios relacionados con el funcionamiento interno de la macro deberan ir con (;;), los relativos al uso y sintaxis de la misma con (;). Esto es adems conveniente porque durante el ensamblaje son mantenidos en memoria los comentarios de macros (no los del resto del programa) que comienzan por (;), y no conviene desperdiciar memoria... * Operador & Utilizado para concatenar texto o smbolos. Es necesario para lograr que el ensamblador sustituya un parmetro dentro de una cadena de caracteres o como parte de un smbolo:
SALUDO MACRO MOV etiqueta&c: CALL ENDM c AL,"&c" imprimir

Al ejecutar SALUDO A se producir la siguiente expansin:


etiquetaA: MOV CALL AL,"A" imprimir

Si no se hubiera colocado el & se hubiera expandido como MOV AL,"c" Cuando se utilizan estructuras repetitivas REPT, IRP o IRPC (que se vern ms adelante) existe un problema adicional al intentar crear etiquetas, ya que el ensamblador se come un & al hacer la primera sustitucin, generando la misma etiqueta a menos que se duplique el operador &:
MEMORIA x&i MACRO IRP DB ENDM ENDM x i, <1, 2> i

Si se invoca MEMORIA ET se produce el error de "etiqueta ETi repetida", que se puede salvar aadiendo tantos '&' como niveles de anidamiento halla en las estructuras repetitivas empleadas, como se ejemplifica a continuacin:
MEMORIA x&&i MACRO IRP DB ENDM ENDM DB 1 DB 2 x i, <1, 2> i

Lo que con MEMORIA ET generar correctamente las lneas:


ET1 ET2

* Operador ! o <>

Empleado para indicar que el carcter que viene a continuacin debe ser interpretado literalmente y no como un smbolo. Por ello, !; es equivalente a <;>. * Operador % Convierte la expresin que le sigue -generalmente un smbolo- a un nmero; la expresin debe ser una constante (no relocalizable). Slo se emplea en los argumentos de macros. Dada la macro siguiente:
PSUM MACRO %OUT ENDM mensaje, suma * mensaje, suma *

(Evidentemente, el % que precede a OUT forma parte de la directiva y no se trata del % operador que estamos tratando) Supuesta la existencia de estos smbolos:
SIM1 SIM2 PSUM EQU EQU 120 500

Invocando la macro con las siguientes condiciones:


< SIM1 + SIM2 = >, (SIM1+SIM2) %OUT * SIM1 + SIM2 = (SIM1+SIM2) * PSUM < SIM1 + SIM2 = >, %(SIM1+SIM2)

Se produce la siguiente expansin:

Sin embargo, invocando la macro de la siguiente manera (con %): Se produce la expansin deseada:
%OUT * SIM1 + SIM2 = 620 *

5.4.6. - DIRECTIVAS TILES PARA MACROS. Estas directivas pueden ser empleadas tambin sin las macros, aumentando la comodidad de la programacin, aunque abundan especialmente dentro de las macros. * REPT veces ... ENDM (Repeat) Permite repetir cierto nmero de veces una secuencia de instrucciones. El bloque de instrucciones se delimita con ENDM (no confundirlo con el final de una macro). Por ejemplo:
REPT OUT ENDM OUT OUT 2 DX,AL

Esta secuencia se transformar, al ensamblar, en lo siguiente:


DX,AL DX,AL

Empleando smbolos definidos con (=) y apoyndose adems en las macros se puede llegar a crear pseudo-instrucciones muy potentes:
SUCESION MACRO n num = 0 REPT n DB num num = num + 1 ENDM ENDM

; fin de REPT ; fin de macro

La sentencia SUCESION 3 provocar la siguiente expansin:

DB DB DB

0 1 2

* IRP simbolo_control, <arg1, arg2, ..., arg_n> ... ENDM (Indefinite repeat) Es relativamente similar a la instruccin FOR de los lenguajes de alto nivel. Los ngulos (<) y (>) son obligatorios. El smbolo de control va tomando sucesivamente los valores (no necesariamente numricos) arg1, arg2, ... y recorre en cada pasada todo el bloque de instrucciones hasta alcanzar el ENDM (no confundirlo con fin de macro) sustituyendo simbolo_control por esos valores en todos los lugares en que aparece:
IRP DB ENDM DB DB DB i, <1,2,3> 0, i, i*i

Al expansionarse, este conjunto de instrucciones se convierte en lo siguiente:


0, 1, 1 0, 2, 4 0, 3, 9

Nota: Todo lo encerrado entre los ngulos se considera un nico parmetro. Un (;) dentro de los ngulos no se interpreta como el inicio de un comentario sino como un elemento ms. Por otra parte, al emplear macros anidadas, deben indicarse tantos smbolos angulares '<' y '>' consecutivos como niveles de anidamiento existan. Lgicamente, dentro de una macro tambin resulta bastante til la estructura IRP:
TETRAOUT MACRO PUSH PUSH MOV IRP MOV OUT ENDM POP POP ENDM PUSH PUSH MOV MOV OUT MOV OUT MOV OUT MOV OUT POP POP p1, p2, p3, p4, valor AX DX AL,valor cn, <p1, p2, p3, p4> DX, cn DX, AL ; fin de IRP DX AX ; fin de macro AX DX AL, 17 DX, 318h DX, AL DX, 1C9h DX, AL DX, 2D1h DX, AL DX, 1A4h DX,AL DX AX

Al ejecutar TETRAOUT 318h, 1C9h, 2D1h, 1A4h, 17 se obtendr:

Cuando se pasan listas como parmetros hay que encerrarlas entre '<' y '>' al llamar, para no confundirlas con elementos independientes. Por ejemplo, supuesta la macro INCD:

INCD

MACRO IRP INC ENDM DEC ENDM

lista, p i, <lista> i p ; fin de IRP ; fin de macro

Se comprende la necesidad de utilizar los ngulos: INCD AX, BX, CX, DX se expandir:
parmetros) INC DEC AX BX ; CX y DX se ignoran (4

INCD <AX, BX, CX>, DX se expandir:


INC INC INC DEC AX BX CX DX

; (2 parmetros)

* IRPC simbolo_control, <c1c2 ... cn> ... ENDM (Indefinite repeat character) Esta directiva es similar a la anterior, con una salvedad: los elementos situados entre los ngulos (<) y (>) -ahora opcionales, por cierto- son caracteres ASCII y no van separados por comas:
IRPC DB ENDM DB DB DB i, <813> i

El bloque anterior generar al expandirse:


8 1 3

Ejemplo de utilizacin dentro de una macro (en combinacin con el operador &):
INICIALIZA MACRO IRPC DB ENDM ENDM DB DB DB DB a, b, c, d iter, <&a&b&c&d> iter

; fin de IRPC ; fin de macro

Al ejecutar INICIALIZA 7, 1, 4, 0 se produce la siguiente expansin:


7 1 4 0

* EXITM Sirve para abortar la ejecucin de un bloque MACRO, REPT, IRP IRPC. Normalmente se utiliza apoyndose en una directiva condicional (IF...ELSE...ENDIF). Al salir del bloque, se pasa al nivel inmediatamente superior (que puede ser otro bloque de estos). Como ejemplo, la siguiente macro reserva n bytes de memoria a cero hasta un mximo de 100, colocando un byte 255 al final del bloque reservado:
MALLOC MACRO n maximo=100 REPT n IF maximo EQ 0 ; ya van 100? EXITM ; abandonar REPT ENDIF maximo = maximo - 1 DB 0 ; reservar byte

bloque

ENDM DB 255 ENDM

; byte de fin de

5.4.7. - MACROS AVANZADAS CON NUMERO VARIABLE DE PARMETROS. Como se vio al estudiar la directiva IF, existe la posibilidad de chequear condicionalmente la presencia de un parmetro por medio de IFNB, o su ausencia con IFB. Uniendo esto a la potencia de IRP es posible crear macros extraordinariamente verstiles. Como ejemplo, valga la siguiente macro, destinada a introducir en la pila un nmero variable de parmetros (hasta 10): es especialmente til en los programas que gestionan interrupciones:
XPUSH MACRO R1,R2,R3,R4,R5,R6,R7,R8,R9,R10 IRP reg, <R1,R2,R3,R4,R5,R6,R7,R8,R9,R10> IFNB <reg> PUSH reg ENDIF ENDM ; fin de IRP ENDM ; fin de XPUSH XPUSH AX,BX,DS,ES,VAR1 AX AX DS ES VAR1

Por ejemplo, la instruccin: Se expandir en:


PUSH PUSH PUSH PUSH PUSH

El ejemplo anterior es ilustrativo del mecanismo de comprobacin de presencia de parmetros. Sin embargo, este ejemplo puede ser optimizado notablemente empleando una lista como nico parmetro:
XPUSH MACRO lista IRP i, <lista> PUSH i ENDM ENDM MACRO lista IRP i, <lista> POP i ENDM ENDM

XPOP

La ventaja es el nmero indefinido de parmetros soportados (no slo 10). Un ejemplo de uso puede ser el siguiente:
XPUSH XPOP <AX, BX, CX> <CX, BX, AX> AX BX CX CX BX AX

Que al expandirse queda:

PUSH PUSH PUSH POP POP POP

http://meltingpot.fortunecity.com/uruguay/978/libro/05.html#04

MACRO.- Sirve para definir una Macro. Una macro, es un conjunto de instrucciones que se pueden mandar a llamar desde cualquier parte del programa. Para definir una macro, se utiliza la directiva MACRO. El formato de esta directiva es : (nombre_de_macro) MACRO (lista_parmetros) La macro consta de tres partes esenciales: la cabecera, que contiene el nombre de la macro, la directiva MACRO y una lista opcional de parmetros; el cuerpo, que contiene el cdigo de la macro, y el fin, que contiene simplemente la directiva ENDM.
Ejemplo : INIT2 MACRO MOV MOV MOV ENDM AX,DATA DS,AX ES,AX

La mayora de las programas ejecutan conjunto de instrucciones repetitivas. Por ejemplo para desplegar un mensaje es necesario ejecutas la siguiente secuencia de instrucciones:
MOV DX, FOCET MENSAJE MOV AH, 09H INT 21

Si su programa realiza frecuentemente funciones de entrada/salida, las macros ofrecen la facilidad de codificar una sola vez un conjunto de instrucciones y reutilizar el cdigo cuantas veces desee dentro de su programa. Una macro es una pseudo-op que permite el establecimiento de operaciones nicas en ensamblador o la inclusin de frecuentes llamadas de cdigo ensamblador. Una macro tambin se puede definir como un grupo de instrucciones repetitivas en un programa que se codifica slo una vez y puede utilizarse cuantas veces sea necesario. Una macro consta de tres partes esenciales: a) CABECERA: Contiene el nombre de la macro, la pseudo-op MACRO y opcionalmente, variables ficticias que sern pasadas desde la macro. b) CUERPO: Contiene el cdigo real que ser insertado en cualquier programa que llame al nombre de la macro. c) FIN: Debe incluir la sentencia ENDM.

El formato de definicin de una macro es :


NombreMacro MACRO (parmetro1, parmetro2,..., parmetroN) CUERPO DE LA MACRO ENDM

Ejemplo de la definicin de una macro.


INICIO MACRO MOV AX, DATA MOV DS, AX MOV ES, AX ENDM ;DEFINE MACRO ;CUERPO DE ;LA DEFINICIN ;DE LA MACRO ;FIN DE LA MACRO

El nombre de esta macro es INICIO, aunque es aceptable cualquier otro nombre vlido que sea nico. La directiva MACRO en la primer lnea indica al ensamblador que las instrucciones que siguen, hasta ENDM (fin de la macro), son parte de la definicin de la macro. La directiva ENDM termina la definicin de la macro. Las instrucciones entre MACRO y ENDM comprenden el cuerpo de la definicin de la macro. Los nombres a que se hace referencia en la definicin de la macro, @datos, AX, DS y ES, deben estar definidos en alguna parte del programa o deben ser dados a conocer de alguna otra forma al ensamblador. .En forma subsecuente se puede usar la macroinstruccin INIICIO en el segmento de cdigo en donde quiera inicializar los registros. Cuando el ensamblador encuentra la macroinstruccin INICIO, el ensamblador copia el cuerpo de la macro en la posicin del programa dnde se encuentra la llamada a la macro.

PARMETROS
Un parmetro es una variable que puede tomar un valor diferente cada vez que se ejecute una subrutina en la que se utiliza tal variable. Los parmetros son reemplazados por los nombres o valores que especifique la instruccin que la invoc. La lista de parmetros es opcional y, si existe, cada parmetro deber estar separado por una coma. Ejemplo: Despliega MACRO Mensaje Toda macro tiene une definicin inicial que consta del nombre asignado a ella, el seudocdigo de operacin MACRO y la lista de parmetros. En la definicin anterior el nombre de la macro es despliega y su parmetro es mensaje (el mensaje que se desplegar cada vez que sea invocada la macro).

Despliega MACRO Mensaje MOV DX, OFFSE Mensaje MOV AH, 09 INT 21H ENDM

Para hacer una macro flexible, podemos definir nombres en ella como argumentos mudos (ficticios). La definicin de la macro siguiente llamada PROMPT, proporciona el uso de la funcin 09H del DOS para desplegar cualquier mensaje, cuando se usa la macro instruccin, el programador tiene que proporcionar el nombre del mensaje, el cual hace referencia a un rea de datos determinada por un signo de dlar.
PROMPT MACRO MENSAJE ;ARGUMENTO MUDO MOV AH,09H LEA DX;MESSGE INT 21H ENDM ;FIN DE LA MACRO

Un argumento mudo (ficticio) indica al ensamblador que haga coincidir su nombre con cualquier aparicin del mismo nombre en el cuerpo de la macro. Por ejemplo el argumento mudo MENSAGE tambin aparece en la instruccin LEA. Cuando utiliza la macro instruccin PROMPT, usted proporciona un parmetro como el nombre real del mensaje que ser desplegado, por ejemplo:
PROMPT MESSAGE2

En este caso MESSAGE2 tiene que estar apropiadamente definido en el segmento de datos. El parmetro en la macroinstruccin corresponde al argumento mudo en la definicin original de la macro:
DEFINICIN DE MACRO: PROMPT MACRO MESSAGE (argumento) MACROINSTRUCCIN: PROMPT MESSAGE2 (parmetro)

El ensamblador sustituye los parmetros de la macroinstruccin por los argumentos mudos en la definicin de la macro, entrada por entrada, de izquierda a derecha. Ejemplo de parmetros de macros.
TITLE P22MACR2 (EXE) USO DE PARMETROS. INITZ MACRO ;DEFINE MACRO MOV AX, DATA MOV DS,AX MOV ES,AX ENDM ;TERMINA MACRO PROMPT MACRO MESSGE ;DEFINE MACRO MOV AH, 09H LEA DS, MESSGE INT 21H ENDM ;TERMINA MACRO .MODEL SMALL .STACK 64 .DATA MESSGE1 DB CUSTOMER NAME?, $ MESSG2 DB CUSTOMER ADDRES, $ .CODE BEGIN PROC FAR INITZ MOV AX, DATA MOV DS, AX MOV ES, AX PROMPT MESSG2

MOV AH, 09H LEA DX, MESSG2 INT 21H MOV AX, 4C00H ;SALE AL DOS INT 21H BEGIN ENDP END BEGIN

ETIQUETAS
Una etiqueta es el primer campo de la izquierda de una lnea. Este campo es opcional, consiste en un conjunto de caracteres y sirve para identificar dicha lnea. Cuando en una lnea de instruccin se encuentra una etiqueta el ordenador guardar dicha etiqueta junto con la direccin que le ha correspondido a la instruccin para posteriormente ser relacionada con una instruccin de salto a esa direccin. Con el uso de etiquetas el programador se despreocupa de las posiciones de memoria que van a ocupar las instrucciones y coloca etiquetas a las instrucciones a las que haga referencia en otros puntos del programa. A continuacin se mencionan algunas ventajas que ofrece el empleo de etiquetas: a) Permite localizar y recordar fcilmente una determinada instruccin. b) Se puede modificar de forma sencilla, en la fase de correccin de un programa, el punto donde tienen que realizarse uno o ms saltos cambiando la etiqueta de una instruccin a otra. c) En caso de que el programa objeto de debe colocar en posiciones de memoria diferentes de las que en un principio se haba previsto. No hay que hacer ningn cambio en el programa fuente si se han utilizado etiquetas, pues al hacer la nueva traduccin asigna automticamente las nuevas posiciones a las etiquetas. Esto facilita la unin de varios programas que han sido desarrollados por separado. Ejemplo de una etiqueta:
Despliega MACRO Mensaje, Veces MOV CX, Veces OTRA: MOV DX, OFFSET Mensaje MOV AH,9 INT 21H LOOP OTRA ENDM

La macro anterior despliega el mensaje las veces especificadas. Sin

embargo, qu sucede si invoca usted la macro ms de una vez?. El TASM genera un error de etiqueta redefinida porque no se puede definir una etiqueta con el mismo nombre ms de una vez (la etiqueta de la macro anterior es OTRA). Las normas para definicin de etiquetas nos dicen que stas deben tener nombres nicos; lo anterior se debe a que si el TASM permitiese la duplicacin de etiquetas, el programa se vera en un predicamento porque no podra decidir a cul de las etiquetas debe hacerle caso. Ejemplo:
...CDIGO . . Despliega MACRO Mensaje, veces MOV CX, Veces OTRA: MOV DX,OFFSET Mensaje MOV AH,09 INT 21H LOOP OTRA ENDM ...MAS CDIGO . . . MOV CX,10 OTRA: LOOP OTRA ...RESTO DEL CDIGO ...END PROGRAMA

Cuando el programa ejecuta la primera macro todo est bien, pero cuando intenta ejecutar el cdigo que contiene de nuevo el mismo nombre de etiqueta se queda perplejo porque no puede decidir si la interaccin se aplica a su etiqueta OTRA o a la etiqueta OTRA de la macro procesadora. Afortunadamente existe una solucin al problema que consiste en usar un seudocdigo de operacin llamado LOCAL, el cual enumera todas las etiquetas utilizadas dentro de una macro. Cada vez que la macro sea expandida, el TASM crea un smbolo nico para cada etiqueta enumerada en la lista de LOCAL. El formato de LOCAL es:
LOCAL lista de etiquetas

Donde lista de etiquetas es la lista de los nombres de etiqueta que se usarn dentro de la macro. LOCAL debe ser la primera instruccin que aparezca tras la definicin de la macro, ya que no pueden haber comentarios entre la definicin y la especificacin de LOCAL. Teniendo presente lo anterior redefinamos la macro anterior.
Despliega MACRO Mensaje, Veces LOCAL OTRA MOV CX, VECES OTRA: MOV DX, OFFSET Mensaje MOV AH,9 INT 21H

LOOP OTRA ENDM

ENSAMBLE DE MACROS
Al ensamblarse una macro de un programa en lenguaje ensamblador, lo que hace l turbo asembler (Tasm) de Borland turbo pascal es: buscar el cdigo de la macro, copiarlo y pegarlo en cada una de las macros existentes del programa. Cuando se crea un programa no es necesario escribir los comentarios que van despus de las comillas, sin embargo es una tcnica recomendable para que en caso de errores o mejoras al cdigo sea ms sencillo encontrar la parte deseada. Para ensamblar este programa primero se guarda el formato ASCII con un nombre vlido, por ejemplo: program1.asm Para ensamblarlo se utiliza el TASM, el comando de ensamble es: TASM Program1; para enlazarlo y hacerlo ejecutable tecleamos: LINK program1; Una vez terminados estos pasos es posible ejecutarlo tecleando: program1 [Enter] Para utilizar el programa directamente en su computadora guarde este archivo como ASCII o texto, llvelo a su PC, con algn editor elimine todos estos comentarios y los comentarios del principio y ensmblelo.
PROGRAMA: ; INICIO DEL PR0GRAMA, DEFINIMOS EL MODELO DE MEMORIA A USAR Y EL SEGMENTO ; DE CDIGO .MODEL SMALL ;MODELO DE MEMORIA .CODE ;REA DE CDIGO INICIO: ;ETIQUETA DE INICIO DEL PROGRAMA MOVE AX,DATA ;INICIALIZA EL REGISTRO DS CON LA DIRECCIN DADA MOV DS,AX ;POR DATA (SEGMENTO DE DATOS) MOV DX, OFFSET Titulo ;OBTIENE LA DIRECCIN DE LA CADENA DE CADENA DE CARACTERES MOV AH,09 ;USAMOS LA FUNCIN 09H DE LA INTERRUPCIN 21H INT 21H ;PARA DESPLEGAR LA CADENA CUYA DIRECCIN OBTUVIMOS MOV CX,16 ;CONTADOR DE CARACTERES QUE SE MOSTRAR MOV BX,OFFSET Cadena ;PERMITE ACCESO A LA CADENA DONDE SE ENCUENTRAN LOS VALORES A DESPLEGAR CICLO: ;ETIQUETA PARA GENERAR UN CICLO MOV AL,CL ;COLOCA EN AL EL NMERO A TRADUCIR Y LO TRADUCE XLAT ;USANDO LA INSTRUCCIN XLAT MOV DL,AL ;COLOCA EN DL EL VALOR A SER DESPLEGADO POR MEDIO DE LA MOV AH, 02 ;FUNCIN 2 DE LA INTERRUPCIN 21H INT 21H ;DESPLIEGA EL CARACTER MOV DL,10 ;SALTA UNA LNEA DESPLEGANDO EL CARCTER 10

INT 21H ;DESPLIEGA EL CARACTER MOV DL,13 ;PRODUCE UN RETORNO DE CARRO DESPLEGANDO EL CARACTER 13 INT 21H ;DESPLIEGA EL RETORNO DE CARRO LOOP CICLO ;DECREMENTA EN 1 A CX Y BRINCA LA ETIQUETA CICLO ;SIEMPRE Y CUANDO CX NO SEA IGUAL A CERO MOV AH, 4C ; UTILIZA LA FUNCIN 4C DE LA INTERRUPCIN 21H PARA INT 21H ;FINALIZAR EL PROGRAMA

VENTAJAS DE LAS MACROS


1: Las macros son rpidas porque se ejecutan en lnea en un programa. 2: Las macros pueden pasar y recibir parmetros que afecten solo la operacin de las mismas. 3: Las macros pueden ser guardadas en una biblioteca en cdigo fuente, que puede ser fcilmente editada. 4: La cabecera de programacin puede utilizar macros simple; para una biblioteca de macros utilizar IF1...ENDIF.

DESVENTAJAS DE LAS MACROS


1: Las macros hacen ms grande el cdigo fuente, ya que son expandidas cada vez que son llamadas. Definicin Una de las principales desventajas de la programacin en lenguaje ensamblador es la repeticin constante de ciertos grupos de instrucciones. Por ejemplo el siguiente conjunto de instrucciones nos permite imprimir una variable de tipo cadena en la pantalla: Lea DX,Cadena ;Direccionar la cadena Mov AH,09h ;Usar la funcin 09h para imprimir cadenas Int 21h ;llamada a la interrupcin 21h del DOS Si necesitamos que en nuestro programa se muestren mensajes constantemente, es obvio que debemos duplicar este conjunto de instrucciones por cada mensaje que se desea enviar a pantalla. El principal problema que esto nos ocasiona es que el tamao de nuestro programa crece considerablemente, y mientras ms grande sea el programa, ms difcil ser encontrar la causa de algn error cuando ste ocurra. La mejor solucin en estos casos es el uso de las MACROS. Una macro es un conjunto de instrucciones que se agrupan bajo un nombre descriptivo (macroinstruccin) y que slo es necesario declarar una vez (macrodefinicin). Una vez que la macro ha sido declarada, slo es necesario indicar su nombre en el cuerpo del programa y el ensamblador se encargara de reemplazar la

macroinstruccin por las instrucciones de la macro (expansin de la macro). El formato general de una macro es el siguiente: .MACRO Nombre [(parametro1, parametro2, etc)] INSTRUCCIONES ENDM Nuevamente, lo que se encuentra entre parntesis cuadrados es opcional. De acuerdo con esto, la macro para imprimir cadenas quedara de la siguiente forma: .MACRO Imprime_Cad(Cadena) Lea DX,Cadena Mov Ah,09h Int 21h ENDM Parmetros y etiquetas Dentro de las propiedades ms importantes de las macros se deben destacar la posibilidad de utilizar parmetros y etiquetas. Los parmetros permiten que una misma macro pueda ser usada bajo diferentes condiciones, por ejemplo, se puede crear una macro para posicionar el cursor en diferentes coordenadas de la pantalla e indicar sus coordenadas por medio de parmetros. La siguiente macro nos muestra esta propiedad: ;Esta macro posiciona el cursor en las coordenadas que se le indican como ;parmetros. Es el equivalente al GotoXY de Pascal. .MACRO gotoxy (x,y) xor bh,bh ;Seleccionar pgina cero de video mov dl,x ;Columna mov dh,y ;Rengln mov ah,02h ;Funcin 02h para posicionar cursor int 10h ;llamada a la int 10h del BIOS ENDM Tambin existen situaciones en las que los parmetros no son necesarios, es por esta razn que los parmetros son opcionales en la declaracin de la macro. ;Esta macro realiza una pausa en el programa hasta que una tecla es ;presionada. Es el equivalente del readkey en Pascal. .MACRO tecla mov ah,10h int 16h ENDM Por otro lado, las etiquetas tambin son tiles dentro de las macros. Suponga que se desea crear una macro que imprima una cadena un numero n de veces, esta macro podra ser declarada de la siguiente forma: .MACRO Imprime_nCad (Cadena, Cuantos) Mov CX,Cuantos ;Iniciar Contador Lea DX,Cadena ;Direccionar la cadena que se va a imprimir Mov Ah,09h ;Usar la funcin 09h Otra: ;Etiqueta interna Int 21h ;Imprimir la Cadena n veces

Loop Otra ;Siguiente Impresin 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 programa. Cada vez que el ensamblador encuentra una macroinstruccin, verifica si sta fue declarada; si esta verificacin es exitosa, el ensamblador toma las instrucciones del cuerpo de la macro y las reemplaza en el lugar donde la macro fue llamada. El siguiente programa muestra la declaracin y uso de las macros: .COMMENT Programa: Macros1.ASM Autor: Juan Carlos Guzmn C. Descripcin: Este programa muestra el uso de macros. .MODEL TINY ; Declaracin de variables .DATA cad db 'Ejemplo del uso de macros...',13,10,'$' cad1 db 'Presiona una tecla...','$' cad2 db 'Ejemplo del uso de la macro gotoxy...','$' ;Aqu se declaran las macros. ;************************************************************************ ;-----------------------------------------------------------------------;Esta macro imprime una cadena pasada como parmetro. ;Utiliza la funcin 09h de la Int 21h del DOS. .MACRO imprime_cad(cadena) lea dx,cadena mov ah,09h int 21h ENDM ;-----------------------------------------------------------------------;Esta macro realiza una pausa en el programa hasta que una tecla se ;presione. Es el equivalente 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 ;parmetros. Es el equivalente al GotoXY de Pascal. .MACRO gotoxy (x,y) xor bh,bh mov dl,x mov dh,y mov ah,02h int 10h ENDM ;------------------------------------------------------------;Esta macro limpia la pantalla.

;Utiliza la funcin 06h de la Int 10h del Bios. .MACRO limpiar_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: ;Declaracin del punto de entrada limpiar_pantalla ;Llamada a la macro gotoxy (0,0) ;Colocar el cursor en 0,0 imprime_cad(cad) ;Imprime el primer mensaje imprime_cad(cad1) ;Imprime el segundo mensaje tecla ;Espera a que se presione una tecla gotoxy (30,12) ;Colocar el cursor en 30,12 imprime_cad(cad2) ;Imprimir el tercer mensaje gotoxy (50,24) ;Colocar el cursor en 50,24 imprime_cad(cad1) ;Imprimir el segundo mensaje tecla ;Esperar por una tecla mov ax,4c00h ;Fin del programa y regresar al DOS. int 21h END inicio END Ventajas y desventajas Si bien es cierto que las macros proporcionan mayor flexibilidad a la hora de programar, tambin es cierto que tienen algunas desventajas. La siguiente es una lista de la principales ventajas y desventajas del uso de las macros. Ventajas:
Menor posibilidad de cometer errores por repeticin. Mayor flexibilidad en la programacin al permitir el uso de parmetros. Cdigo fuente ms compacto. Al ser ms pequeo el cdigo fuente, tambin es ms fcil de leer por otros.

Desventajas:
El cdigo ejecutable se vuelve ms grande con cada llamada a la macro. Las macros deben ser bien planeadas para evitar la redundancia de cdigo.

http://www.monografias.com/trabajos11/lenen/lenen2.s html

Conceptos bsicos
Definicin y operacin Una macro es un smbolo que representa un bloque de texto. El ensamblador usa las macros de tal manera que cada vez que encuentra al smbolo que define la macro, lo sustituye por el texto que representa. Cmo crear macros

Sintaxis:
<Nombre> MACRO [parametros] ... ENDM

Ejemplo:
DuplicaAL MACRO SHL AL, 1 ENDM

Cdigo que la usa:


MOV AL, 2 DuplicaAL ; Esta es la "llamada" al macro

El ensamblador sustituye cada vez que aparezca la macro No es como los procedimientos, que se "llaman" pero no repiten el cdigo Ejemplo:
MOV AL, 2 DuplicaAL ; CALL Duplica DuplicaAL ; CALL Duplica

Este cdigo queda


MOV AL, 2 SHL AL, 1 ; CALL Duplica SHL AL, 1 ; CALL Duplica

Cando usarlas y cando no

Cuando se quiere el cdigo ms rpido y no importa ser repetitivo (cdigo grande) Cuando se van a generar diversas variantes de cdigo similar No cuando se quiere cdigo compacto, evitando repetir el mismo (en este caso, usar procedimientos)

Asignacin de variables y constantes para el ensamblador


Pseudoinstrucciones, pues solamente se usan durante el proceso de traduccin

Sintaxis:
<Simbolo> EQU Valor <Simbolo> = Valor Permiten definir constantes y variables del ensamblador La diferencia es que = puede usarse varias veces sobre el mismo smbolo (como una variable)

REPT
Directiva para definir bloques repetitivos Permite repetir un cdigo determinado, tantas veces como se desee

Sintaxis:
REPT <n> ... ENDM

Ejemplo:
Valor = 0 ; Variable de ensamblador REPT 10 DW Valor Valor = Valor + 1 ENDM

Uso de parmetros en macros


Los macros pueden ser adaptativos; por ejemplo:

Potencia2 MACRO Registro, Valor REPT Valor SHL Registro, 1 ENDM ENDM

Uso:
Potencia2 CX, 4

Se convierte en:
SHL CX, 1 SHL CX, 1 SHL CX, 1 SHL CX, 1

http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase18.htm

Para cada instruccin simblica que usted codifica, el ensamblador genera una instruccin de lenguaje de maquina. El ensamblador tiene facilidades que el programador puede utilizar para definir macros. Primero hay que definir un nombre especifico para la macro, junto con el conjunto de instrucciones en lenguaje ensamblador que la macro va a generar. Despus, siempre que necesite codificar el conjunto de instrucciones, solo hay que codificar el nombre de la macro y el ensamblador genera de forma automtica las instrucciones que han sido definidas en la macro. Las macros son tiles para los siguientes propsitos:

Simplificar y reducir la cantidad de codificacin repetitiva. Reducir errores causados por la codificacin repetitiva. Linealizar un programa en lenguaje ensamblador para hacerlo mas legible.

Una definicin de macro aparece antes de que cualquier definicin de segmento. Examinemos una definicin de una macro sencilla que inicializa los registros de segmento para un programa.EXE:

INICIAREGS

MACRO MOV AX, @data MOV DS, AX MOV ES, AX ENDM

;Define macro ; } Cuerpo de ; } la definicin ; } de la macro ; Fin de la macro

El nombre de esta macro es INICIAREGS, aunque es aceptable cualquier otro nombre valido que sea nico. La directiva MACRO en la primer lnea indica al ensamblador que las instrucciones que siguen, hasta ENDM ("fin de la macro"), son parte de la definicin de la macro. La directiva ENDM termina la definicin de la macro. Los nombres a que se hace referencia en la definicin de la macro, @data, AX, DS y ES, deben estar definidos en alguna parte del programa o deben ser dados a conocer de alguna otra forma al ensamblador. En forma subsecuente se puede usar la macro-instruccion INICIAREGS en el segmento de cdigo en donde quiera inicializar los registros. Cuando el ensamblador encuentra la macra-instruccion INICIAREGS, busca en una tabla de instrucciones simblicas y, a falta de una entrada, busca macroinstrucciones. Ya que el programa contiene una definicin de la macro INICIAREGS, el ensamblador sustituye el cuerpo de la definicin generando instrucciones: la expansin de la macro. Un programa usara la macroinstruccion INICIAREGS solo una vez, aunque otras macros estn diseadas para ser utilizadas cualquier numero de veces y cada vez el ensamblador genera la misma expansin.

MANEJO DE PARAMETROS.
Para hacer una macro flexible, puede definir nombres en ella como argumentos mudos (ficticios).La definicin de la macro siguiente, llamada DESPLEGAR_MSG, proporciona el uso de la funcin 09H del DOS para desplegar cualquier mensaje. Cuando se usa la macroinstruccin el programador tiene que proporcionar el nombre del mensaje, el cual hace referencia a un rea de datos terminada por un signo de dlar.

DESPLEGAR_MSG

MACRO MENSAJE MOV AH, 09H LEA DX, MENSAJE INT 21H ENDM

; Argumento mudo

; Fin de la macro

Un argumento mudo en una definicin de macro indica al ensamblador que haga coincidir su nombre con cualquier aparicin del mismo nombre en el cuerpo de la macro. Por ejemplo, el argumento mudo MENSAJE tambin aparece en la instruccin LEA. Cuando utiliza la macroinstruccin DESPLEGAR_MSG, usted proporciona un parmetro como el nombre real del mensaje que ser desplegado, por ejemplo: DESPLEGAR_MSG MENSAJE2 En este caso, MENSAJE2 tiene que estar apropiadamente definido en el segmento de dato. El parmetro en la microinstruccin corresponde al argumento mudo en la definicin original de la macro: Definicin de macro: DESPLEGAR_MSG MACRO MENSAJE (Argumento) Macroinstruccin: DESPLEGAR_MSG MENSAJE2 (Parametro) El ensamblador ya ha hecho corresponder el argumento en la definicin original de la macro con la instruccin LEA en el cuerpo de la macro. Ahora sustituye el (los) parmetro(s) de la macroinstruccin MENSAJE2 por la presencia de MENSAJE en la instruccin LEA y la sustituye por cualquier otra aparicin de MENSAJE. Un argumento mudo puede contener cualquier nombre valido, incluyendo un nombre de registro tal como CX. Puede definir una macro con cualquier numero de argumentos mudos, separados por coma, hasta la columna 120 de una lnea. El ensamblador sustituye los parmetros de la macro instruccin por los argumentos mudos en la definicin de la macro, entrada por entrada, de izquierda a derecha.

MANEJO DE ETIQUETAS LOCALES.

Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de la definicin de la macro. Si utiliza la macro mas de una vez en el mismo programa y el ensamblador define los elementos de datos para cada aparicin, los nombres duplicados haran que el ensamblador genere un mensaje de error. Para asegurar que cada nombre generado es nico, hay que codificar la directiva LOCAL inmediatamente despus de la instruccin MACRO. Su formato general es: LOCAL Etiqueta1, Etiqueta2...Etiquetan.

BIBLIOTECAS DE MACROS.
Definir una macro y usarla solo una vez en un programa no es muy productivo. El enfoque habitual es catalogar las macros en una biblioteca en disco bajo un nombre descriptivo, como MACRO.LIB. Usted solo tiene que reunir todas las definiciones de sus macros en un archivo y almacenar el archivo en disco: Macro1 MACRO .... ENDM Macro2 MACRO .... ENDM Para usar cualquiera de las macros catalogadas, en lugar de codificar las definiciones MACRO al inicio del programa utilice la directiva INCLUDE as: INCLUDE C: MACRO.LIB Macro1 Macro2 El ensamblador accesa el archivo llamado MACRO en la unidad C e incluye ambas definiciones de macro, Macro1 y Macro2, en el

programa. El listado ensamblado contendr una copia de las definiciones de las macros. La Directiva PURGE. La ejecucin de una instruccin INCLUDE hace que el ensamblador incluya todas las definiciones de macros que estn especificadas en la biblioteca. Sin embargo, suponga que una biblioteca contiene las macros SUMA, RESTA, DIVIDE, pero que el programa solo necesita SUMA. La directiva PURGE permite que usted "elimine" la macros RESTA y DIVIDE que no necesita del ensamblado actual: IF1 INCLUDE C:\MACRO.LIB ENDIF PURGE RESTA, DIVIDE necesarias

;Incluye la biblioteca completa ;Elimina la macros no

Una operacin PURGE facilita solo el ensamblado de un programa y no tiene efecto sobre las macros almacenadas en la biblioteca.

3.3.1Internas. 3.3.2Externas. 3.4 Procedimientos.


Definicin 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 cdigo 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 codificacin ms limpia y compacta, es decir el cdigo fuente es ms pequeo; tambin permiten el ahorro de memoria, esto es porque un mismo procedimiento puede ser llamado varias veces en el mismo programa y slo requiere memoria una vez. Los procedimientos tienen la desventaja de que reducen la velocidad de ejecucin de los programas, esto se debe a la forma en que los procedimientos se ejecutan. A continuacin se presentan los pasos necesarios para ejecutar un procedimiento: 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 instruccin 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 instruccin instruccin .... RET ENDP NOMBRE En donde PROC es una palabra reservada que indica el inicio de un procedimiento, RET es una instruccin que indica la terminacin del conjunto de instrucciones de un procedimiento y finalmente ENDP es la palabra reservada para fin de procedimiento. Paso de parmetros Los procedimientos en lenguaje ensamblador no cuentan con un mecanismo para el paso de parmetros; por lo cual, la nica forma de lograr esto es colocando los parmetros que nos interesan en los registros de propsito general antes de que el procedimiento sea ejecutado. El siguiente procedimiento 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 ejemplo, las coordenadas XY se deben situar en el registro DX antes de que se llame al procedimiento. Llamada a procedimientos Los procedimientos son llamados por los programas por medio de la instruccin CALL, seguida del nombre del procedimiento. Ejemplo: Call GotoXY El siguiente programa muestra la forma de pasarle parmetros a los procedimientos por medio de los registros generales. Este programa declara tres procedimientos: GotoXY: Coloca el cursor en las coordenadas especificadas Limpia_Pantalla: Limpia la pantalla Imprime_Cad: Imprime una cadena en la posicin actual del cursor .COMMENT * Programa: Proc2.ASM Autor: Juan Carlos Guzmn C. Descripcin: Este programa ilustra la forma de utilizar procedimientos en los programas por medio de la instruccin Call y la forma de pasarles parmetros.

.MODEL TINY .DATA Cad1 db 'Esta es una cadena de prueba...',13,10,'$' .CODE INICIO: ;Punto de entrada al programa Mov DL,20 ;X=20 Mov DH,10 ;Y=10 Call Gotoxy ;GotoXY 20,10 Lea DX,cad1 ;DX->Cad1 Call Imprime_Cad ;Imprimir Cad1 Mov Ax,04C00h ;Terminar y regresar al dos Int 21h ; END INICIO ;********************************************************************* ;Procedimiento: GotoXY ;Descripcin: Coloca el cursor una posicin especifica de la pantalla ;Parmetros: Dl=X, Dh=Y ;********************************************************************* PROC GotoXY Xor Bh,Bh Mov Ah,02h Int 10h Ret ENDP GotoXY ;*********************************************************************** ;Procedimiento: Limpia_Pantalla ;Descripcin: Imprime una cadena de caracteres en la posicin del cursor ;Parmetros: La direccin de la cadena en DX ;*********************************************************************** PROC Imprime_Cad Mov Ah,09h Int 21h Ret ENDP Imprime_Cad END

http://www.monografias.com/trabajos11/lenen/lenen2.s html
El segmento de cdigo contiene el cdigo ejecutable de un programa. Tambin tiene uno o mas procedimientos, definidos con la directiva PROC. Un segmento que tiene solo un procedimiento puede aparecer como sigue:
NOMBRE nomsegmento nomproc OPERACION SEGMENT PROC OPERANDO PARA FAR COMENTARIO ;Un

nomproc nomsegmento

. . . ENDP ENDS

;procedimiento ;dentro ;del segmento ;de cdigo

El nombre del procedimiento debe estar presente, ser nico y seguir las reglas para la formacin de nombres del lenguaje. El operando far en este caso esta relacionado con la ejecucin del programa. Cuando usted solicita la ejecucin de un programa, el cargador de programas del DOS utiliza este nombre de procedimiento como el punto de entrada para la primera instruccin a ejecutar. La directiva ENDP indica el fin de un procedimiento y contiene el mismo nombre que el enunciado PROC para permitir que el ensamblador relacione a los dos. Ya que los procedimientos deben estar por completo dentro de un segmento, ENDP define el final de un procedimiento antes que ENDS defina el final de un segmento.

LLAMADA DE PROCEDIMIENTOS.
Hasta ahora los segmentos de cdigo han consistido solo en un procedimiento, codificado como: BEGIN PROC FAR . . . BEGIN ENDP En este caso el operador FAR informa al sistema que la direccin indicada es el punto de entrada para la ejecucin del programa, mientras que la directiva ENDP define el final del procedimiento. Sin embargo, un segmento de cdigo puede tener cualquier numero de procedimientos, todos distinguidos por PROC y ENDP. Un procedimiento llamado (o subrutina) es una seccin de cdigo que realiza una tarea definida y clara (tal como ubicar el cursor o bien obtener entrada del teclado). La organizacin de un programa en procedimientos proporciona los beneficios siguientes:

1. Reduce la cantidad de cdigo, ya que un procedimiento comn puede ser llamado desde cualquier lugar en el segmento de cdigo. 2. Fortalece la mejor organizacin del programa. 3. Facilita la depuracin del programa, ya que los errores pueden ser aislados con mayor claridad. 4. Ayuda en el mantenimiento progresivo de programas, ya que los procedimientos son identificados de forma rpida para su modificacin. Operaciones CALL y RET La instruccin CALL transfiere el control a un procedimiento llamado, y la instruccin RET regresa del procedimiento llamado al procedimiento original que hizo la llamada. RET debe ser la ultima instruccin en un procedimiento llamado. Los formatos generales para CALL y RET son:

El cdigo objeto particular que CALL y RET generan depende de si la operacin implica un procedimiento NEAR (cercano) o un procedimiento FAR (lejano). Llamada y regreso cercanos. Una llamada (CALL) a un procedimiento dentro del mismo segmento es cercana y realiza lo siguiente:

Disminuye el SP en 2 (una palabra) Mete el IP (que contiene el desplazamiento de la instruccin que sigue al CALL) en la pila. Inserta la direccin del desplazamiento del procedimiento llamado en el IP (esta operacin vaca el resultado de la instruccin previamente procesada),

Un RET que regresa desde un procedimiento cercano realiza lo siguiente:

Saca el antiguo valor de IP de la pila y lo enva al IP (lo cual tambin vaca el resultado de la instruccin previamente procesada). Incrementa el SP en 2.

Ahora el CS:IP apunta a la instruccin que sigue al CALL original en la llamada del procedimiento, en donde se reasume la ejecucin. Llamada y regreso lejanos. Una llamada (CALL) lejana llama a un procedimiento etiquetado con FAR, tal vez en un segmento de cdigo separado. Un CALL lejano mete a la pila al CS y al IP, y RET los saca de la pila. page 60,132 TITLE P08CALLP (EXE) Llamada a procedimientos .MODEL SMALL .STACK 64 .DATA ;--------------------------------------------------------------------.CODE BEGIN PROC FAR CALL B10 ;Llama a B10 ; ... MOV AX,4C00H ;Salida a DOS INT 21H BEGIN ENDP ;--------------------------------------------------------------------B10 PROC NEAR CALL C10 ;Llama a C10 ; ... RET ;De regreso B10 ENDP ;Quien llama ;--------------------------------------------------------------------END BEGIN

3.4.1Internos.
Procedimientos internos Los procedimientos internos son aquellos que se declaran y se llaman dentro del mismo programa, tambin son llamados procedimientos locales. El listado anterior muestra la forma de utilizar procedimientos internos.

3.4.2Externos.
Procedimientos externos Los procedimientos externos, a diferencia de los internos, se declaran en mdulos 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 externos, es necesario que sean declarados como pblicos en el programa donde se encuentran y que sean llamados como externos en el programa donde sern usados. Para lograr esto, Pass32 cuenta con tres directivas de ensamble: .PUBLIC para declarar los procedimientos como pblicos, .EXTERN para indicar que el procedimiento que se va a usar est fuera del programa y .INCLUDE para enlazar el programa que contiene los procedimientos con el programa que los llama. El siguiente programa muestra el uso de las directivas de inclusin. Primeramente, el archivo Proc2.ASM se modific para que su variable Cad1 fuera declarada como publica, el programa Proc3.ASM contiene la lnea .INCLUDE Proc2.ASM, lo cual indica al ensamblador que, en caso de que se soliciten datos, etiquetas o procedimientos externos, stos se busquen en el archivo incluido. Pass32 proporciona grandes facilidades para el manejo de procedimientos; en este caso, solamente Cad1 debe ser declarada como pblica, puesto que los procedimientos se buscan y anexan automticamente al programa que los llama si es que existen. .COMMENT * Programa: Proc3.ASM Autor: Juan Carlos Guzmn C. Descripcin: Este programa ilustra la forma de utilizar procedimientos y datos externos en los programas por medio de las directivas de inclusin include y public. .MODEL TINY .INCLUDE proc2.ASM ;Incluir el archivo 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 Dl,20 ;X=20 Mov Dh,10 ;Y=10 Call GotoXY ;GotoXY 20,10 Lea DX,Cad2 ;DX->Cad2 en Proc3.asm Call Imprime_Cad ;Imprime Cad2 Lea DX,Cad1 ;DX->Cad1 en Proc2.asm Call Imprime_Cad ;Imprime Cad1

Mov AX,04C00h ;Fin del programa Int 21h ; END INICIO END .COMMENT * Programa: Proc2.ASM Autor: Juan Carlos Guzmn C. Descripcin: Este programa ilustra la forma de utilizar procedimientos en los programas por medio de la instruccin Call y la forma de pasarles parmetros. .MODEL TINY .DATA .PUBLIC Cad1 db 'Esta es una cadena de prueba...',13,10,'$' .CODE INICIO: ;Punto de entrada al programa Mov DL,20 ;X=20 Mov DH,10 ;Y=10 Call Gotoxy ;GotoXY 20,10 Lea DX,cad1 ;DX->Cad1 Call Imprime_Cad ;Imprimir Cad1 Mov Ax,04C00h ;Terminar y regresar al dos Int 21h ; END INICIO ;********************************************************************* ;Procedimiento: GotoXY ;Descripcin: Coloca el cursor una posicin especifica de la pantalla ;Parmetros: Dl=X, Dh=Y ;********************************************************************* PROC GotoXY Xor Bh,Bh Mov Ah,02h Int 10h Ret ENDP GotoXY ;*********************************************************************** ;Procedimiento: Limpia_Pantalla ;Descripcin: Imprime una cadena de caracteres en la posicin del cursor ;Parmetros: La direccin de la cadena en DX ;*********************************************************************** PROC Imprime_Cad Mov Ah,09h Int 21h Ret ENDP Imprime_Cad END Con estas capacidades, es fcil crear bibliotecas de procedimientos y macros que puedan ser utilizados constantemente por los dems programas, ahorrando con ello tiempo de programacin al reutilizar cdigo fuente. El siguiente programa muestra la forma de escribir una biblioteca de

procedimientos y la forma de utilizarlos en los programas. .COMMENT * Programa: Proc3.ASM Autor: Juan Carlos Guzmn C. Descripcin: Este programa ilustra la forma de utilizar procedimientos y datos externos en los programas por medio de las directivas de inclusin include y public. .MODEL TINY .INCLUDE proclib.inc ;Incluir el archivo proclib.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 Call limpia_Pantalla ; Mov Dl,20 ;X=20 Mov Dh,10 ;Y=10 Call GotoXY ;GotoXY 20,10 Lea DX,Cad1 ;DX->Cad1 Call Imprime_Cad ;Imprime Cad1 Mov Dl,40 ; Mov Dh,24 ; Call GotoXY ;GotoXY 40,25 Lea DX,Cad2 ; Call Imprime_Cad ;Imprime Cad2 Call Espera_Tecla ;Esperar por una tecla presionada Mov AX,04C00h ;Fin del programa Int 21h ; END INICIO END .COMMENT Biblioteca de Procedimientos en Lenguaje ensamblador .CODE ;********************************************************************* ;Procedimiento: GotoXY ; Descripcin: Coloca el cursor una posicin especifica de la pantalla ; Parmetros: Dl=X, Dh=Y ;********************************************************************* PROC GotoXY Xor Bh,Bh Mov Ah,02h Int 10h Ret ENDP GotoXY ;*********************************************************************** ;Procedimiento: Imprime_Cad

; Descripcin: Imprime una cadena de caracteres en la posicin del cursor ; Parmetros: La direccin de la cadena en DX ;*********************************************************************** PROC Imprime_Cad Int 21h Ret ENDP Imprime_Cad ;********************************************************************** ;Procedimiento: Limpia_Pantalla ; Descripcin: Limpia la pantalla de la computadora y coloca el cursor ; en 0,0. ; Parmetros: Ninguno ;********************************************************************** PROC Limpia_Pantalla mov ax,0600h mov bh,17h mov cx,0000h mov dx,184fh int 10h Mov dx,0000h Call Gotoxy Ret ENDP Limpia_Pantalla ;********************************************************************** ;Procedimiento: Espera_Tecla ; Descripcin: Detiene la ejecucin de un programa hasta que se presiona ; una tecla ; Parmetros: Ninguno ;********************************************************************** PROC Espera_Tecla mov ah,10h int 16h Ret ENDP Espera_Tecla

http://www.monografias.com/trabajos11/lenen/lenen2.s html

Unidad 4. Programacin hbrida.


Este tipo de programacin se da cuando el programador necesita emplear elementos que no estan contemplados dentro de los lenguajes de alto nivel que habitualmente usa. Por ejemplo, la mayor parte de los lenguajes de alto nivel, no soportan o no incluyen instrucciones para el manejo del mouse, lpiz pticos, adaptadores de

juegos, etc. Para solucionar este tipo de problemas, el programador tiene que recurrir a la escritura de parches en lenguaje ensamblador, los cuales actualmente son fciles de implementar. El problema mayor, que el programador enfrenta al establecer la interfaz entre el lenguaje de alto nivel y el lenguaje ensamblador, es el de conectar realmente los dos programas y pasar las variables de un lado a otro. Afortunadamente, en la actualidad es muy sencillo realizar las interfaces entre dos lenguajes, el siguiente objetivo nos muestra mediante ejemplos, la interconexin entre el Lenguaje Pascal y el Lenguaje ensamblador. El lenguaje Pascal, y en particular el Turbo Pascal, es el lenguaje de programacin ms usado en la actualidad. Este lenguaje a partir de sus versiones 6.0 tiene la ventaja de que los parches que se realizan en lenguaje ensamblador, ya no sean fuera del cdigo fuente del programa, sino que en el mismo cdigo se introduzcan las instrucciones en lenguaje ensamblador, las cuales seran ensambladas al momento de la compilacin.

4.6 Directivas para compilacin hbrida. 4.7 Funciones en ensamblador. 4.8 Bloques en ensamblador. 4.9 Operadores. 4.10Integrar mdulos de ensamblador en lenguajes de alto nivel.

Ms informacin en el achivo: leng_ensamblador.pdf

You might also like