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.- Instrucciones de transferencias de datos
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 afectan 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 aritméticas:
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 y Multiply Unsigned) realizan la multiplicación sobre 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, reflejandose 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, limitandose 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.
3.- Instrucciones lógicas:
El Motorola 68000 dispone de cuatro instrucciones que realizan
funciones lógicas, que
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.
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.
4.- Instrucciones de desplazamiento y rotación:
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.
5.- Instrucciones de manipulación de bits:
BCLR: (Bit Clear) pone a 0 el bit indicado. Actualiza el flag Z enfunción del valor original del mismo, poniendolo posteriormente a cero.
BSET: (Bit Set) igual que BCLR, pero poniendo el bit a 1.
6.- Instrucciones de operación en código BCD:
ABCD: suma fuente al destino.
NBCD: niega el destino.
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:
|
|
|
Z |
| BNE | ETIQUETA | Z' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
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 pograma de forma controlada y en el punto deseado.
8.-
Instrucciones de manejo de subrutinas: