UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Profesorado en Tecnología Electrónica PROCESADORES I ENSAMBLADOR Y SIMULADOR EL LENGUAJE ENSAMBLADOR Programar un uP directamente en lenguaje de máquina resulta, como ya se ha visto, una tarea difícil y propensa al error. El escalón inmediatamente superior lo ocupa el lenguaje assembler, que en esencia es semejante al lenguaje de máquina pero con una serie de mejoras que lo hacen más práctico. El assembler emplea básicamente las mismas instrucciones del uP, solo que el programador no emplea su correspondencia en hexadecimal, sino los nemotécnicos de dichas instrucciones, lo cual resulta más cómodo de manejar ya que se parece un poco al lenguaje humano al que estamos acostumbrados. También está concebido para no tener que recurrir al hexadecimal, o al menos hacerlo lo menos posible por ejemplo en el caso de ingresar un dato o una dirección efectiva. Además de las instrucciones del uP se agregan otras que son propias del lenguaje. Estas nuevas instrucciones conocidas como pseudoinstrucciones o directivas del ensamblador y sirven por ejemplo para indicar la dirección donde ha de ubicarse el programa, el final del mismo, para reservar espacios de memoria, etc. En este lenguaje se usan extensamente las etiquetas (o labels) tanto para efectuar los saltos o bifurcaciones típicas de todo programa como para señalar una dirección en la memoria de datos. También es posible asignar a una etiqueta un valor constante al principio del programa. EJEMPLO DE UN PROGRAMA EN ASSEMBLER (para el uP 8085) ; Calcula la suma de los numeros del ; 1 al 17. El resultado queda en A: .org h'2000 mvi b,17 ; inicialmente B := 17 xra a ; hace A := 0 loop: add b ; A := A+B dcr b jnz loop ; salta si B no es cero hlt .end Cuando escribimos un programa en assembler lo organizamos en una serie de columnas que nos permiten hacer mas clara su lectura y corrección (para esto nos valemos de la tecla TAB): Columna 1: reservada para etiquetas que señalan por ejemplo una dirección o una subrutina. Columna 2: instrucciones o pseudoinstrucciones. Columna 3: parámetros de instrucción (cuando se requieran). Columna 4: opcionalmente y precedido siempre de ‘;’ (punto y coma) puede ir un comentario Una vez escrito el programa es almacenado normalmente en disco como un archivo de texto (con extensión *.ASM). A este archivo lo denominamos código fuente. El paso siguiente consiste en llevar el código fuente al ensamblador que es la herramienta que lo traducirá al código de maquina. En el ejemplo aparece la etiqueta ‘loop’ que señala a la instrucción ‘add b’. Es el ensamblador el encargado de determinar su valor en el proceso de ensamblado y en función de la dirección de origen de nuestro programa, determinada por la directiva ‘.org’ (en este caso ‘loop’ tomará el valor h’2003). Todo lo escrito después del carácter ‘;’ (punto y coma) es ignorado por el ensamblador, lo cual nos permite incluir comentarios. Cuando programamos en assembler es aconsejable incluir todos los comentarios que creamos necesarios para poder recordar o clarificar el funcionamiento del programa. UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Profesorado en Tecnología Electrónica EL ESQUEMA DE TRABAJO Editor de texto Código fuente (Ej. EDIT) (archivo PEPE.ASM) Ensamblador (A85) Código de máquina en hexa (archivo PEPE.OBJ) Reporte del ensamblador (archivo PEPE.LST) A partir del archivo original (PEPE.ASM) o código fuente que uno escribió, después del proceso de ensamblado se generan dos nuevos archivos: El primero (PEPE.LST) es un archivo de texto donde el ensamblador genera, a modo de reporte, un listado de cada instrucción del código fuente acompañada de la dirección y el código de máquina que le corresponde. También contiene los valores ya resueltos de las etiquetas usadas y una indicación de los errores si los hubiera. El archivo (PEPE.OBJ) es el resultado de la traducción de nuestro programa al código de máquina y consiste en una serie de números expresados en hexadecimal. Este archivo podría ser importado por una aplicación que lo grabe en una memoria EPROM por ejemplo (haciendo uso de un dispositivo grabador), o podríamos cargarlo en otra aplicación que sea capaz de simular la ejecución que haría un P 8085, como veremos mas adelante. SIMULADOR DEL 8085 Se trata de una aplicación que es capaz de simular todas las funciones del P 8085 en combinación con bloques de memoria ROM o RAM (e incluso con algunos periféricos como el ppi 8155). He aquí algunas de las características del simulador: Muestra en pantalla en todo momento, el contenido de los registros, de partes de la memoria y las instrucciones que están siendo ejecutadas. Permite la ejecución de un programa de forma continua, paso a paso, o con el uso de breakpoints. Permite modificar en cada paso el contenido de cualquier registro o memoria. Se ejecuta escribiendo AVSIM85 en la línea de comandos. Algunos de los comandos de teclado mas usados son: ESC: mueve el cursor de la parte inferior o menú a la parte superior donde se encuentran todos los registros, flags, memoria, etc. FLECHAS: permiten recorrer las distintas opciones del menú o los distintos campos hexadecimales según donde se encuentre el cursor. ENTER: selecciona una opción del menú. CTRL‐C: vuelve al menú principal. F10: simulación paso a paso. F9: retrocede una instrucción. F1: ejecuta el programa de forma continua Para cargar un programa debemos: ir al menú opción Load y luego Program. Ingresar el nombre del programa incluyendo la extensión (ejemplo EJE1.OBJ). Reset del 8085: ir al menú opción Reset y luego Cpu. Para ver una porción de memoria: ir al menú opción Dump, seleccionar el área de pantalla 1 o 2, opción Absolute e ingresar la dirección inicial (por ejemplo 1000h). UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Profesorado en Tecnología Electrónica PRÁCTICO 4: ENSAMBLADOR Y SIMULADOR OBJETIVO: Conocer el uso de los programas ensamblador y simulador. Realizar ejercicios de programación con el conjunto completo de instrucciones. Ejercitar los distintos modos de direccionamiento así como también el uso de los registros generales, registros pares y flags. Realizar retardos en tiempo real considerando la relación entre las instrucciones y los ciclos de reloj. Hacer uso de los terminales SID y SOD y de las interrupciones. ELEMENTOS NECESARIOS: - Contar con una tabla de instrucciones del uP 8085 y conocer los distintos registros de uso general y específico. - PC con editor de textos y programas A85 (ensamblador) y AVSIM85 (simulador). EJERCICIOS (Los ejercicios marcados con ** se deben simular) **1) Realizar un programa en assembler del 8085 que realice la suma de dos números de 8 bits que están en las direcciones 20FFh y 20FEh. El resultado, si es distinto de cero, debe quedar almacenado en la dirección F000h, en caso de ser igual a cero poner en la dirección F001h el valor FFh: a) Utilizar el comando EDIT para crear y editar el programa y guardarlo en el disco con el nombre EJE1.ASM b) Ensamblar el programa con el comando A85. c) Corregir los errores de sintaxis si los hubiera analizando el archivo de salida EJE1.LST d) Repetir los puntos a), b) y c) pero ubicando el programa a partir de la dirección 1000h. **2) Realizar un programa para sumar los números impares desde 1 a 20. 3) Sumar 10 números que se toman de un bloque de la RAM a partir de la dirección 2000h y colocar el byte menos significativo del resultado en la dirección 5000h y el byte mas significativo en la dirección 5001h de la RAM. **4) Realizar un programa para el 8085 que sume los primeros 4 números impares (de 8 bits) que se encuentran en un bloque de 50 bytes de la memoria RAM a partir de la dirección 3000h. El resultado debe quedar en el registro B. 5) Si el valor actual de los registros del 8085 es el siguiente: A=02h; B=57h; C=7Eh; D=35h; E=F1h; H=02h; L=20h y la memoria RAM tiene los siguientes valores: dir 2002h: A1h dir 0220h: 1Ch ¿Como quedarán los valores indicados luego de la instrucción? MOV M,A ¿Que estado tomará el pin IO/M del 8085 durante cada ciclo de máquina de la instrucción?. 6) Realizar un programa que indique cuantos números impares o menores que 7Fh o iguales a 07h hay en la memoria RAM desde la dirección 1F00h hasta la 1FFFh. El valor obtenido se debe guardar en la dirección 2000h. NOTA: Se supone que los números almacenados en memoria son positivos y de 8 bits. **7) Realizar un programa para el 8085 que indique cuantos bits de los valores almacenados desde la dirección 2000h a la 2003h inclusive son iguales a uno ( en el reg B ) y cuantos son iguales a cero (en el reg C). NOTA: Se supone que los números almacenados en memoria son de 8 bits. Ejercicios con retardos, terminales SID y SOD: 8) Realizar un programa para el 8085 que incremente el registro B cada segundo, suponer que el cristal usado por el µP es de: a) 2 Mhz b) 6 Mhz NOTA: Utilizar una subrutina para realizar el retardo, en ambos casos. UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Profesorado en Tecnología Electrónica 9) Realizar un programa que envíe por la pata SOD del 8085 una señal cuadrada de una frecuencia de: a) 1 seg b) 1.5 seg NOTA: El cristal es de 1 Mhz. Utilizar una subrutina para realizar el retardo, en ambos casos. 10) Realizar un programa que incremente el registro B en cada flanco ascendente de la pata SID y que ponga este registro en cero cuando la entrada SID se mantenga en alto por un tiempo mayor a 100 ciclos de reloj. Ejercicios con interrupciones: 11) Realizar un programa para el 8085 con un cristal de 2 Mhz que indique la presencia de un número máximo de personas dentro de un local. Cuando este número es igual 10, se debe poner en el pin SOD del µP el valor lógico alto, si el numero es menor de 10 el pin SOD debe tener un valor lógico bajo. Se dispone de dos señales, una asociada a la entrada de personas y otra a la salida, cada una de ellas envía un pulso de 1 ms cuando se activa. Implementar lo solicitado usando las interrupciones del 8085. 12) Realizar un programa que incremente el registro B cada vez que llegue una interrupción RST 7.5 y que ponga este registro en cero cada vez que llega una interrupción RST 5.5. EJERCICIOS COMPLEMENTARIOS 1) Se tienen 80 bytes de datos en la memoria RAM a partir de la dirección 5000h. Realizar un programa que indique en el registro B cuantos de ellos son divisibles por 2 y en el registro C cuantos son divisibles por 4. 2) Realizar un programa para el 8085 que sume los números impares menores que 10h y mayores que 02h, el resultado se debe enviarse al puerto de salida en la dirección 50h (no tener en cuenta si hay overflow). Los datos a considerar ingresan en forma sucesiva por el puerto de la dirección 60h y finalizan cuando uno de ellos toma el valor FFh. 3) Realizar un programa que copie la región de memoria apuntada por el par HL y de extensión indicada por B, a la dirección de RAM apuntada por el par DE. 4) Realizar un programa en assembler que sume 3 números de 16 bits sin signo, los datos se encuentran a partir de la dirección 3000h de la memoria RAM, organizados de la siguiente manera: 3000h byte bajo DATO1, 3001h byte alto DATO1 3002h byte bajo DATO2, 3003h byte alto DATO2 3004h byte bajo DATO3, 3005h byte alto DATO3 Colocar el resultado en la memoria RAM, a partir de la dirección 3006h, el byte menos significativo. Tener en cuenta que el resultado puede tener mas de 16 bits, en cuyo caso habrá que darle el valor correcto a la dirección 3008h. 5) Si el valor actual de los registros del 8085 es el siguiente: A=03h; B=E7h; C=3Eh; D=2Fh; E=00h; H=03h; L=30h y la memoria RAM tiene los siguientes valores: dir 3003h: A0h dir 0330h: 0Ch ¿Como quedarán los valores indicados luego de la instrucción? ORA M ¿Que estado tomará el pin IO/M del 8085 durante cada ciclo de máquina de la instrucción? 6) Se tienen 10 datos de 8 bits sin signo a partir de la dirección 2000h de la memoria RAM. Encontrar la suma de todos aquellos no comprendidos entre 10h y A4h inclusive. (dato < 10h ó A4h < dato) Colocar el resultado en el registro B. UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Profesorado en Tecnología Electrónica 7) Realizar un programa en assembler que ordene de mayor a menor los datos de 8 bits que están en la memoria desde la dirección 1F00h hasta la 1F1Fh los valores ordenados deben ubicarse en la memoria RAM a partir de la dirección 2000h. 8) Realizar un programa para el 8085 que genere por la pata SOD una onda cuadrada cuya frecuencia en kilohertz está determinada por el valor almacenado en la dirección 1234h de la memoria RAM, usando un cristal de 2 Mhz NOTA: Utilizar una subrutina para realizar el retardo 9) Realizar un programa para el 8085 que multiplique el contenido del registro A con el del registro L y deje el resultado en el par HL. Considere todos los datos sin signo. NOTA: Utilizar una subrutina para realizar la multiplicación de los registros. 10) La pata SID del 8085 se encuentra conectada a un generador de onda cuadrada. Realizar un programa que mida el periodo de esta onda. Decir entre que frecuencias debe estar comprendida la onda de entrada para que la medición pueda ser realizada. Suponer un cristal de 1 Mhz. 11) Realizar un programa para el uP 8085 utilizando interrupciones, que muestre en el registro BC la cantidad de microsegundos que estuvo en alto una entrada conectada al pin INT5.5. Si la señal permaneció en alto más de 65535 microsegundos se debe poner el pin SOD en alto y en bajo en caso contrario. Se supone que el uP trabaja con un cristal de 2 Mhz.