You are on page 1of 15

LABORATORIO DE MICROPROCESADORES PROF.

CECILIA SANDOVAL RUIZ

MANEJO DEL AMBIENTE DE DESARROLLO DEL LENGUAJE ENSAMBLADOR

INTRODUCCIN
Para la programacin en lenguaje ensamblador se tiene un set de instrucciones sustentada en la arquitectura del procesador, para nuestro caso trabajaremos con las instrucciones de los microprocesadores Intel de la familia 80x86, para lo cul se debe seleccionar una herramienta de trabajo para el ensamblador basado en el funcionamiento de los recursos internos del procesador. Pasos para ensamblar un programa a travs de la herramienta DEBUG

Al abrir la herramienta DEBUG, se presenta un guin para introducir el comando que se desea ejecutar, comenzamos por revisar la ayuda que ofrece DEBUG (-?) descripcin de los comandos y los argumentos que deben suministrrsele para su uso.

Esta ayuda puede consultarse para emplear los comandos soportados por la herramienta DEBUG. La arquitectura del computador se refiere a los atributos de un sistema que son visibles para el programador, aquellos que tienen un impacto directo en la ejecucin de un programa [Stalling, Organizacin y Arquitectura de Computadores], como es el caso del conjunto de instrucciones, numero de bits usados para representar varios tipos de datos. La organizacin del computador

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

se refiere a las unidades funcionales y sus interconexiones (detalles de hardware); En el caso del lenguaje ensamblador (lenguaje de bajo nivel) estos conceptos estn presentes para el diseo del programa, la herramienta seleccionada para programar en ASSEMBLER ser DEBUG el cual permite ensamblar instrucciones y depurar los programas ensamblados ya que el programador puede accesar a las direcciones donde se almacenan las instrucciones del programa; el contenido de los registros y el estado de las banderas del registro status; se puede visualizar la ejecucin pasos a paso, y constatar el estado de los registros durante la corrida de un programa, recordemos el significado de estos registros

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 instruccin F Registro de banderas

REGISTRO DE STATUS
Desbordamiento

NV = no hay OV = s lo hay Direccin

UP = hacia adelante; DN = hacia atrs; Interrupcin

DI = desactivadas; EI = activadas Signo

PL = positivo; NG = negativo Cero

NZ = no es cero; ZR = si lo es Acarreo auxiliar

NA = no hay AC = si hay Paridad

PO = paridad non; PE = paridad par; Acarreo

NC = no hay acarreo; CY = si lo hay

EJEMPLO 1 Se desea realizar un programa que escriba un string en pantalla, espere un caracter introducido por teclado, y luego escriba otro string (cadena de caracteres) en la prxima lnea, se le introduzca otro caracter, este programa podr ser tomado como base para

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

cualquier aplicacin que requiera parmetros definidos por el usuario a travs del teclado, manteniendo el orden de introduccin de datos. 1. Definir cadena de caracteres, para ello emplearemos el comando E dir, el cual permite introducir informacin a partir de la direccin especificada E <dir>, ejemplo introduciremos un string en la direccin 200 -E 200 'GRUPO#$' Para confirmar que la cadena de caracteres se encuentra all podemos utilizar el comando display D <dir1 dir2> definiendo el intervalo de direcciones que nos interesa visualizar -D 200 206 0C7C:0200 47 52 55 50 4F 23 24 GRUPO#$ Otra forma es introducir cada caracter hexadecimal byte por byte -E 210 0C7C:0210 58. (El debug se posiciona en la direccin especificada y nos muestra el valor actual del byte 0210 el cual contiene 58, seguidamente le introducimos el valor deseado, damos espacio y nos muestra el siguiente byte, al terminar colocamos el caracter $ (24) y ya hemos definido nuestros datos: -E 210 0C7C:0210 58.0D 0A.0A 24.24 Introducimos la prxima cadena de caracteres: -E 220 'SECCIN:$' Mostrar desde la direccin 200

All se encuentran los string que hemos introducido Qu pasa si el string posee mas de 15 caracteres? Cada caracter ocupa un byte de la memoria para el string1 se esta definiendo un espacio desde 200 hasta 20F (hexadecimal), si la cadena de caracteres es de mayor tamao ser cortada por el siguiente string. En caso de un string de tamao desconocido se recomienda dejar suficiente espacio para el prximo string a fin de no sobrescribir en cierta direccin y daar la cadena de caracteres. Para esta rutina requerimos mostrar informacin por pantalla y recibir datos por teclado, esto lo podemos realizar empleando una interrupcin es una operacin que invoca la ejecucin de una rutina especfica que suspende la ejecucin del programa que la llam, de tal manera que el sistema toma control del computador colocando en el stack (pila) el contenido de los registros CS e IP. El programa suspendido vuelve a activarse cuando termina la ejecucin de la interrupcin y son restablecidos los registros salvados. Existen dos razones para ejecutar una interrupcin: (1) intencionalmente como peticin para la entrada o salida de datos de un dispositivo, y (2) un error serio y no intencional, como sobre-flujo o divisin por cero. Al definir el programa se colocar en el byte alto del registro acumulador AH el numero de servicio del DOS, en el registro DX la direccin de inicio del string, el cual terminar al detectar el caracter $ (ASCII 24) y finalmente la interrupcin 21, que maneja E/S. [Tabla de interrupciones Barry B. Brey APENDICE A- Pg.693]

2. Ensamblar el programa a travs del comando A <dir> (con lo cual colocamos la direccin de inicio del programa, cada vez que se inicia un programa el DEBUG ofrece la direccin 0100 por defecto); comenzamos a introducir las instrucciones del programa

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

empleando los mnemnicos definidos por la sintaxis del lenguaje ensamblador, en cada direccin definimos la instruccin que ser asignada a cada localidad del segmento de cdigo, en cada lnea se escribir la instruccin y sus operando (segn el tipo de instruccin), el DEBUG manejara directamente las direcciones de memoria y se manejaran directamente las direcciones asignadas, es decir; no se emplearan etiquetas para saltos, sino directamente la direccin de salto en el programa, para la documentacin del programa se puede colocar (;) despus de la instruccin y se comentan, estos comentarios no ocupan memoria de programa, y son omitidas al desensamblar el programa, se recomiendan en el diseo del programa para aclarar la secuencia de instrucciones. RUTINA MOSTRAR STRING Y CAPTURAR UN CARACTER -A 100 0C7C:0100 MOV AH,09 ;solicitud 09H de las funciones del DOS mostrar cadena de caracteres 0C7C:0102 MOV DX,0200 ;direccin de la cadena de caracteres GRUPO# 0C7C:0105 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0107 ;se ha mostrado el string, ahora introducimos una espera el numero de grupo 0C7C:0107 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:0109 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:010B ;luego de pulsar la tecla, continua la ejecucin del programa 0C7C:010B MOV AH,09 ;solicitud 09H de las funciones del DOS mostrar cadena de caracteres 0C7C:010D MOV DX,210 ;direccin de la cadena de caracteres para saltar a la siguiente lnea 0C7C:0110 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0112 ;este string contiene el caracter 0A LF (Line Feed) va al principio de la sig. lnea 0C7C:0112 MOV DX,220 ;direccin de la cadena de caracteres SECCIN: 0C7C:0115 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0117 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:0119 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:011B INT 20 ;interrupcin para finalizar el programa 3. Guardar Programa especificando nombre, tamao y usando el comando escribir. El programa lo llamaremos string con la extensin .com -N STRING.COM A travs del comando R podemos consultar y asignar valores a los registros, de este modo asignaremos el tamao del programa haciendo uso de los registros BX y CX, siendo BX=00 le asignamos al registro contador CX el tamao del programa 011D-0100 H -H 011D 0100 021D 001D (resultado de la resta) -R CX CX 0000 :001D

Comando de escritura

-w Escribiendo 0001D bytes En este caso guardar el archivo ejecutable.com en C, si se desea guardar en un directorio, solo se especifica la ruta, si vamos a guardar en disco 3 -N a:\EJEMPLO1.COM (\ ALT 92 ) -W Luego podr ser ejecutado directamente y para editarlo se cargara con el DEBUG L <dir>, despus de especificar el nombre y la ruta se puede cargar y desensamblar para verlo y modificarlo -N a:\EJEMPLO1.COM -L 4. Desensamblar el programa con el comando U <dir.inicio dir.fin> el devuelve el intervalo de direcciones desplegando su contenido en hexadecimal y las instrucciones en ensamblador. -U 100 011D

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

0CB2:0100 B409 MOV AH,09 0CB2:0102 BA0002 MOV DX,0200 0CB2:0105 CD21 INT 21 0CB2:0107 B401 MOV AH,01 0CB2:0109 CD21 INT 21 0CB2:010B B409 MOV AH,09 0CB2:010D BA1002 MOV DX,0210 0CB2:0110 CD21 INT 21 0CB2:0112 BA2002 MOV DX,0220 0CB2:0115 CD21 INT 21 0CB2:0117 B401 MOV AH,01 0CB2:0119 CD21 INT 21 0CB2:011B CD20 INT 20 Luego podemos emplear el comando G para ejecutar el programa Espera un caracter por teclado, colocamos el numero del grupo

Luego se detiene esperando el caracter de la seccin, colocamos la letra

5. Ejecutar el programa por etapas se emplea el comando P, y para observar el contenido de los registros en cada instruccin ejecutada se dispone del comando T EDITAR UN PROGRAMA EN DEBUG (una vez ensamblado un programa, cada una de las

instrucciones que hemos programado tendr asignada una direccin en el segmento de cdigo, supongamos que se requiere cambiar o insertar una instruccin en un punto especifico del programa, por la naturaleza secuencial de las instrucciones debe insertarse en una direccin de memoria especifica, as que se deber sobrescribir o mover el segmento de cdigo posterior a la instruccin que se desea insertar y luego ensamblar las lneas de las instrucciones faltantes, de este modo se podr manejar el contenido de la memoria de programa para realizar los cambios necesarios)
6. Modificar lneas de instruccin, una vez finalizado un programa podemos ejecutarlo y conseguir un error en una de las instrucciones, en este caso podemos sobre-escribir el contenido de la localidad de memoria, corrigiendo la instruccin, ensamblamos en la direccin donde se encuentra la instruccin errnea y la modificamos -A 0112 0CB2:0112 ;instruccin corregida 0CB2:0115 7. Mover un bloque de instrucciones, Copia desde la direccin1 hasta la direccin2 y mueve el bloque a la direccin nueva -M dir.desde,dir.hasta dir.nueva -M 0107 0110,0112 Ahora al desensamblar se tendr a partir de la direccin 0112 el contenido de las direcciones desde 0107 hasta 0110

(a) Ntese que la instruccin iniciada en la direccin 0110 no ha sido movida completa, solo la parte de la instruccin que ocupa el Byte 0110, el contenido del Byte 0111 no esta incluido. (b) Una vez realizada la edicin de un programa corrido y funcionando debe ser guardado, ya que se cargara la ultima versin guardada.

Hasta ahora, el programa solo muestra la cadena de caracteres programada y permite introducir un caracter por teclado mostrndolo por pantalla. A partir de este programa podemos capturar dos operandos por pantalla, restarlos y mostrar resultado.

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

***IMPORTANTE: el caracter introducido por teclado con la funcin 01H es guardado en el byte bajo del registro acumulador AL, all estar disponible para operarlo*** EJEMPLO 2 0C7C:0100 MOV AH,09 ;solicitud 09H de las funciones del DOS mostrar cadena de caracteres 0C7C:0102 MOV DX,0200 ;direccin de la cadena de caracteres 0C7C:0105 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0107 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:0109 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:010B MOV BL,AL ;AL= caracter ASCII tecleado se mueve a BL para no perderlo 0C7C:010D MOV AH,09 ;solicitud 09H de las funciones del DOS mostrar cadena de caracteres 0C7C:010F MOV DX,0220 ;direccin de la cadena de caracteres 0C7C:0112 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0114 MOV DX,0230 ;direccin de la cadena de caracteres 0C7C:0117 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0119 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:011B INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:011D MOV CL,AL ;AL= caracter ASCII tecleado se mueve a CL para no perderlo 0C7C:011F SUB BL,CL ; resta aritmtica del contenido de los registros BL=BL-CL 0C7C:0121 AAS ;prepara el numero para convertirlo luego a cdigo ASCII (AAS DAS) 0C7C:0122 ADD BL,30 ;convierte a caracter ASCII 0C7C:0125 MOV AH,09 ;solicitud 09H de las funciones del DOS mostrar cadena de caracteres 0C7C:0127 MOV DX,0220 ;direccin de la cadena de caracteres 0C7C:012A INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:012C MOV DX,0250 ;direccin de la cadena de caracteres 0C7C:012F INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0131 MOV AH,02 ;mostrar caracter en pantalla 0C7C:0133 MOV DX,BX ;mover caracter a DX, para poder mostrarlo 0C7C:0135 INT 21 ;interrupcin para ejecutar la funcin DOS 0C7C:0137 INT 20 ;interrupcin para terminar programa 0C7C:0139 -E 200 'introduzca minuendo:$' -E 220 0D 0A '$' -E 230 'introduzca sustraendo:$' -E 250 'resultado:$' -g introduzca minuendo:7 introduzca sustraendo:3 resultado:4 El programa ha terminado de forma normal Ntese que los string estn expresados de forma genrica en las posiciones de memoria 200,220,230,250; de manera que los podemos cambiar ingresando nuevos string, al ejecutar el programa, este desplegar en pantalla los string actuales.

Otra funcin que podemos emplear adems de los servicios del DOS corresponde a las funciones del BIOS de video, veamos un ejemplo de limpiar pantalla y cambiar le color de acuerdo a las coordenadas de la pantalla.

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

FUNCION 06H: Limpiar la pantalla La funcin 06H de la INT 10H maneja el borrado o recorrido de la pantalla, puede limpiar todo o una parte donde se debe indicar en el registro CX el inicio de cualquier localidad de la pantalla (fila y columna inicial) y terminar en otra localidad cargada en DX con nmero mayor (fila y columna final) Requerimientos: 1. 2. 3. 4. 5. mover mover mover mover mover al registro AH la funcin 06h al registro AL el valor 00H para indicar pantalla completa en BH el nmero de atributo en CX la fila y columna de inicio en DX la fila y columna finales Formato decimal Fila 00 00 12 00 79 39/40 Formato decimal Fila 24 24 00 79 columna 18H 18H columna 00H 00H 0CH Formato hexa Fila 00H 4FH columna Fila 00H 4FH 27H/28H Formato hexa columna

Ubicacin en pantalla Esquina superior izquierda Esquina superior derecha Centro Ubicacin en pantalla Esquina inferior izquierda Esquina inferior derecha

En otras palabras la pantalla esta distribuida en 25 filas desde 00 H hasta 18H y en 80 columnas desde 00 hasta 4FH, de manera que para realizar cualquier figura se pueden calcular las posiciones de la pantalla especificar los atributos y representar el grfico. EL ATRIBUTO ES CARGADO EN EL REGISTRO BH BH carga un byte donde el primer valor corresponde al fondo y el segundo al primer plano Color Negro Azul Verde Cian Rojo Blanco Magenta Gris Amarillo valor en hexadecimal 0 1 2 3 4 7 D 8 E

EJEMPLO 3 ventana verde -A 100 0C7C:0100 MOV AX,0600 ;definimos funcin AH=06 y AL=00 borrar pantalla

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

0C7C:0103 MOV BH,2D ;atributos ventana_verde=2, letras_magenta=D 0C7C:0105 MOV CX,0000 ;esquina superior izquierda 0C7C:0108 MOV DX,184F ;esquina inferior derecha 0C7C:010B INT 10 ;llamada al servicio del BIOS dadas las entradas en los registros 0C7C:010D INT 20 ; terminar el programa Al ejecutar obtenemos: La ventana de color verde con las letras magenta EJEMPLO 4 Dibuja cuadros concntricos -A 100 0C7C:0100 MOV AX,0600 ;funcin limpiar pantalla 0C7C:0103 MOV BH,E0 ;atributos fondo Amarillo, letras negras 0C7C:0105 MOV CX,0000 ;fila 00 columna 00 0C7C:0108 MOV DX,184F ;fila 18 columna 4F (esquina inferior derecha) 0C7C:010B INT 10 ;interrupcin del BIOS 0C7C:010D MOV AH,01 ;introducir caracter (espera tecla ENTER para continuar) 0C7C:010F INT 21 ;interrupcin del DOS 0C7C:0111 MOV AX,0600 ;funcin limpiar pantalla 0C7C:0114 MOV BH,00 ;fondo negro 0C7C:0116 MOV CX,0404 ;coordenadas de la esquina superior izquierda del cuadro interno 0C7C:0119 MOV DX,144A ;coordenadas de la esquina inferior derecha del cuadro interno 0C7C:011C INT 10 ;interrupcin del BIOS 0C7C:011E MOV AH,01 ;introducir caracter (espera tecla ENTER para continuar) 0C7C:0120 INT 21 ;interrupcin del DOS 0C7C:0122 MOV AX,0600 ;funcin limpiar pantalla 0C7C:0125 MOV BH,E0 ;atributos fondo Amarillo, letras negras 0C7C:0127 MOV CX,0808 ;fila 08 columna 08 esquina sup.izq del cuadro central 0C7C:012A MOV DX,1047 ;fila 10 columna 47 esquina inf.der. del cuadro central 0C7C:012D INT 10 ;llamada al servicio del BIOS dadas las entradas en los registros 0C7C:012F INT 20 ;terminar el programa EJEMPLO 5 Barra de colores -A 0C7C:0100;primera barra amarillo 0C7C:0100 MOV AX,0600 0C7C:0103 MOV BH,E0 0C7C:0105 MOV CX,0000 0C7C:0108 MOV DX,1804 0C7C:010B INT 10 0C7C:010D;espera tecla 0C7C:010D MOV AH,01 0C7C:010F INT 21 0C7C:0111;prox. color 0C7C:0111 MOV AX,0600 0C7C:0114 SUB BH,10 0C7C:0117;prox. barra 0C7C:0117 ADD CX,0004 0C7C:011A ADD DX,0004 0C7C:011D INT 10 0C7C:011F CMP DX,184F ;compara si llego a la ultima fila 0C7C:0122 JBE 010D ;salta a la direccin 010D para esperar tecla y seguir la secuencia 0C7C:0124 INT 20 ;terminar el programa ;cada vez que se pulse una tecla, realice una franja con el color

EJEMPLO 6 Realizar un algoritmo que calcule el factorial de un numero introducido por teclado, definido a travs de una rutina n! = n*(n-1)!

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

1) Algoritmo para el calculo de n! Esperar numero por teclado FACTORIAL (Probar n=0, calcular factorial de n) Si n=0 n!=1 Sino aux=(n-1) n!=n*aux Ir a Factorial 2) Diagrama de Flujo del programa Factorial AH=01 INT 21
Leer teclado

MOV AH,00 SUB AL,30 MOV BL,AL

Acondicionar numero n

FACTORIAL DE CERO

BL = 0
FACTORIAL DE N si

MOV AX,01

BL1
no

DEC BL

FIN

MUL BX

3) PROGRAMA EN ASSEMBLER factorial de un numero (0-8) introducido por teclado 0CB2:0100 B401 MOV AH,01 ;leer teclado 0CB2:0102 CD21 INT 21 ;servicio del BIOS 0CB2:0104 B400 MOV AH,00 ;borra registro alto del acumulador 0CB2:0106 2C30 SUB AL,30 ;preparar nmero a formato binario 0CB2:0108 88C3 MOV BL,AL ;guardar en un registro auxiliar 0CB2:010A 80FB00 CMP BL,00 ;si n = 0 0CB2:010D 740F JZ 011E ;salta a factorial de cero 0CB2:010F 80FB01 CMP BL,01 ;mientras n>1 0CB2:0112 7606 JBE 011A ;si es igual a uno se detiene 0CB2:0114 FECB DEC BL ;aux=n-1 0CB2:0116 F7E3 MUL BX ;AX=AX*BX n!=n*(n-1)! 0CB2:0118 E2F5 LOOP 010F ;llama la rutina factorial JUMP*** 0CB2:011A B100 MOV CL,00 ;limpia el registro contador (opcional) 0CB2:011C CD20 INT 20 ;terminar el programa fin 0CB2:011E B80100 MOV AX,0001 ; factorial de cero 0!=1 0CB2:0121 EBF9 JMP 011C ;salta a fin 4) EJECUCIN DEL PROGRAMA CON EL DEBUG

(A travs del comando -P se puede observar el contenido de los registros por pasos)

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

-p (se coloca AH=01 para llamar la interrupcin 21) AX=0100 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0102 NV UP EI PL NZ NA PO NC 0CB2:0102 CD21 INT 21 -p (espera el numero por teclado 7!) 7 AX=0137 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0104 NV UP EI PL NZ NA PO NC 0CB2:0104 B400 MOV AH,00 -p (el numero es recibido en AL como caracter ASCII 37) AX=0037 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0106 NV UP EI PL NZ NA PO NC 0CB2:0106 2C30 SUB AL,30 -p (lo hemos convertido en decimal -30) AX=0007 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0108 NV UP EI PL NZ NA PO NC 0CB2:0108 88C3 MOV BL,AL -p (se ha guardado en BL el contenido de AL) AX=0007 BX=0007 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=010A NV UP EI PL NZ NA PO NC 0CB2:010A 80FB00 CMP BL,00 -p (compara BL con cero) AX=0007 BX=0007 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=010D NV UP EI PL NZ NA PO NC 0CB2:010D 740F JZ 011E -p (chequeo si el numero es cero) AX=0007 BX=0007 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=010A NV UP EI PL NZ NA PO NC 0CB2:010F 80FB01 CMP BL,01 -p (compara BL con uno) AX=0007 BX=0007 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0112 NV UP EI PL NZ NA PE NC 0CB2:0112 7606 JBE 011A -p (mientras sea mayor realiza el procedimiento) AX=0007 BX=0007 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=010F NV UP EI PL NZ NA PE NC 0CB2:0114 FECB DEC BL -p (el registro BL ha sido decrementado) AX=0007 BX=0006 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0111 NV UP EI PL NZ NA PE NC 0CB2:0116 F7E3 MUL BX -p (multiplica AX= AX*BX AX=07*06=2AH=42D) AX=002A BX=0006 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0113 NV UP EI PL NZ NA PE NC 0CB2:0118 E2F5 LOOP 010F -p (por usar el comando p se ve el procedimiento lazo, repite mientras BX>1) AX=13B0 BX=0001 CX=FFFA DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0115 NV UP EI PL ZR NA PE NC

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

0CB2:011A B100

MOV

CL,00

-p (multiplica por BX=01 la ultima vez AX=07*06*05*04*03*02*01=13B0H=5040D) AX=13B0 BX=0001 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=0CB2 ES=0CB2 SS=0CB2 CS=0CB2 IP=0117 NV UP EI PL ZR NA PE NC 0CB2:011C CD20 INT 20 -p El programa ha terminado de forma normal Solo se han empleado de forma directa los registros AX y BX, el apuntador de la pila no ha sido modificado Por qu cambio el registro contador CX=0000 CX=FFFA, despus de la ejecucin del lazo? Porque este registro se emplea para contar las veces que el programa paso por el lazo como n=7, el paso por el lazo n-1=6 veces, por lo tanto CX=0006, ac se encuentra expresado en forma negativa, cada vez que pasa por el lazo se decrementa CX. Observamos el registro IP apuntador de instrucciones, es el encargado de llevar la secuencia de la direccin de la instruccin para su ejecucin

A la hora de programar un cdigo muy largo, se puede emplear un diseo modular, establecer los procedimientos y usar las funciones de control de flujo del programa para manejar la secuencia de instrucciones.

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

