Ensamblador
Apéndice - Instrucciones importantes
Instrucciones de desplazamiento y rotación
En este tipo de operaciones, ya sean de tipo aritmético o lógico, el bit “perdido” se almacena en el bit C del registro de estado. Por tanto, tras realizar el desplazamiento, para saber si el bit perdido es un 0 ó un 1, bastará con evaluar dicho bit. Para ello se pueden usar las siguientes condiciones:
CS (Carry Set) - Es cierta si el bit C del registro de estado es 1
Práctica 3: Uso de interrupciones
Objetivo
Diseñar un programa que implemente un cronómetro visualizable a través del display de 7 segmentos cuya actualización se realice gracias a una interrupción de nivel 1 autoprogramada.
Implementación
Para poder usar el sistema de interrupciones en el simulador, lo primero que hay que hacer es capacitarlas. La capacitación de dichas interrupciones en el simulador se realiza de forma manual seleccionando la opción Enable Exception:
Práctica 2: Uso de subrutinas y simulación de operaciones de E/S
Objetivo
Diseñar un programa que, en función del estado de los dos interruptores situados más a la derecha, realice las siguientes operaciones:
S1 |
S0 |
Función |
0 |
0 |
Cuenta cíclica ascendente de 0 a 9 en intervalos de 1 seg |
0 |
1 |
Cuenta cíclica descendente en intervalos de 1 seg |
1 |
0 |
Rotación de un segmento del display en intervalos de 0,5 seg |
1 |
1 |
Fin de programa |
Práctica 1: Manejo de los periféricos
Objetivo
Diseñar un programa en ensamblador en el que al pulsar el switch situado más a la derecha se muestre en el display de 8 segmentos los números del 7 al 0. Al volver a pulsar el switch se iluminará, en todos y cada uno de los displays, el segmento central.
El resultado que se deberá observar en la ventana de hardware del simulador será el de las imagenes:
El funcionamiento del display de 7 segmentos es muy sencillo, los valores que se asignaran a cada display de la maqueta serán en función de lo que se quiera mostrar en el display y en las direcciones de memoria correspondientes (en la captura anterior se puede observar que comienzan en la E00000) mostradas en la tabla a continuación.
DISPLAY |
DIRECCIÓN |
1 |
E000000 |
3 |
E000004 |
4 |
E000006 |
5 |
E000008 |
6 |
E00000A |
7 |
E00000C |
8 |
E00000E |
Para el desarrollo de la práctica es muy recomendable definir como variable de programa un vector denominado tabla que contenga la codificación de los dígitos del 0 al 9.
tabla dc.b $3F,$06,$5B,$4F,$66, $6D,$7D,$27,$7F,$67 |
Nota sobre la implementación: Para poder visualizar y gestionar la ventana hardware es necesario generar una excepción (trap) que lo permita. El código que permite hacer estas tareas es:
Trap para obtener la dirección hardware y visualización de la ventana hardware move.b #32,d0 MOVE.B #0,D1 TRAP #15 Almacena la dirección del display en D1 move.b #01,d1 trap #15 Almacena la dirección de los leds en D1 move.b #02,d1 trap #15 Almacena la dirección de los switch en D1 move.b #03,d1 trap #15 |
El estado de los switch y de los leds, se almacena en la dirección de memoria que tienen asociada. Así, p.e., si el contenido de la dirección E00012 es %00100000 indicará que todos los interruptores a excepción del 5 están apagados.
Solución
El código de la solución será el siguiente:
*----------------------------------------------------------- * * Versión : 1.0 * Escrito por : Vidal Maté Barbero * Fecha : 27 - 4 - 2006 * Descripción : Manejo de los periféricos * *----------------------------------------------------------- START ORG $1000 jmp inicio * * Constantes y variables * * Guardo la tabla con los valores (en hexadecimal), para mostrar más tarde en los displays tabla dc.b $3F,$06,$5B,$4F,$66,$6D,$7D,$27,$7F,$67 * * Programa principal * inicio move.b #32,d0 Cojo la dirección del hardware move.b #0,d1 trap #15 Muestro la ventana de hardware move.l #$E0000E, a1 Guardo la dirección del display en un registro para poder incrementarla sobre la marcha lea tabla,a0 Pone el primer valor de la tabla en el registro de direcciones 0 move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #8,d3 Muevo el número tope de iteraciones del bucle al registro 3 salto1 move.l #$E00012,a3 Pongo la dirección de los switches en el registro de direcciones 3 move.b #1,d5 Pongo el estado 01 en el registro 5 para comparar cmp.b (a3),d5 Comparación: determina si los switches están a 01 beq bucle1 Si la comparación es cierta pasamos a rellenar con 876543210 jmp salto1 Si no, ejecutamos de nuevo el bucle salto2 move.l #$E00012,a3 Pongo la dirección de los switches en el registro de direcciones 3 move.b #0,d5 Pongo el estado 00 en el registro 5 para comparar cmp.b (a3),d5 Comparación: determina si los switches están a 00 beq prebuc2 Si la comparación es cierta pasamos a rellenar con -------- jmp salto2 Si no, ejecutamos de nuevo el bucle bucle1 move.b (a0),d4 Coloco en d4 al valor correspondiente de la tabla move.b d4,(a1) Coloco el valor adecuado en el contenido del registro a1 sub.l #2,a1 Paso al siguiente display disminuyendo la posición de mem a la que apunta a1 add #1,a0 Paso a la siguiente posición de memoria en a0 (siguiente valor de la tabla) add #1,d2 Añado una unidad al contador cmp.w d2,d3 Comprobación de continuación del bucle bgt.b bucle1 Bucle del programa, si se alcanza el valor límite, pasará a la siguiente instrucción jmp salto2 Pasa a la espera de que se pulse de nuevo el switch prebuc2 move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #8,d3 Muevo el número tope de iteraciones del bucle al registro 3 move.l #$E0000E, a1 Guardo la dirección del display en un registro para poder incrementarla sobre la marcha bucle2 move.b #$40,d4 Coloco en d4 al valor correspondiente (para poner un guión) move.b d4,(a1) Coloco el valor adecuado en el contenido del registro a1 sub.l #2,a1 Paso al siguiente display disminuyendo la posición de mem a la que apunta a1 add #1,d2 Añado una unidad al contador cmp.w d2,d3 Comprobación de continuación del bucle bgt.b bucle2 Bucle del programa, si se alcanza el valor límite, pasará a las instrucciones de parada fin MOVE.B #9,d0 TRAP #15 Parada del simulador END START |
Introducción
La finalidad de esta sección es tomar contacto con las herramientas de ensamblado y simulación del microprocesador Motorola 68000. Para ello se desarrollaran varios programas en ensamblador y se verificará su funcionamiento mediante la simulación.
El software utilizado para el desarrollo de los programas se llama EASy68K (sitio oficial); este permite editar, ensamblar y ejecutar programas del motorola 68000 en un PC con windows (desgraciadamente no existe instalable para Linux, pero podemos compilar el código fuente disponible para descargar más abajo) sin necesidad de hardware adicional. EASy68K es un proyecto open source distribuido bajo la licencia GNU GPL.
SetupEASy68K.exe | Ejecutable con instalador (1.6 MB) |
EASy68K.zip | Fichero zip sin instalador (1.6 MB) |
EASy68Ksource.zip | Código fuente |