You are on page 1of 18

Lenguaje Ensamblador Introduccin.

El documento que esta visualizando tiene la funcin primordial de introducirlo a la programacin en lenguaje Ensamblador, y est pensado en aquellas personas que nunca han trabajado con este lenguaje y probablemente con ningn otro. El tutorial se enfoca completamente hacia las computadoras que operan con procesadores de la familia x86 de Intel y, considerando que el ensamblador basa su funcionamiento en los recursos internos del procesador, los ejemplos descritos no son compatibles con ninguna otra arquitectura. Se estructura la informacin en forma de unidades para permitir el fcil acceso a cada uno de los tpicos y facilitar el seguimiento del tutorial. En la seccin introductoria se mencionan algunos de los conceptos elementales acerca de los sistemas de cmputo as como del ensamblador mismo, y contina con el tutorial propiamente dicho. CONTENIDO: Descripcin bsica de un sistema de cmputo ........................3 El porqu aprender lenguaje ensamblador ...............................6 Acercamiento al lenguaje ensamblador. Esta primera parte esta enfocada al conocimiento de algunas de las caractersticas de las computadoras y del ensamblador. UNIDAD 1: Conceptos bsicos...............................................7 UNIDAD 2: Programacin en ensamblador............................28 Las instrucciones del ensamblador. En esta segunda parte se profundiza un poco mas en la descripcin de las instrucciones del lenguaje ensamblador. UNIDAD 3: Instrucciones de operacin sobre datos....................41 UNIDAD 4: Instrucciones lgicas y aritmticas...........................50 UNIDAD 5: Instrucciones para control de procesos.....................58 Interrupciones y manejo de archivos.

UNIDAD 6: Interrupciones........................................................74 UNIDAD 7: Introduccin al manejo de archivos.........................102 Introduccin a las macros. UNIDAD 8: Macros y procedimientos......................................109 Ejemplos.................................................................................114 En esta seccin se exponen algunos programas de ejemplo en los que se utilizan los elementos explicados en el tutorial. Desplegar un mensaje en pantalla Desplegar nmeros hexadecimales del 15 al 0 Operaciones bsicas Directorio y bibliografa..........................................128

Descripcion bsica de un sistema de cmputo.


Esta seccin tiene como finalidad dar una breve resea de las partes principales de un sistema de cmputo a un nivel bsico, que permita al usuario un mayor entendimiento de los conceptos que se trataran a lo largo del tutorial. * Procesador Central * Memoria Central * Unidades de Entrada y Salida * Unidades de Memoria Auxiliar

Sistema de cmputo.
Le llamamos sistema de cmputo a la configuracin completa de una computadora, incluyendo las unidades perifricas y la programacin de sistemas que la hacen un aparato til y funcional para un fin determinado. Procesador Central. Esta parte es conocida tambin como unidad central de procesamiento o UCP. formada a su vez por la unidad de control y la unidad aritmtica y lgica. Sus funciones consisten en leer y escribir contenidos de las celdas de memoria, llevar y traer datos entre celdas de memoria y registros especiales y decodificar y ejecutar las instruccines de un programa.

El procesador cuenta con una serie de celdas de memoria que se tilizan con mucha frecuencia y que, por ende, forman parte de la UCP. Estas celdas son conocidas con el nombre de registros. Un procesador puede tener una docena o dos de estos registros. La unidad aritmtica y lgica de la UCP realiza las operaciones relacionadas con los clculos numricos y simblicos. Tpicamente estas unidades slo tienen capacidad de efectuar operaciones muy elementales como: suma y resta de dos nmeros de punto fijo, multiplicacin y divisin de punto fijo, manipulacin de bits de los registros y comparacin del contenido de dos registros. Las computadoras personales pueden clasificarse por lo que se conoce como tamao de palabra, esto es, la cantidad de bits que el procesador puede manejar a la vez. Memoria Central. Es un conjunto de celdas (actualmente fabricadas con semiconductores) usadas para procesos generales, tales como la ejecucin de programas y el almacenamiento de informacin para las operaciones. Cada una de las celdas puede contener un valor numrico y tienen la propiedad de ser direccinables, esto es, que se pueden distinguir una de otra por medio de un nmero nico o direccin para cada celda. El nombre genrico de estas memorias es Random Access Memory (Memoria de acceso aleatorio) o RAM por sus siglas en ingls. La principal desventaja de este tipo de memoria es que los circuitos integrados pierden la informacin que tienen almacenada cuando se interrumpe la alimentacin elctrica. Esto llev a la creacin de memorias cuya informacin no se pierda cuando se apaga el sistema. Estas memorias reciben el nombre de Read Only Memory (Memoria de solo lectura) o ROM. Unidades de Entrada y Salida. Para que una computadora nos sea til es necesario que el procesador se comunique al exterior por medio de interfaces que permiten la entrada y la salida de datos del procesador y la memoria. Haciendo uso de estas comunicaciones es posible introducir datos para su procesamiento y la posterior visualizacin de los datos ya procesados. Algunas de las unidades de entrada mas comunes son teclados, lectoras de tarjetas (ya en desuso), mouse, etc. Las unidades de salida mas comunes son las terminales de video y las impresoras. Unidades de Memoria Auxiliar. Como la memoria central de una computadora es costosa y, considerando las aplicaciones actuales, muy limitada, surge entonces la necesidad de crear sistemas de almacenamiento de informacin prcticos y econmicos. Adem s, la memoria central pierde su contenido al apagarse la mquina, por lo que no es conveniente tilizarla para almacenamiento permanente de datos.

Estos y otros incovenientes dan lugar a la creacin de unidades perifricas de memoria que reciben el nombre de memoria auxiliar o secundaria. De estas unidades perifricas las ms comunes son las cintas y los discos magnticos. La informacin almacenada en estos medios magnticos recibe el nombre de archivo. Un archivo est formado por un nmero variable de registros, generalmente de tamao fijo; los registros pueden contener datos o programas. Ventajas del Ensamblador La primera razn para trabajar con ensamblador es que proporciona la oportunidad de conocer ms a fondo la operacin de su PC, lo que permite el desarrollo de software de una manera ms consistente. La segunda razn es el control total de la PC que se tiene con el uso del mismo. Otra razn es que los programas de ensamblador son ms rpidos, ms compactos y tienen mayor capacidad que los creados en otros lenguajes. Por ltimo el ensamblador permite una optimizacin ideal en los programas tanto en su tamao como en su ejecucin. Software En terminos de computacin es todo aquel proceso o programa que tiliza los recursos de la computadora para lograr el objetivo trazado por su diseador o programador. Conceptos bsicos Informacin en las computadoras. Unidades de informacin Sistemas numricos Convertir nmeros binarios a decimales Convertir nmeros decimales a binarios Sistema Hexadecimal Mtodos de representacin de datos en una computadora. Cdigo ASCII Mtodo BCD Representacin de punto flotante Trabajando con el lenguaje ensamblador.

Proceso de creacin de un programa Registros de la UCP La estructura del ensamblador Nuestro primer programa Guardar y cargar los programas Condiciones, ciclos y bifurcaciones Interrupciones Unidades de informacin Para que la PC pueda procesar la informacin es necesario que est se encuentre en celdas especiales llamadas registros. Los registros son conjuntos de 8 o 16 flip-flops (basculadores o biestables). Un flip-flop es un dispositivo capaz de almacenar dos niveles de voltaje, uno bajo, regularmente de 0.5 volts y otro alto comunmente de 5 volts. El nivel bajo de energ'a en el flip-flop se interpreta como apagado o 0, y el nivel alto como prendido o 1. A estos estados se les conoce usualmente como bits, que son la unidad ms pequea de informacin en una computadora. A un grupo de 16 bits se le conoce como palabra, una palabra puede ser dividida en grupos de 8 bits llamados bytes, y a los grupos de 4 bits les llamamos nibbles. Sistemas numricos El sistema numrico que tilizamos a diario es el sistema decimal, pero este sistema no es conveniente para las mquinas debido a que la informacin se maneja codificada en forma de bits prendidos o apagados; esta forma de codificacin nos lleva a la necesidad de conocer el clculo posicional que nos permita expresar un nmero en cualquier base que lo necesitemos. Es posible representar un nmero determinado en cualquier base mediante la siguiente formula: Donde n es la posicin del dgito empezando de derecha a izquierda y numerando a partir de cero. D es el dgito sobre el cual operamos y B es la base numrica empleada. Convertir nmeros binarios a decimales Trabajando en el lenguaje ensamblador nos encontramos con la necesidad de convertir nmeros del sistema binario, que es el empleado por las computadoras, al sistema decimal tilizado por las personas.