Entre los saltos y manejo de subrutinas tenemos: JE JZ salta si es igual, se emplea para seleccin chequeamos un selector y el programa realizar una secuencia especifica JBE salta si es menor o igual, es til para comprobar condiciones LOOP es la ejecucin de un lazo o bucle, esta funcin decrementa automticamente el contador, el cual se debe iniciar con le numero de veces que se requiere repetir el lazo CX, al llegar a cero continua con la instruccin siguiente XXXX:0XXX MOV CX, 07; numero de veces que se ejecutar el lazo XXXX:010A INST 1 XXXX:0XXX INST 2 XXXX:0XXX INST 3 DEC CX XXXX:0XXX INST 4 XXXX:0XXX LOOP 010A XXXX:0XXX INST siguiente CALL consiste en la llamada a un procedimiento, la direccin de la prxima instruccin en el programa principal es guardado en la pila (STACK), una vez que culmina el procedimiento se debe colocar la instruccin retornar RET, toma la direccin almacenada en el stack y retorna al cdigo que la invoco. XXXX:0XXX INST 1 XXXX:0XXX INST 2 XXXX:0XXX INST 3 XXXX:0XXX INST 4 XXXX:0XXX CALL 015F XXXX:0111 INST siguiente . . . . . . XXXX:015F INST 1 XXXX:0XXX INST 2 XXXX:0XXX INST 3 XXXX:0XXX INST 4 XXXX:0XXX RET

EJEMPLO 7 Realizar las subrutinas para una calculadora bsica, el operador (+, -, *, / ) ser introducido por teclado y recibido en AL, de acuerdo al valor de AL, se ejecutar un

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

procedimiento suma, resta, multiplicacin, divisin con las instrucciones aritmticas de ASSEMBLER y las instrucciones de saltos. En pantalla se presentar la siguiente secuencia: INTRODUCIR OPERANDOS:23,18 SELECCIONAR OPERACIN:RESULTADO=05 DIAGRAMA DE FLUJO DEL PROGRAMA CALCULADORA BSICA

SOLICITAR OPERACION CAPTURAR OPERANDO1 CAPTURAR OPERADOR CAPTURAR OPERANDO2

AL = + SUMAR AL = RESTAR AL = * PROD AL = / DIV ERROR

MOSTRAR RESULTADO

FIN NOTA: Cada subrutina la realizaremos de forma independiente los saltos estarn dados por etiquetas, en el ensamblado se debe considerar las respectivas direcciones de las etiquetas empleadas en al etapa de diseo, ya que DEBUG no maneja referencias cruzadas y se debe establecer las direcciones del programa en ASSEMBLER, se debe cuidar el contenido de los registros en cada rutina, a fin de no alterar la informacin de un registro que se requiera utilizar en una prxima etapa, ejemplo AX. A partir del diagrama de flujo podemos disear cada subrutinas, para finalmente ensamblar el programa completo de clculos bsicos:

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

OPERACIONES ARITMETICAS

0C7C:0100 B409 MOV AH,09 0C7C:0102 BA0003 MOV DX,0300 0C7C:0105 CD21 INT 21 0C7C:0107 E87601 CALL 0280; CAPTURA OPERANDO 0C7C:010A 50 PUSH AX 0C7C:0280 0C7C:0282 0C7C:010B B401 MOV AH,01 0C7C:0284 0C7C:010D CD21 INT 21 0C7C:0286 0C7C:0288 0C7C:010F 88C2 MOV DL,AL; operador 0C7C:028A 0C7C:0111 E86C01 CALL 0280; 0C7C:028D 0C7C:0114 89C3 MOV BX,AX 0CB2:0150 0CB2:0152 0C7C:0116 58 POP AX 0CB2:0154 0C7C:0117 80FA2B CMP DL,2B 0CB2:0156 0CB2:0158 0C7C:011A 7434 JZ 0150 ; SUMA 0CB2:0159 0CB2:015B 0C7C:011C 80FA2A CMP DL,2A 0CB2:015D 0C7C:011F 744F JZ 0173 ;RESTA 0CB2:015F 0CB2:0161 0C7C:0121 80FA2D CMP DL,2D 0CB2:0163 0CB2:0164 0C7C:0124 745A JZ 0190 ; MULT 0CB2:0166 0CB2:0168 0C7C:0126 80FA2F CMP DL,2F 0CB2:016C 0C7C:0129 7474 JZ 01A7 ;DIV 0CB2:0170 0C7C:012B B402 MOV AH,02 0CB2:0173 0C7C:012D B23D MOV DL,3D;igual 0CB2:0175 0C7C:012F CD21 INT 21 0CB2:0177 0CB2:0179 0C7C:0131 88CA MOV DL,CL; sign-carry 0CB2:017B 0CB2:017D 0C7C:0133 CD21 INT 21 0CB2:017F 0C7C:0135 88FA MOV DL,BH; result DMS 0CB2:0181 0CB2:0183 0C7C:0137 CD21 INT 21 0CB2:0184 0CB2:0186 0C7C:0139 88DA MOV DL,BL; result DLS 0CB2:018A 0CB2:018E 0C7C:013B CD21 INT 21 0C7C:013D CD20 INT 20 0CB2:0190
0CB2:0192 0CB2:0194 0CB2:0196 0CB2:0198 0CB2:019C 0CB2:01A0 0CB2:01A7 0CB2:01A9 0CB2:01AB 0CB2:01AD 0CB2:01AF 0CB2:01B2

B401 CD21 88C7 CD21 88FC 2D3030 C3

MOV AH,01 INT 21 MOV BH,AL INT 21 MOV AH,BH SUB AX,3030 RET
MOV CL,00 ADD AX,BX CMP AL,0A JB 015B DAA INC AH MOV BL,AL MOV AL,AH CMP AL,0A JB 0166 DAA MOV CL,31 MOV BH,AL AND BX,0F0F OR BX,3030 JMP 012B MOV CL,00 CMP AX,BX JG 017D XCHG AX,BX MOV CL,2D SUB AX,BX CMP AL,0A JB 0184 DAS MOV BX,AX AND BX,0F0F OR BX,3030 JMP 012B MOV CL,00 MUL BL AAM MOV BX,AX AND BX,0F0F OR BX,3030 JMP 012B MOV CL,00 AAD DIV BL MOV BL,AL OR BL,30 JMP 012B

B100 01D8 3C0A 7203 27 FEC4 88C3 88E0 3C0A 7203 27 B131 88C7 81E30F0F 81CB3030 EBB9 B100 39D8 7F04 87C3 B12D 29D8 3C0A 7201 2F 89C3 81E30F0F 81CB3030 EB9B B100 F6E3 D40A 89C3 81E30F0F 81CB3030 EB89 B100 D50A F6F3 88C3 80CB30 E976FF

EJERCICIOS PROPUESTOS

LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ

1) Emplear las funciones lgicas desplazamiento y rotacin SHR, SHL, ROR, ROL de ASSEMBLER y muestre un caracter en pantalla representando la funcin lgica. 2) Disee un programa que presente por pantalla una grfica, (para definir las posiciones de la pantalla, tenga presente la divisin de 25 filas-80 columnas que se expresa en formato hexadecimal), colocar la opcin pulsar una tecla para desplazar la grafica (una animacin de franjas, marcos, tringulos, etc.) 3) Realizar un arreglo al ejemplo 2, para que muestre el smbolo negativo en el caso de que el minuendo sea menor que el sustraendo, chequeando la condicin a travs del registro status. 4) Disear un programa que realice el calculo de una operacin donde el operador sea introducido por teclado, el caracter (+, -, *, / ) ser recibido en AL, de acuerdo al valor de AL, se ejecutar un procedimiento suma, resta, multiplicacin, divisin con las instrucciones aritmticas de ASSEMBLER y las instrucciones de saltos [Barry B. Brey, ejemplo 6.35, pg. 229] 5) Realizar un programa para ordenar elementos de un vector, empleando las funciones de manejo de pila PUSH, POP en ASSEMBLER [Barry B. Brey, ejemplo 6.36, pg. 233]