Manual Debug
Short Description
Download Manual Debug...
Description
LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ
MANEJO DEL AMBIENTE DE DESARROLLO DEL LENGUAJE ENSAMBLADOR
INTRODUCCIÓN Para la programación 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 cuál 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 través de la herramienta DEBUG
Al abrir la herramienta DEBUG, se presenta un guión para introducir el comando que se desea ejecutar, comenzamos por revisar la ayuda que ofrece DEBUG (-?) descripción de los comandos y los argumentos que deben suministrársele 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 ejecución de un programa [Stalling, Organización y Arquitectura de Computadores], como es el caso del conjunto de instrucciones, numero de bits usados para representar varios tipos de datos. La organización 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 están presentes para el diseño 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 ejecución 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 código 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 instrucción F Registro de banderas
REGISTRO DE STATUS Desbordamiento
NV = no hay OV = sí lo hay Dirección
UP = hacia adelante; DN = hacia atrás; Interrupción
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 próxima línea, se le introduzca otro caracter, este programa podrá ser tomado como base para
LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ
cualquier aplicación que requiera parámetros definidos por el usuario a través del teclado, manteniendo el orden de introducción de datos. 1. Definir cadena de caracteres, para ello emplearemos el comando –E dir, el cual permite introducir información a partir de la dirección especificada E , ejemplo introduciremos un string en la dirección 200 -E 200 'GRUPO#$' Para confirmar que la cadena de caracteres se encuentra allí podemos utilizar el comando display –D 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 dirección 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 próxima cadena de caracteres: -E 220 'SECCIÓN:$' Mostrar desde la dirección 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 tamaño será cortada por el siguiente string. En caso de un string de tamaño desconocido se recomienda dejar suficiente espacio para el próximo string a fin de no sobrescribir en cierta dirección y dañar la cadena de caracteres. Para esta rutina requerimos mostrar información por pantalla y recibir datos por teclado, esto lo podemos realizar empleando una interrupción es una operación que invoca la ejecución de una rutina específica que suspende la ejecución 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 ejecución de la interrupción y son restablecidos los registros salvados. Existen dos razones para ejecutar una interrupción: (1) intencionalmente como petición para la entrada o salida de datos de un dispositivo, y (2) un error serio y no intencional, como sobre-flujo o división 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 dirección de inicio del string, el cual terminará al detectar el caracter $ (ASCII 24) y finalmente la interrupción 21, que maneja E/S. [Tabla de interrupciones Barry B. Brey APENDICE A- Pág.693]
2. Ensamblar el programa a través del comando –A (con lo cual colocamos la dirección de inicio del programa, cada vez que se inicia un programa el DEBUG ofrece la dirección 0100 por defecto); comenzamos a introducir las instrucciones del programa
LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ
empleando los mnemónicos definidos por la sintaxis del lenguaje ensamblador, en cada dirección definimos la instrucción que será asignada a cada localidad del segmento de código, en cada línea se escribirá la instrucción y sus operando (según el tipo de instrucción), 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 dirección de salto en el programa, para la documentación del programa se puede colocar (;) después de la instrucción y se comentan, estos comentarios no ocupan memoria de programa, y son omitidas al desensamblar el programa, se recomiendan en el diseño 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 ;dirección de la cadena de caracteres ‘GRUPO#’ 0C7C:0105 INT 21 ;interrupción para ejecutar la función 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 ;interrupción para ejecutar la función DOS 0C7C:010B ;luego de pulsar la tecla, continua la ejecución del programa 0C7C:010B MOV AH,09 ;solicitud 09H de las funciones del DOS mostrar cadena de caracteres 0C7C:010D MOV DX,210 ;dirección de la cadena de caracteres para saltar a la siguiente línea 0C7C:0110 INT 21 ;interrupción para ejecutar la función DOS 0C7C:0112 ;este string contiene el caracter 0A LF (Line Feed) va al principio de la sig. línea 0C7C:0112 MOV DX,220 ;dirección de la cadena de caracteres ‘SECCIÓN:’ 0C7C:0115 INT 21 ;interrupción para ejecutar la función DOS 0C7C:0117 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:0119 INT 21 ;interrupción para ejecutar la función DOS 0C7C:011B INT 20 ;interrupción para finalizar el programa 3. Guardar Programa especificando nombre, tamaño y usando el comando escribir. El programa lo llamaremos string con la extensión .com -N STRING.COM A través del comando –R podemos consultar y asignar valores a los registros, de este modo asignaremos el tamaño del programa haciendo uso de los registros BX y CX, siendo BX=00 le asignamos al registro contador CX el tamaño 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 , después 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 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 sección, colocamos la letra
5. Ejecutar el programa por etapas se emplea el comando P, y para observar el contenido de los registros en cada instrucción 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 dirección en el segmento de código, supongamos que se requiere cambiar o insertar una instrucción en un punto especifico del programa, por la naturaleza secuencial de las instrucciones debe insertarse en una dirección de memoria especifica, así que se deberá sobrescribir o mover el segmento de código posterior a la instrucción que se desea insertar y luego ensamblar las líneas de las instrucciones faltantes, de este modo se podrá manejar el contenido de la memoria de programa para realizar los cambios necesarios) 6. Modificar líneas de instrucción, 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 instrucción, ensamblamos en la dirección donde se encuentra la instrucción errónea y la modificamos -A 0112 0CB2:0112 ;instrucción corregida 0CB2:0115 7. Mover un bloque de instrucciones, Copia desde la dirección1 hasta la dirección2 y mueve el bloque a la dirección nueva -M dir.desde,dir.hasta dir.nueva -M 0107 0110,0112 Ahora al desensamblar se tendrá a partir de la dirección 0112 el contenido de las direcciones desde 0107 hasta 0110
(a) Nótese que la instrucción iniciada en la dirección 0110 no ha sido movida completa, solo la parte de la instrucción que ocupa el Byte 0110, el contenido del Byte 0111 no esta incluido. (b) Una vez realizada la edición de un programa corrido y funcionando debe ser guardado, ya que se cargara la ultima versión guardada.
Hasta ahora, el programa solo muestra la cadena de caracteres programada y permite introducir un caracter por teclado mostrándolo 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 función 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 ;dirección de la cadena de caracteres 0C7C:0105 INT 21 ;interrupción para ejecutar la función DOS 0C7C:0107 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:0109 INT 21 ;interrupción para ejecutar la función 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 ;dirección de la cadena de caracteres 0C7C:0112 INT 21 ;interrupción para ejecutar la función DOS 0C7C:0114 MOV DX,0230 ;dirección de la cadena de caracteres 0C7C:0117 INT 21 ;interrupción para ejecutar la función DOS 0C7C:0119 MOV AH,01 ;solicitud 01H de las funciones del DOS leer el teclado 0C7C:011B INT 21 ;interrupción para ejecutar la función DOS 0C7C:011D MOV CL,AL ;AL= caracter ASCII tecleado se mueve a CL para no perderlo 0C7C:011F SUB BL,CL ; resta aritmética del contenido de los registros BL=BL-CL 0C7C:0121 AAS ;prepara el numero para convertirlo luego a código 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 ;dirección de la cadena de caracteres 0C7C:012A INT 21 ;interrupción para ejecutar la función DOS 0C7C:012C MOV DX,0250 ;dirección de la cadena de caracteres 0C7C:012F INT 21 ;interrupción para ejecutar la función 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 ;interrupción para ejecutar la función DOS 0C7C:0137 INT 20 ;interrupción 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 Nótese que los string están expresados de forma genérica 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 función que podemos emplear además 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 función 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 número mayor (fila y columna final) Requerimientos: 1. 2. 3. 4. 5.
mover mover mover mover mover
al registro AH la función 06h al registro AL el valor 00H para indicar pantalla completa en BH el número de atributo en CX la fila y columna de inicio en DX la fila y columna finales
Ubicación en pantalla
Formato decimal Fila
Formato hexa
columna
Fila
columna
Esquina superior izquierda
00
00
00H
00H
Esquina superior derecha
00
79
00H
4FH
Centro
12
39/40
0CH
27H/28H
Ubicación en pantalla
Formato decimal Fila
Formato hexa
columna
Fila
columna
Esquina inferior izquierda
24
00
18H
00H
Esquina inferior derecha
24
79
18H
4FH
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 gráfico. 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 función 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 concéntricos -A 100 0C7C:0100 MOV AX,0600 ;función 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 ;interrupción del BIOS 0C7C:010D MOV AH,01 ;introducir caracter (espera tecla ENTER para continuar) 0C7C:010F INT 21 ;interrupción del DOS 0C7C:0111 MOV AX,0600 ;función 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 ;interrupción del BIOS 0C7C:011E MOV AH,01 ;introducir caracter (espera tecla ENTER para continuar) 0C7C:0120 INT 21 ;interrupción del DOS 0C7C:0122 MOV AX,0600 ;función 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 dirección 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 través 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 Leer teclado
AH=01 INT 21
MOV AH,00 SUB AL,30 MOV BL,AL
Acondicionar numero n
FACTORIAL DE CERO
MOV AX,01
BL = 0 FACTORIAL DE N si
BL≤1 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 número 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) EJECUCIÓN DEL PROGRAMA CON EL DEBUG
(A través 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 interrupción 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, después de la ejecución 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 dirección de la instrucción para su ejecución
A la hora de programar un código muy largo, se puede emplear un diseño 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 selección 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 ejecución de un lazo o bucle, esta función decrementa automáticamente 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 instrucción 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 dirección de la próxima instrucción en el programa principal es guardado en la pila (STACK), una vez que culmina el procedimiento se debe colocar la instrucción retornar RET, toma la dirección almacenada en el stack y retorna al código 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 básica, 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, multiplicación, división con las instrucciones aritméticas de ASSEMBLER y las instrucciones de saltos. En pantalla se presentará la siguiente secuencia: INTRODUCIR OPERANDOS:23,18 SELECCIONAR OPERACIÓN:RESULTADO=05 DIAGRAMA DE FLUJO DEL PROGRAMA CALCULADORA BÁSICA
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 estarán dados por etiquetas, en el ensamblado se debe considerar las respectivas direcciones de las etiquetas empleadas en al etapa de diseño, 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 información de un registro que se requiera utilizar en una próxima etapa, ejemplo AX. A partir del diagrama de flujo podemos diseñar cada subrutinas, para finalmente ensamblar el programa completo de cálculos básicos:
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
EJERCICIOS PROPUESTOS
B401 CD21 88C7 CD21 88FC 2D3030 C3
MOV AH,01 INT 21 MOV BH,AL INT 21 MOV AH,BH SUB AX,3030 RET
B100 01D8 3C0A 7203 27 FEC4 88C3 88E0 3C0A 7203 27 B131 88C7 81E30F0F 81CB3030 EBB9
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
B100 39D8 7F04 87C3 B12D 29D8 3C0A 7201 2F 89C3 81E30F0F 81CB3030 EB9B
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
0CB2:0192 0CB2:0194 0CB2:0196 0CB2:0198 0CB2:019C 0CB2:01A0
B100 F6E3 D40A 89C3 81E30F0F 81CB3030 EB89
0CB2:01A7 0CB2:01A9 0CB2:01AB 0CB2:01AD 0CB2:01AF 0CB2:01B2
B100 D50A F6F3 88C3 80CB30 E976FF
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
LABORATORIO DE MICROPROCESADORES PROF. CECILIA SANDOVAL RUIZ
1) Emplear las funciones lógicas desplazamiento y rotación SHR, SHL, ROR, ROL de ASSEMBLER y muestre un caracter en pantalla representando la función lógica. 2) Diseñe un programa que presente por pantalla una gráfica, (para definir las posiciones de la pantalla, tenga presente la división de 25 filas-80 columnas que se expresa en formato hexadecimal), colocar la opción pulsar una tecla para desplazar la grafica (una animación de franjas, marcos, triángulos, etc.) 3) Realizar un arreglo al ejemplo 2, para que muestre el símbolo negativo en el caso de que el minuendo sea menor que el sustraendo, chequeando la condición a través del registro status. 4) Diseñar un programa que realice el calculo de una operación 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, multiplicación, división con las instrucciones aritméticas de ASSEMBLER y las instrucciones de saltos [Barry B. Brey, ejemplo 6.35, pág. 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, pág. 233]
View more...
Comments