El sistema binario est basado en unicamente dos condiciones o estados, ya sea encendido (1) o apagado (0), por lo tanto su base es dos. Para la conversin podemos tilizar la formula de valor posicional: Por ejemplo, si tenemos el nmero binario 10011, tomamos de derecha a izquierda cada dgito y lo multiplicamos por la base elevada a la nueva posicin que ocupan: Binario: 1 1 0 0 1 Decimal: 1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4 = 1 + 2 + 0 + 0 + 16 = 19 decimal. El caracter ^ es tilizado en computacin como smbolo de potenciacin y el caracter * se usa para representar la multiplicacin. Convertir nmeros decimales a binarios Existen varios mtodos de conversin de nmeros decimales a binarios; aqu' solo se analizar uno. Naturalmente es mucho ms fcil una conversin con una calculadora cient'fica, pero no siempre se cuenta con ella, as que es conveniente conocer por lo menos una forma manual para hacerlo. El mtodo que se explicar tiliza la divisin sucesiva entre dos, guardando el residuo como dgito binario y el resultado como la siguiente cantidad a dividir. Tomemos como ejemplo el nmero 43 decimal. 43/2 = 21 y su residuo es 1 21/2 = 10 y su residuo es 1 10/2 = 5 y su residuo es 0 5/2 = 2 y su residuo es 1 2/2 = 1 y su residuo es 0 1/2 = 0 y su residuo es 1 Armando el nmero de abajo hacia arriba tenemos que el resultado en binario es 101011 Sistema hexadecimal En la base hexadecimal tenemos 16 dgitos que van del 0 al 9 y de la letra A hasta la F (estas letras representan los nmeros del 10 al 15). Por lo tanto, contamos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F.

La conversin entre numeracin binaria y hexadecimal es sencilla. Lo primero que se hace para una conversin de un nmero binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el ltimo grupo (el que quede ms a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros. Tomando como ejemplo el nmero binario 101011 lo dividimos en grupos de 4 bits y nos queda: 10; 1011 Rellenando con ceros el ltimo grupo (el de la izquierda): 0010; 1011 despus tomamos cada grupo como un nmero independiente y consideramos su valor en decimal: 0010 = 2; 1011 = 11 Pero como no podemos representar este nmero hexadecimal como 211 porqu sera un error, tenemos que sustituir todos los valores mayores a 9 por su respectiva representacin en hexadecimal, con lo que obtenemos: 2BH (Donde la H representa la base hexadecimal) Para convertir un nmero de hexadecimal a binario solo es necesario invertir estos pasos: se toma el primer dgito hexadecimal y se convierte a binario, y luego el segundo, y as sucesivamente hasta completar el nmero. cdigo ASCII ASCII generalmente se pronuncia "aski", es un acrnimo de American Standard Code for Information Interchange. Este cdigo asigna a las letras del alfabeto, a los dgitos decimales del 0 al 9 y a varios smbolos adicionales un nmero binario de 7 bits (ponindose el bit 8 en su estado de apagado o 0). De esta forma cada letra, dgito o caracter especial ocupa un byte en la memoria de la computadora. Podemos observar que este mtodo de representacin de datos es muy ineficiente en el aspecto numrico, ya que en formato binario nos basta un solo byte para representar nmeros de 0 a 255, en cambio con el cdigo ASCII un byte puede representar unicamente un dgito. Debido a esta ineficiencia, el cdigo ASCII es principalmente tilizado en la memoria para representar texto. mtodo BCD

BCD es un acrnimo de Binary Coded Decimal. En esta notacin se tilizan grupos de 4 bits para representar cada dgito decimal del 0 al 9. Con este mtodo podemos representar dos dgitos por byte de informacin. An cuando este mtodo es mucho ms prctico para representacin de nmeros en la memoria en comparacin al ASCII, todav'a se queda por debajo del binario, ya que con un byte en el mtodo BCD solo podemos representar dgitos del 0 al 99, en cambio, en formato binario podemos representar todos los dgitos desde 0 hasta 255. Este formato es tilizado principalmente para representar nmeros muy grandes en aplicaciones mercantiles ya que fcilita las operaciones con los mismos evitando errores de redondeo. Representacin de punto flotante Esta representacin esta basada en la notacin cientfica, esto es, representar un nmero en dos partes: su mantisa y su exponente. Poniendo como ejemplo el nmero 1234000, podemos representarlo como 1.123*10^6, en esta ltima notacin el exponente nos indica el nmero de espacios que hay que mover el espacio hacia la derecha para obtener el resultado original. En caso de que el exponente fuera negativo nos estara indicando el nmero de espacios que hay que recorrer el punto decimal hacia la izquierda para obtener el original. Proceso de creacin de un programa Para la creacin de un programa es necesario seguir cinco pasos: diseo del algoritmo, codificacin del mismo, su traduccin a lenguaje mquina, la prueba del programa y la depuracin. En la etapa de diseo se plantea el problema a resolver y se propone la mejor solucin, creando diagramas esquemticos tilizados para el mejor planteamiento de la solucin. La codificacin del programa consiste en escribir el programa en algn lenguaje de programacin; en este caso especfico en ensamblador, tomando como base la solucin propuesta en el paso anterior. La traduccin al lenguaje mquina es la creacin del programa objeto, esto es, el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador. La prueba del programa consiste en verificar que el programa funcione sin errores, o sea, que haga lo que tiene que hacer. La ltima etapa es la eliminacin de las fallas detectadas en el programa durante la fase de prueba. La correccin de una falla normalmente requiere la repeticin de los pasos comenzando desde el primero o el segundo.

Para crear un programa en ensamblador existen dos opciones, la primera es tilizar el MASM (Macro Assembler, de Microsoft), y la segunda es tilizar el debugger, en esta primera seccin tilizaremos este ltimo ya que se encuentra en cualquier PC con el sistema operativo MS-DOS, lo cual lo pone al alcance de cualquier usuario que tenga acceso a una mquina con estas caracteristicas. Debug solo puede crear archivos con extensin .COM, y por las caractersticas de este tipo de programas no pueden ser mayores de 64 kb, adems deben comenzar en el desplazamiento, offset, o direccin de memoria 0100H dentro del segmento especfico. Registros de la UCP La UCP tiene 14 registros internos, cada uno de 16 bits. Los primeros cuatro, AX, BX, CX, y DX son registros de uso general y tambin pueden ser tilizados como registros de 8 bits, para tilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable tambin a los registros BX, CX y DX. Los registros son conocidos por sus nombres especficos:

AX Acumulador BX Registro base CX Registro contador DX Registro de datos DS Registro del segmento de datos ES Registro del segmento extra SS Registro del segmento de pila CS Registro del segmento de cdigo BP Registro de apuntadores base SI Registro ndice fuente DI Registro ndice destino SP Registro del apuntador de la pila IP Registro de apuntador de siguiente instruccin F Registro de banderas

Es posible visualizar los valores de los registros internos de la UCP tilizando el programa Debug. Para empezar a trabajar con Debug digite en el prompt de la computadora: C:\> Debug [Enter] En la siguiente linea aparecera un guin, ste es el indicador del Debug, en ste momento se pueden introducir las instruccines del Debug. tilizando el comando: - r [Enter] Se desplegaran todos los contenidos de los registros internos de la UCP; una forma alternativa de mostrarlos es usar el comando "r" tilizando como parametro el nombre del registro cuyo valor se quiera visualizar. Por ejemplo:

- rbx Esta instruccin desplegar unicamente el contenido del registro BX y cambia el indicador del Debug de " - " a " : " Estando as el prompt es posible cambiar el valor del registro que se visualizo tecleando el nuevo valor y a continuacin [Enter], o se puede dejar el valor anterior presionando [Enter] sin telclear ningn valor. Es posible cambiar el valor del registro de banderas, as como tilizarlo como estructura de control en nuestros programas como se ver ms adelante. Cada bit del registro tiene un nombre y significado especial, la lista dada a continuacin describe el valor de cada bit, tanto apagado como prendido y su relacin con las operaciones del procesador: Overflow

NV = no hay desbordamiento; OV = s lo hay Direction

UP = hacia adelante; DN = hacia atras; Interrupts

DI = desactivadas; EI = activadas Sign

PL = positivo; NG = negativo Zero

NZ = no es cero; ZR = si lo es Auxiliary Carry

NA = no hay acarreo auxiliar; AC = hay acarreo auxiliar Parity

PO = paridad non; PE = paridad par; Carry

NC = no hay acarreo; CY = si lo hay

La estructura del ensamblador En el lenguaje ensamblador las lineas de cdigo constan de dos partes, la primera es el nombre de la instruccin que se va a ejecutar y la segunda son los parmetros del comando u operandos. Por ejemplo: add ah bh Aqu "add" es el comando a ejecutar (en ste caso una adicin) y tanto "ah" como "bh" son los parmetros. El nombre de las instruccines en ste lenguaje esta formado por dos, tres o cuatro letras. a estas instruccines tambin se les llama nombres mnemnicos o cdigos de operacin, ya que representan algna funcin que habr de realizar el procesador. Existen algnos comandos que no requieren parmetros para su operacin, as como otros que requieren solo un par metro. algnas veces se utilizaran las instruccines como sigue: add al,[170] Los corchetes en el segundo parmetro nos indican que vamos a trabajar con el contenido de la casilla de memoria nmero 170 y no con el valor 170, a sto se le conoce como direccinamiento directo. Nuestro primer programa Vamos a crear un programa que sirva para ilustrar lo que hemos estado viendo, lo que haremos ser una suma de dos valores que introduciremos directamente en el programa:

El primer paso es iniciar el Debug, ste paso consiste unicamente en teclear debug [Enter] en el prompt del sistema operativo. Para ensamblar un programa en el Debug se tiliza el comando "a" (assemble); cuando se tiliza ste comando se le puede dar como parmetro la direccin donde se desea que se inicie el ensamblado. Si se omite el parmetro el ensamblado se iniciar en la localidad especificada por CS:IP, usualmente 0100H, que es la localidad donde deben iniciar los programas con extensin .COM, y sera la localidad que tilizaremos debido a que debug solo puede crear ste tipo especfico de programas. Aunque en ste momento no es necesario darle un parmetro al comando "a" es recomendable hacerlo para evitar problems una vez que se haga uso de los registros CS:IP, por lo tanto tecleamos: - a0100 [Enter] Al hacer sto aparacer en la pantalla algo como: 0C1B:0100 y el cursor se posiciona a la derecha de stos nmeros, ntese que los primeros cuatro dgitos (en sistema hexagesimal) pueden ser diferentes, pero los ltimos cuatro deben ser 0100, ya que es la direccin que indicamos como inicio. Ahora podemos introducir las instruccines: 0C1B:0100 mov ax,0002 ;coloca el valor 0002 en el registro ax 0C1B:0103 mov bx,0004 ;coloca el valor 0004 en el registro bx 0C1B:0106 add ax,bx ;le adiciona al contenido de ax el contenido de bx 0C1B:0108 int 20 ; provoca la terminacin del programa. 0C1B:010A No es necesario escribir los comentarios que van despus del ";". Una vez digitado el ltimo comando, int 20, se le da [Enter] sin escribir nada mas, para volver al prompt del debuger. La ltima linea escrita no es propiamente una instruccin de ensamblador, es una llamada a una interrupcin del sistema operativo, estas interrupciones ser n tratadas ms a fondo en un captulo posterior, por el momento solo es necesario saber que nos ahorran un gran nmero de lineas y son muy tiles para accesar a funciones del sistema operativo. Para ejecutar el programa que escribimos se utliza el comando "g", al tilizarlo veremos que aparece un mensaje que dice: "Program terminated normally". Naturalmente con un mensaje como ste no podemos estar seguros que el programa haya hecho la suma, pero existe una forma sencilla de verificarlo, tilizando el comando "r" del Debug podemos ver los contenidos de todos los registros del procesador, simplemente teclee: - r [Enter] aparacer en pantalla cada registro con su respectivo valor actual: AX=0006BX=0004CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000

DS=0C1BES=0C1BSS=0C1BCS=0C1BIP=010A NV UP EI PL NZ NA PO NC 0C1B:010A 0F DB oF Existe la posibilidad de que los registros contengan valores diferentes, pero AX y BX deben ser los mismos, ya que son los que acabamos de modificar. Otra forma de ver los valores, mientras se ejecuta el programa es tilizando como parmetro para "g" la direccin donde queremos que termine la ejecucin y muestre los valores de los registros, en ste caso sera: g108, esta instruccin ejecuta el programa, se detiene en la direccin 108 y muestra los contenidos de los registros. tambin se puede llevar un seguimiento de lo que pasa en los registros tilizando el comando "t" (trace), la funcin de ste comando es ejecutar linea por linea lo que se ensambl mostrando cada vez los contenidos de los regitros. Para salir del Debug se tiliza el comando "q" (quit). Guardar y cargar los programas No sera prctico tener que digitar todo un programa cada vez que se necesite, para evitar eso es posible guardar un programa en el disco, con la enorme ventaja de que ya ensamblado no ser necesario correr de nuevo debug para ejecutarlo. Los pasos a seguir para guardar un programa ya almacenado en la memoria son: Obtener la longitud del programa restando la direccin final de la direccin inicial, naturalmente en sistema hexadecimal. Darle un nombre al programa y extensin Poner la longitud del programa en el registro CX Ordenar a Debug que escriba el programa en el disco. tilizando como ejemplo el programa del captulo anterior tendremos una idea ms clara de como llevar stos pasos: Al terminar de ensamblar el programa se vera as: 0C1B:0100 mov ax,0002 0C1B:0103 mov bx,0004 0C1B:0106 add ax,bx 0C1B:0108 int 20 0C1B:010A - h 10a 100 020a 000a

- n prueba.com - rcx CX 0000 :000a -w Writing 000A bytes Para obtener la longitud de un programa se tiliza el comando "h", el cual nos muestra la suma y resta de dos nmeros en hexadecimal. Para obtener la longitud del nuestro le proporcionamos como parmetros el valor de la direccin final de nuestro programa (10A) y el valor de la direccin inicial (100). El primer resultado que nos muestra el comando es la suma de los parmetros y el segundo es la resta. El comando "n" nos permite poner un nombre al programa. El comando "rcx" nos permite cambiar el contenido del registro CX al valor que obtuvimos del tamao del archivo con "h", en ste caso 000a, ya que nos interesa el resultado de la resta de la direccin inicial a la direccin final. Por ltimo el comando w escribe nuestro programa en el disco, indicandonos cuantos bytes escribi. Para cargar un archivo ya guardado son necesarios dos pasos: Proporcionar el nombre del archivo que se cargar. Cargarlo tilizando el comando "l" (load). Para obtener el resultado correcto de los siguientes pasos es necesario que previamente se haya creado el programa anterior. Dentro del Debug escribimos lo siguiente: - n prueba.com -l - u 100 109 0C3D:0100 B80200 MOV AX,0002 0C3D:0103 BB0400 MOV BX,0004 0C3D:0106 01D8 ADD AX,BX

0C3D:0108 CD20 INT 20 El ltimo comando, "u", se tiliza para verificar que el programa se carg en memoria, lo que hace es desensamblar el cdigo y mostrarlo ya desensamblado. Los parmetros le indican a Debug desde donde y hasta donde desensamblar. Debug siempre carga los programas en memoria en la direccin 100H, a menos que se le indique algna otra. Condiciones, ciclos y bifurcaciones Estas estructuras, o formas de control le dan a la mquina un cierto grado de desicin basado en la informacin que recibe. La forma ms sencilla de comprender ste tema es por medio de ejemplos. Vamos a crear tres programas que hagan lo mismo: desplegar un nmero determinado de veces una cadena de caracteres en la pantalla. - a100 0C1B:0100 jmp 125 ; brinca a la direccin 125H 0C1B:0102 [Enter] - e 102 'Cadena a visualizar 15 vecesi 0d 0a '$' - a125 0C1B:0125 MOV CX,000F ; veces que se desplegar la cadena 0C1B:0128 MOV DX,0102 ; copia cadena al registro DX 0C1B:012B MOV AH,09 ; copia valor 09 al registro AH 0C1B:012D INT 21 ; despliega cadena 0C1B:012F LOOP 012D ; si CX>0 brinca a 012D 0C1B:0131 INT 20 ; termina el programa. Por medio del comando "e" es posible introducir una cadena de caracteres en una determinada localidad de memoria, dada como parmetro, la cadena se introduce entre comillas, le sigue un espacio, luego el valor hexadecimal del retorno de carro, un espacio, el valor de linea nueva y por ltimo el simbolo '$' que el ensamblador interpreta como final de la cadena. La interrupcin 21 tiliza el valor almacenado en el registro AH para ejecutar una determinada funcin, en ste caso mostrar la cadena en pantalla, la cadena que muestra es la que est almacenada en el registro DX. La instruccin LOOP decrementa automaticamente el registro CX en uno y si no ha llegado el valor de ste registro a cero brinca a la casilla indicada como parmetro, lo cual crea un ciclo que se

repite el nmero de veces especificado por el valor de CX. La interrupcin 20 termina la ejecucin del programa. Otra forma de realizar la misma funcin pero sin tilizar el comando LOOP es la siguiente: - a100 0C1B:0100 jmp 125 ; brinca a la direccin 125H 0C1B:0102 [Enter] - e 102 'Cadena a visualizar 15 vecesi 0d 0a '$' - a125 0C1B:0125 MOV BX,000F ; veces que se desplegar la cadena 0C1B:0128 MOV DX,0102 ; copia cadena al registro DX 0C1B:012B MOV AH,09 ; copia valor 09 al registro AH 0C1B:012D INT 21 ; despliega cadena 0C1B:012F DEC BX ; decrementa en 1 a BX 0C1B:0130 JNZ 012D ; si BX es diferente a 0 brinca a 012D 0C1B:0132 INT 20 ; termina el programa. En ste caso se tiliza el registro BX como contador para el programa, y por medio de la instruccin "DEC" se disminuye su valor en 1. La instruccin "JNZ" verifica si el valor de B es diferente a 0, sto con base en la bandera NZ, en caso afirmativo brinca hacia la direccin 012D. En caso contrario contina la ejecucin normal del programa y por lo tanto se termina. Una tima variante del programa es tilizando de nuevo a CX como contador, pero en lugar de tilizar LOOP tilizaremos decrementos a CX y comparacin de CX a 0. - a100 0C1B:0100 jmp 125 ; brinca a la direccin 125H 0C1B:0102 [Enter] - e 102 'Cadena a visualizar 15 vecesi 0d 0a '$' - a125 0C1B:0125 MOV DX,0102 ; copia cadena al registro DX

0C1B:0128 MOV CX,000F ; veces que se desplegar la cadena 0C1B:012B MOV AH,09 ; copia valor 09 al registro AH 0C1B:012D INT 21 ; despliega cadena 0C1B:012F DEC CX ; decrementa en 1 a CX 0C1B:0130 JCXZ 0134 ; si CX es igual a 0 brinca a 0134 0C1B:0132 JMP 012D ; brinca a la direcci&oaute;n 012D 0C1B:0134 INT 20 ; termina el programa En ste ejemplo se usa la instruccin JCXZ para controlar la condicin de salto, el significado de tal funcin es: brinca si CX=0 El tipo de control a tilizar depender de las necesidades de programacin en determinado momento. Interrupciones Definicin de interrupcin: Una interrupcin es una instruccin que detiene la ejecucin de un programa para permitir el uso de la UCP a un proceso prioritario. Una vez concluido ste ltimo proceso se devuelve el control a la aplicacin anterior. Por ejemplo, cuando estamos trabajando con un procesador de palabras y en ese momento llega un aviso de uno de los puertos de comunicaciones, se detiene temporalmente la aplicacin que estabamos tilizando para permitir el uso del procesador al manejo de la informacin que est llegando en ese momento. Una vez terminada la transferencia de informacin se reanudan las funciones normales del procesador de palabras. Las interrupciones ocurren muy seguido, sencillamente la interrupcin que actualiza la hora del da ocurre aproximadamente 18 veces por segundo. Para lograr administrar todas estas interrupciones, la computadora cuenta con un espacio de memoria, llamado memoria baja, donde se almacenan las direccines de cierta localidad de memoria donde se encuentran un juego de instruccines que la UCP ejecutar para despus regresar a la aplicacin en proceso. En los programas anteriores hicimos uso de la interrupcion nmero 20H para terminar la ejecucin de nuestros programas, ahora tilizaremos otra interrupcin para mostrar informacin en pantalla: tilizando Debug tecleamos: - a100

2C1B:0100 JMP 011D 2C1B:0102 [ENTER] - E 102 'Hola, como estas.' 0D 0A '$' - A011D 2C1B:011D MOV DX,0102 2C1B:0120 MOV AH,09 2C1B:0122 INT 21 2C1B:0123 INT 20 En ste programa la interrupcin 21H manda al monitor la cadena localizada en la direccin a la que apunta el registro DX. El valor que se le da a AH determina cual de las opciones de la interrupcin 21H sera tilizada, ya que esta interrupcin cuenta con varias opciones. El manejo directo de interrupciones es una de las partes ms fuertes del lenguaje ensamblador, ya que con ellas es posible controlar eficientemente todos los dispositivos internos y externos de una computadora gracias al completo control que se tiene sobre operaciones de entrada y salida.

You might also like