Descargar

Programación de microprocesador 68000 (página 2)


Partes: 1, 2

 

III. ARQUITECTURA DEL MICROPROCESADOR 68000

A. EXCEPCIONES

Es el concepto más amplio de las interrupciones. Es la respuesta del 68000 a sucesos tales como: ejecución de determinadas instrucciones erróneas, interrupciones, activación de líneas especiales.

La CPU guarda el contenido de algunos registros y acude a una dirección predeterminada. La instrucción RTE (Retorno de Excepción) Reanuda la ejecución del programa.

B. TIPOS DE EXCEPCION:

INTERNOS:

  • Errores Detectados Internamente :
    • Errores de Direccionamiento.
    • Violación de Privilegio
    • Código de Operación inexistente.
  • Por Ejecución de Instrucciones:
    • TRAP (Siempre)
    • TRAPV
    • CHK
    • División por 0
  • Después de de cada instrucción si esta en Modo Trazar (Bit T a 1).

EXTERNOS:

  • Errores de Bus (Señal BERR).
  • Reset Señal RESET
  • Petición de Interrupción.

Como se puede apreciar en la figura notaremos las unidades básicas funcionales del microprocesador.

IV. CARACTERÍSTICAS PRINCIPALES DEL MICROPROCESADOR 68000

Tamaño de los Buses

Datos (DB15-D0): 16 bits

Direcciones: 23 bits, ya que el bit menos significativo no sale realmente por el bus de direcciones, sino a través de las señales de control LDS y UDS.

CONTROL DEL BUS ASÍNCRONO

– UDS LDS (BE1, BE0)

– AS (Dirección válida)

– R#W

– DTACK (Fin de ciclo de lectura/escritura)

Tamaños de datos utilizados

BYTE = 8 bits (B)

PALABRA (WORD) = 16 bits (W)

PALABRA LARGA (LONG WORD) = 32 bits (L).

Descripción Interna

Estructura de registros

  • Registros de Datos D0-D7

Los registros de datos se usan para almacenar aquellos datos que se van a manipular en las siguientes instrucciones del programa o subrutina en curso. Por otra parte, al tener una longitud de 32 bits, permiten trabajar en formatos de 32, 16 u 8 bits, según indique la instrucción.

Cada registro se considera como:

* Tamaño: 32 bits.

* Modos de acceso:

  • Octeto (.B): se accede sólo a los 8 bits menos significativos.
  • Palabra (.W): se accede sólo a los 16 bits menos significativos.
  • Palabra larga o doble (.L): se accede al registro completo.

* Uso: para almacenar datos temporales.

  • Byte: 8 bits

Un dato de este formato puede ser transferido en un solo ciclo de bus.

  • Palabras: 16 bits

Los datos bajo este formato también pueden ser transferidos en un solo ciclo de bus.

  • Palabras largas: 32 bits

Puesto que los registros internos del 68000 son de 32 bits, se consigue también manejar este tipo de datos, pero al tener un bus de datos de 16 bits se necesitan 2 ciclos de bus para una transferencia.

El microprocesador 68000 maneja datos de la siguiente forma:

  • Registros de Direcciones. A0-A6

Los registros de direcciones se utilizan para referenciar posiciones de memoria donde se han de acceder datos o donde se han de escribir. Se ha de cuidar sin embargo el tipo de dirección que se pretende acceder según el formato (16, 32 bits) del operando. Cuando se utilizan como operando destino, todo el registro es modificado, independientemente del formato del la dirección, realizando extensión de signo.

Sólo admiten el modo palabra o el de palabra larga para lectura/escritura. No obstante una escritura en modo palabra modificaría los 32 bits del registro (extensión de signo).

  • Registro de Pila (SP)

USP: Puntero de Pila del Usuario

SSP: Puntero de Pila del Supervisor

El registro de pila, o puntero de pila, sirve para tener referenciada la posición de memoria en que se encuentra el último dato introducido en la pila. Se accede automáticamente a un registro o a otro según el microprocesador se encuentre en un modo u otro. Se decrementan cuando se meten datos y se incrementan cuando se sacan.

  • Contador de Programa (PC)

Registro de 32 bits (sólo se usan los 24 LSBs). El registro de contador de programa apunta constantemente a la siguiente instrucción que va a ser ejecutada. En el caso del 68000, solo 24 de sus 32 bits se usan (ver bus de direcciones) y el la línea A0 indica por su parte si el dato con el que se está trabajando es un byte par (A0=0, activándose la línea /UDS), un byte impar (A0=1, activándose la línea /LDS) o bien una palabra (en cuyo caso se activan tanto /UDS como /LDS).

  • Registro de Estado

Consta de 2 bytes: byte de sistema y byte de usuario (también llamado registro de códigos de condición o CCR).

El registro de estado se subdivide en realidad en 2 bytes, cada uno ejerciendo una función bien distinta. Por una parte, se encuentra en registro de códigos de condición (o CCR), que almacena unos biestables que permiten los saltos condicionales y otras instrucciones y que se encuentran en los 5 primeros bits del byte. Los otros 3 no se usan y siempre están siempre a 0.

Acarreo, C:

Este bit se pone a 1 cuando se produce un acarreo a consecuencia de una instrucción.

– Desbordamiento, V:

Este bit denota al ponerse a 1 que la última operación ha efectuado un desbordamiento en el dato.

– Zero, Z:

Este bit indica que el último operando o resultado ha sido 0. Para ello se coloca a 1.

– Negativo, N:

Indica el signo del último operando/resultado con 1 si ha sido negativo.

– Extensión, X:

Se comporta como un bit de acarreo. En la mayoría de las instrucciones, un cambio en C implica el mismo cambio en X pero existen instrucciones en las que esto no ocurre.

Por otra parte se encuentra el byte del sistema, que contiene información vital para el funcionamiento del micro. Este byte solo puede ser modificado en modo Supervisor.

Máscara de interrupciones I2, I1, I0:

Con estos 3 bits se puede fijar el nivel de prioridad de una interrupción. Almacena el nivel a partir del cual se atiende a una interrupción. Estos 3 bits constituyen el nivel de la máscara de interrupción. Esto quiere decir que, para que una interrupción sea atendida, debe ser de un nivel superior al indicado por estos 3 bits. Existe sin embargo el nivel 7 (111) que se denomina no enmascarable puesto que se atiende siempre. Existen pues 8 niveles de interrupción, de 0 a 7. De otra forma se hace caso omiso de la petición.

– Supervisor, S:

Este bit indica que el micro se encuentra en modo Supervisor (1) o en modo Usuario (0).

– Traza, T:

Permite la ejecución paso a paso de un programa, con vistas a la depuración de su código. Para ello se ha de poner el bit a 1.

El MC68000 puede ejecutar sus instrucciones en dos modos diferentes: el modo usuario y el modo supervisor.

  • El Modo Usuario conforma un entorno de programación para la ejecución de los programas de aplicación. En este modo no se pueden ejecutar ciertas instrucciones y no se puede acceder a parte del registro de Estado.
  • El Modo Supervisor permite utilizar el juego de instrucciones completo y acceder a todo el registro de Estado, tanto en lectura como en escritura. Se establece así unos "privilegios" de utilidad en sistemas operativos y software de base de los sistemas.

V. ORGANIZACIÓN DE DATOS EN MEMORIA

Habiendo establecido este espacio lineal de direcciones, quedan reservadas las direcciones comprendidas entre la 0 y la 1024 para usos específicos esenciales del 68000, conocidas como memoria del sistema y datos del sistema. Estas direcciones contienen importantes tablas para el tratamiento de las interrupciones, cargas de operativos, etc., y no deben ser alteradas por el usuario. Algunas de estas direcciones pueden estar el la ROM, de forma que no desaparezcan al desconectar la alimentación, pero seguirán utilizando espacio de direcciones como cualquier otra posición de memoria. Habrá, con toda seguridad, otras áreas de memoria asignadas permanentemente a otras funciones no accesibles al usuario de programas y datos.

Por disponerse de un bus de dato de 16 bits, la memoria puede considerarse formada por unidades de ese tamaño. El MC68000 lee 16 bits cada vez, coincidiendo con el formato de codificación de instrucciones en palabras de 16 bits. No obstante Se podrá acceder a la memoria para leer un BYTE, una palabra WORD, ó una doble palabra LONG, siempre y cuando se tengan en cuenta las siguientes reglas:

  1. Las direcciones de los bytes pueden ser pares o impares. Sus incrementos son de 1 en 1.
  2. Las direcciones de las palabras son siempre pares. Sus incrementos son de 2 en 2.
  3. Las direcciones de las dobles palabras son pares. Sus incrementos son de 4 en 4.
  4. Cuando se accede a una palabra que está en la dirección N, siendo N un número par, el byte de la dirección N es el Byte más significativo y el de la dirección N+1 es el byte menos significativo. Lo que significa que cuando se mira una palabra de memoria, su byte más significativo está en la dirección más baja, y su byte menos significativo está en la dirección más alta.
  5. Al acceder a una doble palabra también se realiza de tal manera que la palabra alta será la de dirección más baja, mientras que la la palabra baja está en la dirección más alta.
  6. Si se intenta acceder a una palabra o a una doble palabra en una dirección impar, se provocará un error.

Recordando lo más característico de la manera de acceder a memoria es:

  • No existencia de segmentación o restricciones en el tamaño del programa, siendo utilizable todo el espacio de direcciones de manera lineal.
  • Las instrucciones de los programas se almacenan como palabras.
  • Los datos pueden tratarse como bytes, Word ó long.
  • Las direcciones de palabra (WORD) y doble palabra (LONG) son pares.

VI. SINTAXIS DEL ENSAMBLADOR 68000

La Sintaxis de un lenguaje ensamblador es el conjunto de reglas que debe guardar el programa fuente y que estará compuesto por una serie de instrucciones, distinguiéndose cuatro campos: etiqueta, mnemotécnico, operando y comentario. El programa fuente deberá estar en un fichero ASCII que se genera con la ayuda de un programa editor, y no un procesador de textos, ya que estos generan códigos de control que los ensambladores son incapaces de interpretar. Un sencillo editor es el de MS-DOS. Las instrucciones en código máquina se codifican por campos, por lo que las instrucciones escritas en ensamblador se codificaran también por campos.

Línea de Instrucción en Ensamblador

ETIQUETA

NEMOTECNICO

OPERANDO

COMENTARIO

SUBR

MOVE.L

D0, – (SP)    ;

Guarda D0

Nemotecnico.Z [Fuente] , [Destino]

.Z=>Tamaño del argumento

.B (Byte)

.W (Word)

.L (Long Word)

Si no se especifica tamaño se entiende que es .W

.Fuente=>Lugar (Mem. o Reg.) de donde procede uno de los operandos

                             (No se modifica)

.Destino=>Lugar donde se deposita el resultado.

  1. Es un campo opcional que se utiliza para tener una referencia de las instrucciones. El programa ensamblador va traduciendo secuencialmente las instrucciones del programa fuente, guardando los códigos traducidos en posiciones consecutivas de memoria. Cuando encuentra una etiqueta en una línea de instrucción, el ensamblador guarda dicha etiqueta en una tabla especial en la memoria, junto con la dirección de memoria en la que se ha almacenado la instrucción que la acompaña, así si alguna instrucción tiene que referenciar a la instrucción etiquetada, bastará con que se escriban los caracteres de la etiqueta en el campo de operandos correspondiente. El programa ensamblador se encargará, cuando deba traducir esta instrucción, de buscar en la tabla la dirección en memoria de la instrucción correspondiente a la etiqueta.

    Nombre simbólico de la dirección en memoria de la instrucción que le sigue.

    Formas de inclusión en el programa:

    • En la misma línea que la instrucción, pegada al margen izquierdo.
    • En la línea anterior a la de la instrucción:
    • Pegada al margen izquierdo.
    • Con espacio a la izquierda y seguida de " : ".

    Ejemplo:

    Caracteres permitidos:

    • Solo los 15 primeros son significativos.
    • Todos los códigos ASCII > 33 excepto: +, -, *, /, &, !, |, ^, >, <, (, ).
    • El primer carácter no puede ser ni un número, ni $ (Hexadec.), ni % (binario).
    1. Se utiliza para escribir los códigos de instrucciones ejecutables y los códigos de pseudoinstrucciones o directivos de ensamblador. Las instrucciones ejecutables son los mnemotécnicos que constituyen las instrucciones del computador.

      Las pseudoinstrucciones sirven para dar al ensamblador indicaciones como la dirección de memoria a partir de la cual debe ir guardando los códigos traducidos, realizar la reserva de las posiciones de memoria donde deben guardarse los resultados, etc. Las pseudoinstrucciones reciben este nombre porque sus mnemotécnicos no se convierten en código máquina, sino que son ejecutados directamente por el programa traductor.

    2. Campo de Nemotécnico:

      Se utiliza para indicar los valores concretos de los operandos que intervienen en la operación definida por el campo mnemotécnico. Dependiendo de la instrucción indicada en el campo mnemotécnico, habrá que definir el modo de direccionamiento, que estará determinado generalmente, mediante una combinación del código de operación y la información del campo de operandos.

      1. Las cantidades colocadas en el campo de operandos pueden venir expresadas en diferentes bases de numeración, que son: binaria,  decimal y hexadecimal, y van determinados por un símbolo que se añade al valor numérico.

        DECIMAL

        por defecto

        BINARIO

        %

        HEXADECIMAL

        $

      2. Números y constantes alfabéticas.
      3. Símbolos.
    3. Campo de Operandos:

    El conjunto de caracteres alfanuméricos que se utiliza en el campo de los operandos para indicar una dirección recibe el nombre de símbolo. El programador podrá definir sus propios símbolos mediante dos procedimientos:

    1. De forma implícita, mediante el empleo de etiquetas.

    b) De forma explícita, mediante algunas pseudoinstrucciones.

    1. Expresiones.

    Una expresión es una combinación de números y/o símbolos unidos mediante operadores aritméticos o lógicos

    1. Campo de Comentarios:
    • Mediante el campo de comentarios se trata de hacer más comprensivo al programa, incluyendo el todos los puntos claves, definición de símbolos, reservas de memoria, propósito del programa, etc.
    • El ensamblador los ignora.
    • Se inicia con "*" ó ";".
    1. Definir un símbolo consiste en asignar un valor como un número o una dirección de memoria a un nombre utilizando el directivo EQU.

      Cuando el traductor lee este directivo, guarda la etiqueta y el valor indicado en el operando, en una zona de memoria denominada tabla de símbolos. Al encontrar un símbolo en el campo de operandos el traductor consultará esta tabla para ver el valor que le corresponde.

    2. DEFINICIÓN DE SÍMBOLOS (EQU) – "EQUAL"

      El programa ensamblador utiliza un registro que le indica en que posición de memoria debe guardar una instrucción y que dirección debe asignar a una determinada etiqueta. Este registro se llama contador de dirección de ensamblado. Para poner el contenido de este contador a un valor determinado se usa una pseudoinstrucción denominada ORG.

    3. EL CONTADOR DE DIRECCIÓN DE ENSAMBLADO (ORG) – "ORIGIN"

      La sentencia DC.S permite definir una posición de memoria conteniendo un valor determinado o una serie de valores que se colocarán en orden a partir de la posición señalada.

    4. DEFINICIÓN DE CONSTANTES (DC)

      La sentencia DS,S reserva espacio de memoria sin especificar su contenido , y su longitud viene dada por el valor del operando , viéndose afectado este por el tamaño de la palabra como un factor multiplicador siendo por 1, por 2 o por 4 respectivamente.

      DS.B expresión (DB, BYTE)

      DS.W expresión (DW, WORD)

      DS.L expresión (DL, LONG)

    5. DEFINICIÓN DE DATOS (DS)

      La sintaxis de este directivo es muy simple ya que consta sólo de un campo de mnemotécnico, END. Este directivo únicamente se usa una vez en cada programa y será necesariamente la última instrucción.

    6. ÚLTIMA SENTENCIA DEL PROGRAMA (END)

      La programación modular consiste en dividir un programa complejo en módulos independientes de manera que cada uno de ellos realice una tarea concreta.

      Para permitir la traducción de dichos módulos se usa el directivo EXT que indica al ensamblador que los símbolos utilizados en el módulo objeto de la traducción están definidos en otro módulo diferente.

      En el módulo donde se definen los símbolos que pueden ser utilizados por otros módulos deberá indicarse con el directivo DEF.

    7. ENLACE ENTRE PROGRAMAS (EXT, DEF)

      Estas pseudoinstrucciones funcionan como en un lenguaje de alto nivel, es decir si se verifica la condición, el  ensamblador traduce las instrucciones entre el IF y el ELSE y sino, entre el ELSE y el ENDIF.

    8. ACCIONES CONDICIONALES (IF, ELSE, ENDIF)

      El programa ensamblador puede emitir una serie de informes, como mostrar un listado en lenguaje ensamblador y en código máquina, mostrar los errores sintácticos, etc. Los directivos que realizan estas funciones son los siguientes:

      • NAME: da la posibilidad de poner un identificador al programa, así cuando se liste aparecerá el nombre en la cabecera.
      • PAGE: indica al traductor que debe de saltar a una nueva página cuando esté imprimiendo el informe.
      • LIST: indica al traductor que imprima el programa fuente.
      • TABLE: indica al traductor que imprima la tabla de símbolos
      • LALL: indica al traductor que imprima el programa fuente, el código máquina y la tabla de símbolos.
      1. ALMACENAMIENTO EN POSICIÓN PAR

      Existe una pseudoinstrucción, EVEN, que soluciona el problema de los microprocesadores de 16 bits, ya que estos sólo pueden utilizar datos de 2 bytes o más, comenzando siempre desde una posición par.

      Operaciones (Orden De Precedencia)

      | OR lógico

      ^ OR exclusivo

      & And lógico

      + Suma

      Resta

      * Multiplicación

      / División

      > Desplazamiento lógico a la derecha

      < Desplazamiento lógico a la izquierda

      +, – Cambio de signo

      ! Negación

      ( ) Paréntesis (uso ilimitado)

      VII. INSTRUCCIONES DEL MOTOROLA

      A continuación se desarrollarán las instrucciones del Motorola 68000, agrupadas según la función básica que realizan, estudiando la operación que realizan, su sintaxis, sus campos y algunos ejemplos.

      1. El conjunto de estas instrucciones permite el movimiento de datos entre registros de la CPU, entre registros y memoria y entre posiciones de memoria. Estas son las siguientes:

        MOVE: realiza la transferencia de un dato desde fuente a destino. Modifica el CCR de forma que refleja el signo del dato movido y el hecho de que sea cero o no. Los flags C y V se ponen a cero y el flag X no se modifica. También el manejo de la pila se lleva a cabo mediante esta instrucción, utilizando direccionamiento indirecto con el registro A7 que actúa como puntero de pila. Para llevar un dato a la pila el direccionamiento es indirecto con predecremento, mientras que para extraerlo se emplea el indirecto con posincremento.

        MOVEA: (Move Adress) es una variante dedicada a la transferencia de direcciones. El tamaño del dato es de 16 ó 32  bits. No modifica el CCR.

        MOVEQ: (Move Quick) tiene por finalidad la carga rápida de un registro de datos.

        MOVEM: (Move Múltiple) carga una serie de posiciones consecutivas de memoria en varios registros a la vez. No afecta al CCR. Ejemplo: MOVEM.L $1000,D0-D2/A2-A4/D7 copia los contenidos de las posiciones $1000, $1002, $1004,…$100C en los registros D0, D1, D2, D7, A2,A3 y A4 respectivamente.

        EXG y SWAP: la primera intercambia el contenido completo de dos registros de datos o de dirección, mientras que la segunda actúa sobre un único registro, siempre de datos, intercambiando sus palabras alta y baja. La realización de estas transferencias sin la existencia de estas instrucciones, requeriría la ejecución de tres instrucciones MOVE, y la utilización de otro registro o de la memoria como almacenamiento temporal.

        LEA y PEA: (Load Effective Adress y Push Effective Adress) determinan la dirección efectiva del operando fuente. La primera almacena la dirección efectiva calculada en el registro de direcciones que se especifique como operando destino y la segunda lo lleva a la pila. Ninguna de las dos afecta al CCR.

        LINK y UNLINK: facilitan las operaciones necesarias para el paso de parámetros a/de subrutinas a través de la pila, ofreciendo la ventaja de ser independiente de las áreas de memoria de datos de un programa, y de no necesitar el uso de etiquetas, ni de direcciones concretas para acceder a dichos parámetros, facilitando así la inclusión de las subrutinas en programas diferentes sin necesidad de hacer cambios en ellas. La instrucción LINK reserva una zona de memoria en la pila, desplazando el puntero de pila (SP) hacia direcciones menores en el valor que se indique. La instrucción UNLINK restablece la pila en la situación que se encontraba antes de la ejecución de LINK, cargando el puntero de pila con el contenido del registro de direcciones  que se indica y a continuación extrae la palabra larga apuntada por SP y la lleva al registro de direcciones, quedando así restaurado.  

      2. Instrucciones de Transferencias de Datos

        El Motorola 68000 dispone de instrucciones para las 4 operaciones aritméticas, sobre operandos binarios, y suma y resta sobre datos codificados en BCD. Además de cambio de signo para ambos tipo de datos, instrucciones de comparación, extensión de signo y actualización de los códigos de condición (CCR) según el valor de un dato.

        ADD: realiza la suma de los operandos fuente y destino, quedando el resultado almacenado en destino. Modifica el CCR en función del resultado de la operación.

        ADDA: (Add Adress) realiza la operación de la suma, siendo el destino un registro de direcciones en vez de datos.

        ADDI: (Add Inmediate) realiza la operación suma mediante direccionamiento inmediato.

        ADDQ: (Add Quick) realiza la operación resta mediante direccionamiento inmediato siendo el destino menor o igual que 8.

        ADDX: (Add Extended) incluye en el resultado la suma del flag X, lo que facilita las operaciones con valores que superan la capacidad de los registros (precisión múltiple).

        SUB: (Substract) realiza la diferencia entre fuente y destino, depositando el resultado en destino.

        SUBA: (Substract Adress) realiza la operación de la resta, siendo el destino un registro de direcciones en vez de datos.

        SUBI: (Substract Inmediate) realiza la operación resta mediante direccionamiento inmediato.

        SUBQ: (Substract Quick) realiza la operación resta mediante direccionamiento inmediato siendo el destino menor o igual que 8.

        SUBX: (Substract Extended) incluye en el resultado la resta del flag X, lo que facilita las operaciones con valores que superan la capacidad de los registros (precisión múltiple).

        MULS y MULU: (Multiply Signed and Multiply Unsigned) realizan la multiplicación sobre los datos de 16 bits, generando un resultado de 32 bits, siendo el destino un registro de datos. Los flags C y V siempre quedan a 0 y el flag X no se modifica, reflejando el resultado de la operación los flags Z y N.

        DIVS y DIVU: (Signed y Unsigned) realizan la división de un dato de 32 bits (en destino) por otro de 16 bits (en fuente), generando dos resultados de 16 bits: el cociente y el resto, siendo obligatorio que el destino sea un registro de datos. El cociente se guarda en los 16 bits menos significativos y el resto en los 16 bits más significativos del registro destino. Ambas instrucciones ponen el flag C a 0, y el flag X no se modifica. Puede producirse desbordamiento si el divisor es pequeño, reflejándose en el flag V. Los flags N y Z son modificados reflejando el resultado de la operación.

        CMP: (Compara) las instrucciones de comparación efectúan la substracción destino-fuente pero la diferencia no se lleva a ningún destino, limitándose a afectar a los flags N, Z, V y C, de forma que se puedan comprobar diversas relaciones entre los datos que se comparen con el fin de producir ramificaciones en el programa.

        CMPA: (Compare Adress) utiliza como destino un registro de direcciones.

        CMPI: (Compare Inmediate) utiliza direccionamiento inmediato para fuente. Para el operando destino puede utilizar todos los modos salvo direccionamiento directo a registro de direcciones, indirectos con predecremento o posincremento y los relativos a PC.

        CMPM: (Compare Memory) compara dos datos en memoria con direccionamiento indirecto con posincremento facilitando así la comparación de bloques de memoria.

        CLR: (Clear) carga un cero binario en el operando destino poniendo los flags N a 0, Z a 1, V a 0 y C a 0.

        NEG: (Negate) esta instrucción devuelve el complemento a 2 del operando y esto supone el cambio aritmético de signo. Afecta a todos los flags del CCR.

        NEGX: (Negate Extended) facilita el cambio de signo de valores de precisión múltiple. EXT: (Extend) cuando se quiere ampliar la longitud de un dato con signo, por ejemplo de byte a palabra o de palabra a palabra larga, sin alterar su valor, el dato original debe mantenerse en el byte o palabra de menor peso, y el byte o palabra que se añade debe tener todos sus bits con el mismo valor que el bit de signo del dato original, recibiendo esta operación el nombre de extensión de signo.

      3. Instrucciones Aritméticas:

        El Motorola 68000 dispone de cuatro instrucciones que realizan funciones lógicas,  que actúan bit a bit sobre datos de 8, 16, ó 32 bits y cuatro para manejar bits individuales sobre datos de 8 ó 32 bits.

        AND: es la Y lógica. Admite todos los modos de direccionamiento para el operando fuente menos direccionamiento directo  a registro de direcciones, mientras que el operando destino admite también todos menos los direccionamientos relativos a PC.

        ANDI: realiza la misma función que AND, pero su direccionamiento es inmediato en el operando fuente y todos menos el direccionamiento directo a registro de direcciones y relativos a PC.

        EOR: es el O exclusivo. Admite únicamente el direccionamiento directo a registro de datos para el operando fuente, mientras que el operando destino admite también todos menos los direccionamientos directo a registro de direcciones y los relativos a PC.

        EORI: realiza la misma función que EOR, pero su direccionamiento es inmediato en el operando fuente y todos menos el direccionamiento directo a registro de direcciones y relativos a PC.

        NOT: complementación lógica.

        OR: es la O lógica. Admite todos los modos de direccionamiento para el operando fuente menos direccionamiento directo  a registro de direcciones, mientras que el operando destino admite también todos menos los direccionamientos relativos a PC y directo a registro de direcciones.

        ORI: realiza la misma función que OR, pero su direccionamiento es inmediato en el operando fuente y todos menos el direccionamiento directo a registro de direcciones y relativos a PC.

        TST: (Test) comprueba un operando. Los flags V y C se ponen a 0.

        Scc: Comprueba los códigos de condición y pone a 1 el operando. Es de tamaño byte.

      4. Instrucciones Lógicas:

        Se caracterizan por desplazar o rotar el operando bit a bit a la derecha o a la izquierda. El operando destino, que es el afectado por el desplazamiento o por la rotación siempre será un registro de datos.

        ASL: (Arithmetic Shift Left) desplaza a la izquierda los bits del operando destino. El número de desplazamientos viene indicado por el operando origen. El flag V se pone a 1 si el bit más significativo cambia en algún momento y C es el valor del último bit desplazado fuera del operando destino.

        ASR: (Arithmetic Shift Right) desplaza a la derecha los bits del operando destino. El número de desplazamientos viene indicado por el operando origen. El flag V se pone a 0, y el C es el valor del último bit desplazado fuera del operando destino.

        LSL: (Logical Shift Left) es el desplazamiento lógico a la izquierda. El número de desplazamientos viene indicado por el operando origen. El flag C es el valor del último bit desplazado fuera del operando destino.

        LSR: (Logical Shift Right) es el desplazamiento lógico a la derecha. El número de desplazamientos viene indicado por el operando origen. El flag C es el valor del último bit desplazado fuera del operando destino.

        ROL: (Rotate Left) rota a la izquierda los bits del operando destino. El número de desplazamientos viene indicado por el operando origen. El flag C es el valor del último bit desplazado fuera del operando destino.

        ROR: (Rotate Right) rota a la derecha los bits del operando destino. El número de desplazamientos viene indicado por el operando origen. El flag C es el valor del último bit desplazado fuera del operando destino.

        ROXL: (Rotate with Extended Left) rotación a la izquierda con extensión. El número de desplazamientos viene indicado por el operando origen. El flag C es el valor del último bit desplazado fuera del operando destino.

        ROXR: (Rotate with Extended Right) rotación a la derecha con extensión. El número de desplazamientos viene indicado por el operando origen. El flag C es el valor del último bit desplazado fuera del operando destino.

        SWAP: intercambia el contenido de los 16 bits más significativos con el de los 16 menos significativos, ya que los operandos son de tamaño palabra. Los flags V y C se ponen a 0.

      5. Instrucciones de Desplazamiento y Rotación:

        El Motorola 68000 permite comprobar, poner a cero , poner a uno e invertir los bits individuales de un valor entero.

        BTST: (Bit Test) sirve para comprobar el estado de un bit concreto de destino. Actualiza el flag Z en función del valor del bit indicado en la instrucción (Z=1 si el bit es cero). Admite el direccionamiento inmediato y el directo a registro de datos en el operando fuente y en el operando destino todos menos el directo a registro de direcciones.

        BCLR: (Bit Clear) pone a 0 el bit indicado. Actualiza el flag Z en función del valor original del mismo, poniéndolo posteriormente a cero.

        BSET: (Bit Set) igual que BCLR, pero poniendo el bit a 1.

        BCHG: (Bit Change) en primer lugar actualiza el flag Z en función del valor del bit indicado y luego complementa el bit, es decir lo pone en el valor (0 ó 1) contrario al original.

      6. Instrucciones de Manipulación de Bits:

        De la misma manera que el Motorola 68000 opera con enteros, también permite programar la suma y la resta en código BCD.

        ABCD: suma fuente al destino.

        NBCD: niega el destino.

        SBCD: resta fuente al destino

      7. Instrucciones de Operación en Código BCD:

        Este microprocesador incorpora varios mecanismos para poder realizar instrucciones típicas de los lenguajes de alto nivel, como pueden ser los bucles o las instrucciones de condición, siendo el más elemental la instrucción de ramificación, que utiliza como operando una etiqueta, y que sirve para hacer que la próxima instrucción que se ejecute sea la que tenga dicha etiqueta. Cuando el procesador se encuentra con esta instrucción, sencillamente carga la etiqueta en el contador de programa, por lo que la etiqueta es la dirección de donde debe cargarse la próxima instrucción que vaya a ejecutarse.

        Bcc: (Branch on condition code) utilizan un único argumento que indica la dirección de la siguiente instrucción en el caso de que se cumpla la condición indicada por cc. Utiliza siempre direccionamiento relativo al contador de programa. cc representa dos letras variables detalladas en la siguiente tabla:

        DBcc: (Decrement and Branch on Condition Code)  facilita la realización de bucles en un programa, y tiene dos argumentos siendo el primero un registro de datos y el segundo un desplazamiento de 16 bits respecto al PC. Su funcionamiento se puede detallar a continuación:

        1º Comprueba la condición cc, si se cumple, pasa a ejecutar la instrucción siguiente (secuencia normal del programa) y en caso de estar realizando un bucle se saldría del mismo.

        2º Decrementa el contenido del registro de datos.

        3º Si el contenido del registro es -1, se ejecuta la instrucción siguiente (salida del bucle)

        4º Modifica el PC con el desplazamiento indicado (salta al comienzo del bucle).

        BRA: (Branch) utiliza direccionamiento relativo al PC, su único argumento es el desplazamiento de 8 ó 16 bits que se suma (con signo) al PC y se obtiene la dirección de la siguiente instrucción a ejecutar. Con desplazamiento corto (8 bits) los saltos máximos que se pueden realizar son -128 y +127. Con desplazamiento largo ( 16 bits) los saltos máximos son -32.768 y +32.767.

        JMP: (Jump) utiliza direccionamiento absoluto y su argumento es la dirección de comienzo de la siguiente instrucción a ejecutar y puede estar situada en cualquier parte del mapa de memoria.

        STOP: para la ejecución del programa de forma controlada y en el punto deseado.

        NOP: (No Operation) no realiza absolutamente nada. Es una instrucción que no hace sino consumir tiempo, exactamente 4 ciclos de reloj. Puede parecer absurda la existencia de una instrucción así, pero tiene su justificación, como por ejemplo si se desea efectuar un pequeño retraso en la ejecución de un programa con el fin de sincronizar determinados acontecimientos, o cuando se desea reservar algunas posiciones del programa para poder intercalar nuevas instrucciones, etc.

      8. Instrucciones de Ramificación y Salto:
      9. Instrucciones de Manejo de Subrutinas:

      BSR y JSR: (Branch to Subrutine y Jump to Subrutine) el operando asociado con estas instrucciones debe ser la dirección de memoria en la que se comienza la subrutina, con direccionamiento absoluto para JSR, y relativo a PC para BSR. Al ejecutarse cualquiera de las dos instrucciones, se almacena automáticamente en la pila el valor del contador de programa en el momento anterior al salto, cuando su contenido apunta a la dirección de comienzo de la instrucción siguiente a JSR o BSR. La subrutina debe tener como última instrucción a ejecutar RTS (Return from Subrutine) o RTR (Return and Restore). Ambas recuperan de la pila el valor del contador del programa, lo que permite reanudar la ejecución del programa precisamente en el punto que había sido abandonado. La instrucción RTR también repone el CCR extrayendo una palabra de la pila inmediatamente antes de recuperar el PC. La subrutina debe llevar a la pila, justamente encima de las posiciones que contienen la posición de retorno, una palabra cuyos 5 bits menos significativos serán llevados al CCR al ejecutarse RTR, que puede ser una copia del CCR al entrar en la subrutina, o cualquier otro valor.

      VIII. MODOS DE DIRECCIONAMIENTO

      Son las formas de indicar al procesador:

      • Donde puedo encontrar un dato.
      • Donde debo depositarlo.
      • A que ligar debe saltar para proseguir la ejecución.

      Existen cuatro modos de direccionamiento:

      1. Direccionamiento inmediato o literal:

      • Almacena el operando precedido del símbolo # en el registro indicado.
      • El operando (en vez de su dirección) esta incluido en la instrucción. (Usa 2 ó 4 bytes).

      Ejemplo: MOVE.L #$18, D6

      2. Direccionamiento absoluto:

      Almacena el operando que está en la dirección de memoria especificada en el registro de datos indicado.

      Ejemplo: ADD.W %000000001000111110001, D2 suma la palabra que está en la dirección de memoria indicada, a D2.

      3. Direccionamiento mediante registro:

      Apunta a la dirección del registro donde está el dato.

      Ejemplo: MOVE.B D3, D4 copia el contenido del registro D3 (byte) a D4.

      4. Direccionamiento relativo a registro:

      1. Se da la dirección del registro donde está la dirección del dato. El nombre del registro se escribe entre paréntesis.

        Ejemplo: ADD.B (A0), D6 suma el contenido de la posición de memoria (byte) cuya dirección está en A0 al registro D6, guardando el resultado en este último.

      2. Direccionamiento mediante registro normal:

        Incrementa en una cantidad de memoria, según sea el tamaño del operando (1 para B, 2 para W y 4 para L), después de traer el contenido de la posición de memoria indicada por el registro de direcciones.

        Ejemplo: MOVE.W (A0)+, D0 copia en D0 el contenido de la posición de memoria direccionada por A0 y luego incrementa en 2 el contenido de A0.

      3. Direccionamiento relativo a registro con posincremento:

        Decrementa en una cantidad de memoria, según sea el tamaño del operando, el registro de direcciones y trae después el contenido de la posición de memoria cuya dirección es el nuevo valor de dicho registro.

        Ejemplo: MOVE.B  -(A0), D0 decrementa en uno el contenido del registro A0 y luego copia en D0 el contenido de la nueva posición de memoria direccionada por A0.

      4. Direccionamiento relativo a registro con predecremento:

        El contenido de la posición de memoria cuya dirección viene dada por la suma del valor del registro de direcciones y una cantidad fija denominada desplazamiento, pudiendo ser este positivo o negativo y su valor viene condicionado por el tamaño del operando.

        Ejemplo: MOVE.L N (A0), D1 copia en el registro D1 el contenido de la posición de memoria cuya dirección viene dada por la suma de N multiplicado por 4(L) al contenido de A0.

      5. Direccionamiento relativo a registro con desplazamiento:

        Este modo de direccionamiento es la extensión natural del anterior, ya que permite usar desplazamientos variables, utilizando como desplazamiento el resultado de sumar un número fijo al contenido de un registro de datos denominado registro índice.

        Ejemplo: MOVE.B 4(A0, D1), D0 copia en el registro D0 el contenido de la posición de memoria cuya dirección es el resultado de sumar el número 4, el contenido del registro A0 y el contenido del registro D1. Este modo de direccionamiento no altera el registro de direcciones ni el registro índice.

      6. Direccionamiento relativo a registro con índice:

        Cuando es necesario hacer referencia a un operando relativo a la posición de la próxima instrucción que va a ser ejecutada.

        Ejemplo: MOVE.B 24(PC), D0 copia en el registro D0 el contenido de la posición de memoria cuya dirección es la suma de 24 y el valor del contador del programa.

      7. Direccionamiento relativo al contador de programa con desplazamiento:
      8. Direccionamiento relativo al contador de programa con índice:

      Utiliza como desplazamiento el resultado de sumar un número fijo al contenido de un registro de datos.

      Ejemplo: MOVE.B 24(PC, D0), D1 copia en el registro D1 el contenido de la posición de memoria cuya dirección es el resultado de sumar el número 24, el contador de programa y el contenido del registro D0.

       

      Edson Palomino Santillan

      Universidad Nacional Mayor de San Marcos Ingenieria de Sistemas Lima – Perú

    9. EJECUCIÓN DE INFORMES (NAME, PAGE, LIST, TABLE, LALL)
  2. Campo de Etiqueta:
Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente