Revistas en papel
 Amiga World Nº15 - Noviembre 1990
Anterior
MenĂº
Logotipo

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

Los cuadernos del
Ensamblador

CAPÍTULO II

Por F. Javier Rodríguez

Amiga World

Todo el mundo que
desee programar el
Amiga, debe saber las
estructuras a seguir
en la realización de
ciertas operaciones,
pero primero deberá
conocer
profundamente el
Ensamblador del
68000.

En este capítulo comenzaremos viendo el juego de instrucciones del 68000, mediante el cual se realiza la programación en Ensamblador para ordenadores cuyo 'corazón' es dicho procesador (ordenadores como Amiga y Atari ST).

Dependiendo de la tarea realizada por las instrucciones (también llamada mnemotécnicos), éstas pueden ser agrupadas dentro de siete tipos distintos: trabajo con datos, instrucciones lógicas, aritméticas, tratamiento de bits, rotación y desplazamiento del dato, operación en modo decimal y por último instrucciones para el control del programa.

El primero de los grupos es el que contiene las instrucciones necesarias para el movimiento de datos, asignación de espacio para los mismos, intercambiar registro, hallar la dirección efectiva de control, etc. Mediante el segundo se realizan las operaciones de tipo lógico entre uno o varios datos, es decir las correspondientes al OR exclusivo, OR exclusivo inmediato, AND, NOT, etc. El tercero de los grupos es el encargado de realizar las operaciones de tipo aritmético como por ejemplo sumas, restas, divisiones, multiplicaciones, comparación entre datos, etc.

En el anterior capítulo se comentó la importancia del control de bits, ya que con algunas direcciones de memoria, un determinado bit informa sobre el estado de algún periférico o parte del sistema. Un claro ejemplo es el Bit 6 de la dirección $BFE001, el cual nos informa si se ha presionado el botón de selección del ratón. El grupo de instrucciones dedicada a ésta labor es el cuarto.

Uno de los grupos más importantes es el dedicado al control de programa. Mediante éste tipo de instrucciones se puede realizar en Ensamblador saltos hacia cualquier parte del programa, independientemente de si se produce algún tipo de condición o no. Se puede comparar éstas instrucciones a las que se encuentran en el AmigaBasic: Goto, Gosub, If Then Else, etc.

Este, que ustedes acaban de ver, es el juego de instrucciones del 68000, faltando unas cuantas de carácter muy especial que se comentarán avanzado el curso. No se preocupe si no ha comprendido alguna de las funciones que realizan dichas instrucciones, ya que queda por aclarar varios conceptos que se verán a continuación.

SET DE INSTRUCCIONES DEL 68000

Tratamiento de datos Tamaño Descripción
EXG Largo Intercambiar dos registros.
LEA Largo Cargar dirección real.
LINK - Asigna espacio para datos.
MOVE L,W,B Transfiere datos a una posición o registro.
MOVEA L.W Mueve una dirección.
MOVEM L,W Mueve varios registros simultáneamente.
MOVEP L,W Mueve datos desde/hacia un periférico.
MOVEQ Largo Mover dato rápidamente.
PEA - Obtiene una dirección real para control
SWAP Word Intercambia el byte inferior y superior de un registro.
UNLK - Desasigna espacio reservado.
Aritmética Tamaño Descripción
ADD L,W,B Suma en binario
ADDA L,W Suma de direcciones.
ADDI L,W,B Suma inmediata.
ADDQ L,W,B Suma rápida.
ADDX L,W,B Suma extendida.
CLR L,W,B Borrar registro.
CMP L,W,B Comparación entre dos registros.
CMPA L,W Comparar dos direcciones.
CMPI L,W,B Comparación inmediata.
CMPM L,W,B Comparación entre memoria.
DIVS Word División con signo.
DIVU Word División sin signo.
EXT L,W Extensión del signo.
MULS Word Multiplicación con signo.
MULU Word Multiplicación sin signo.
NEG L,W,B Negación.
NEGX L,W,B Negación en modo extendido.
SUB L,W,B Resta en modo binario.
SUBA L,W Resta de direcciones.
SUBI L,W,B Resta inmediata.
SUBQ L,W,B Resta rápida.
SUBX L.W.B Resta extendida.
TAS Byte Comprueba y pone a 1 un operando.
TST L,W,B Comprobación de operando.
Lógica Tamaño Descripción
AND L,W,B Y lógica.
ANDI L,W,B Y inmediato.
EOR L,W,B OR exclusivo.
EORI L,W,B OR exclusivo inmediato.
NOT L,W,B Complemento a 1.
OR L,W,B OR lógico inclusivo.
ORI L,W,B OR lógico inclusivo inmediato.
Rotación/desplazamiento Tamaño Descripción
ASL L,W,B Desplazamiento aritmético a la izquierda.
ASR L,W,B Desplazamiento aritmético a la derecha.
LSL L,W,B Desplazamiento lógico a la izquierda.
LSR L,W,B Desplazamiento lógico a la derecha.
ROL L,W,B Rotación a la izquierda
ROR L,W,B Rotación a la derecha.
ROXL L,W,B Rotación con extensión a la izquierda.
ROXR L,W,B Rotación con extensión a la derecha.
Control de Bits Tamaño Descripción
BCHG Largo Comprobar o cambiar un Bit.
BCLR Largo Probar o poner a cero un Bit.
BSET Largo Comprobar y poner a uno un Bit.
BTST L,W,B Comprobar un Bit.
Operaciones en decimal Tamaño Descripción
ABCD Byte Sumar.
NBCD Byte Negar.
SBCD Byte Restar.
Control/programa Desplazamiento Descripción
Bcc 16 Bits Condición de bifurcación.
Bcc.s 8 Bits Condición de bifurcación corta.
DBcc 16 Bits Salto condicional con contador decimal.
Scc Byte Poner a 1 con condición.
BRA 8/16 Bits Salto incondicional.
BSR - Salto a subrutina
JMP - Salto.
JSR - Saltar a subrutina.
RTR - Retorna de subrutina restaurando el CCR.
RTS - Retorna de subrutina.

Al igual que en el Basic disponemos de variables, para trabajar con los datos, el 68000 posee una serie de registros internos con los cuales poder definir los datos así como las posiciones de memoria donde almacenarlos. También posee otros registros de sistema, los cuales ofrecen información sobre el contador de programa, estado del sistema, estado de la pila, etc. La diferencia de estos registros con respecto al resto de la RAM, es que ésta posee un refresco de memoria mucho más rápido; ya que los registros ocupan posiciones fijas en memoria. Por tanto el acceso a éstos registros es más rápido que el acceso a cualquier otro dato alojado en la RAM.


Registros del 68000

Los registros disponibles, para programar el 68000 en Ensamblador, son los siguientes:

- Ocho registros de datos de 32 bits, denominados de D0 a D7.

- Siete registros de direcciones de 32 bits, denominados de A0 a A6.

- Punteros de pila de 32 bits: USP (puntero de pila del usuario) y SSP (puntero de pila superior). Debido a que sólo una de las pilas puede encontrarse activa a las dos se les denomina mediante A7. Pese a que ambas comparten el mismo registro de acceso, cada unas de ellas posee sus propios valores e información.

- Contador de programa de 32 Bits, denominado como PC (Program Counter). El PC es el encargado de guardar en cada momento la posición de memoria de la instrucción que se está ejecutando.

- Registro de estado, el cual se encuentra dividido en dos bytes. El byte inferior es el encargado de informar sobre los códigos de condición (CCR). Por otro lado el byte superior (8-15) se denomina byte del sistema, informando sobre el modo en el que se encuentra la pila, máscara de interrupciones (denominada i0-i2) y un flag que permite el modo traza.

El CCR ofrece información a través de cinco bytes, los cuales se ponen a 1 o se borran para indicar las condiciones resultantes de cada operación del programa. Dichas condiciones son:

C = Acarreo
V = Rebose
Z = Cero
N = Negativo
X = Extensión

Observe que algunas de las instrucciones, representadas anteriormente, afectan directamente éstos códigos; como por ejemplo las instrucciones de extensión, aritméticas y control de bifurcación. Para ver como actúan éstos indicadores (también llamados Flags), veremos algún ejemplo:

Contemplemos una resta entre dos registros, en el primero de los casos se restará el valor 12 al valor 11. Para ello será necesario la instrucción SUBQ (resta rápida), así como la utilización de dos registros de datos (D0/D1)

Inicio:

   MOVE.w #12,D0
   'Se carga el valor 12 en el reg. D0
   MOVE.w #11,D1
   'Se carga el valor 11 en el reg. D1
   SUBQ.w D0,D1
   'Resta (en modo rápido) los dos valores
   RTS

En la resta 12-11 el resultado es -1. Si se consulta el CDCR se podrá observar como el indicador de negativo (bit 3) se encuentra a 1, informando sobre el resultado de dicha operación.

En caso de que la resta se realizara entre dos valores iguales, el resultado seria el siguiente:

Inicio:

   MOVE.w #12,D0
   'Se carga el valor 12 en el reg. D0
   MOVE.w #12,D1
   'Se carga el valor 12 en el reg. D1
   SUBQ.w D0,D1
   'Resta (en modo rápido) los dos valores
   RTS

En éste caso el resultado de la operación es 0. Consultando de nuevo el CCR y si se consulta en concreto el byte 2 (indicador de estado cero) se comprobará como éste indicador se encuentra a 1.

Puede observar como los flags o indicadores se encuentran a 1 cuando se produce el suceso sobre el cual deben informar, y a cero cuando no se produce ningún suceso en el cual esté implicado. El byte del sistema lo forma, como comentamos anteriormente, el byte superior del CR. El byte del sistema puede ser leído o escrito por el programa del usuario, para recavar o definir diversas funciones.

Una de las opciones más interesantes es la máscara de interrupción (bits 8-10 del CR), mediante los cuales el usuario puede definir el nivel de prioridad para determinadas tareas. El procesador atiende la llamada del usuario a su interrupción si el valor indicado en la máscara es inferior al valor del usuario. La máxima prioridad se corresponde con el valor 7, mientras que si la máscara contiene el valor 0 se atenderá todas las solicitudes.

Por otra parte el modo Traza (bit 15 del CR) es un modo especial con el cual se puede ejecutar y revisar el programa paso a paso. Para ello basta con poner a 1 dicho bit, así como suministrar el programa 'trazador'. Esta es la operación que realizan los programas 'debuffers', con los cuales al mismo tiempo que se revisa el programa, se pueden cambiar los valores de los registros o realizar otras modificaciones en el mismo para observar 'en directo' el transcurso de las operaciones.


Concepto de PILA

Como ya se dijo anteriormente, el Amiga posee dos pilas (una de usuario y otra del sistema); ambas pilas se encuentran definidas por el mismo registro A7 (también llamado SP).

Se puede definir a la Pila como una porción de memoria exclusiva para el almacenamiento de datos referentes a los registros. El funcionamineto de la Pila observa el método LIFO (Last In First Out/ último en entrar, primero en salir).

La utilidad de la misma es especialmente relevante a la hora de conservar los valores de los registros actuales, cuando se debe utilizar los mismos para otra tarea; recuperando una vez finalizada la tarea los antiguos valores de la Pila. Además de las dos Pilas existentes el usuario puede crear sus propias 'porciones de memoria' para almacenamiento, pero las ofrecidas por el procesador contemplan instrucciones especiales para su utilización, lo cual las convierte en más rápidas y sencillas de manejar.


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal