Revistas en papel
 Amiga World Nº19 - Marzo 1991
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.

No piense que el
Ensamblador se
aprende de un
día para otro.
El 'control' de
este lenguaje se
consigue con
mucha
dedicación y
práctica;
no desespere...
Los cuadernos del
Ensamblador

 

Por F. Javier Rodríguez

Amiga World

 

CAPÍTULO VI

Anteriormente se han visto desde esta serie de artículos las instrucciones de tipo aritmético (suma, resta, etc), sin embargo la elaboración de funciones más complejas (programando en Ensamblador, se entiende) se realizan con la intervención de una o más de estas instrucciones de tipo lógico o desplazamiento de bits. Este grupo de instrucciones son las que se definirán a continuación.


Rotación / Desplazamiento

A menudo es conveniente realizar operaciones como la rotación de datos o el desplazamiento de los mismos, para de esta forma conseguir unos buenos efectos especiales o incluso para realizar el espejo de una imagen o también el Antialiasing de la misma. El set de instrucciones contiene ocho instrucciones para realizar este tipo de trabajo donde el Bit toma un mayor relieve. También es mediante un par de estas instrucciones como se puede realizar la multiplicación o división de un dato por dos.

Figura 1. Operación NOT.
Dato = #%00001111
MOVE.w   #%00001111,D0       Asigna valor a D0
NOT.w    D0                  Realiza la
                             operación NOT.
Resultado: #%11110000
Figura 2. Operación AND.
Dato fuente= #%00001111
Dato destino= #%01010101
MOVE.w   #%00001111,D0
MOVE.w   #%01010101,D1
AND.w    D0,D1
Resultado: D1= #%00000101,
Figura 3. Operación OR.
Dato fuente= #%00001111
Dato destino= #%01010101
MOVE.w   #%00001111,D0
MOVE.w   #%01010101,D1
OR.w     D0,D1
Resultado D1= #%01011111.
Figura 4. Operación EOR.
Dato fuente= #%00001111
Dato destino= #%01010101
MOVE.w   #%00001111,D0
MOVE.w   #%01010101,D1
EOR.w    D0,D1
Resultado D1= #%01011010.

El 68000 posee cuatro funciones lógicas básicas: NOT, AND, EOR y OR. Con la primera de estas instrucciones se realiza la operación de poner a 0 cada 1 y viceversa; esta operación se realiza con todos los bits del dato, sea cual sea el tamaño del mismo. Esta operación se ve reflejada en la figura 1.

La segunda de estas instrucciones (AND) requiere operandos fuente y destino, esto quiere decir que realiza la comparación bit a bit entre el dato fuente y el destino, creando un nuevo dato basándose para la comparación en las reglas que aparecen a continuación:

   Fuente  Destino  Resultado
      0       0         0
      0       1         0
      1       0         0
      1       1         1

Un ejemplo de este tipo de operación se encuentra reflejado en la figura 2.

La operación lógica OR es inclusiva. Al igual que en la operación AND en esta también se requiere un dato fuente y un dato destino, operando bit a bit con cada uno de los datos. La tabla de verdad, o regla de operación es la siguiente:

   Fuente  Destino  Resultado
      0       0         0
      0       1         1
      1       0         0
      1       1         1

Como habrán observado siempre que exista un 1, ya sea en el dato fuente o en el dato destino, el bit resultado será 1 (debido a esto es por lo que toma el nombre de OR inclusivo). Un ejemplo de esta operación se refleja en la figura 3.

La última de este tipo de operaciones es EOR, el cual es el OR exclusivo. A continuación se encuentra la tabla de verdad de dicha operación:

   Fuente  Destino  Resultado
      0       0         0
      0       1         1
      1       0         1
      1       1         0

En este caso siempre que el bit fuente y el bit destino sean diferentes el resultado será 1 en el bit resultado, pero si el bit fuente y el bit destino son iguales, el resultado será 0. Un ejemplo de esta operación se encuentra representado en la figura 4. La restricción en esta instrucción es que no se puede emplear una dirección de la memoria como fuente.

Existen tres instrucciones adicionales, variantes de las instrucciones AND, EOR y OR; dichas instrucciones son ANDI (AND inmediato), EORI (EOR inmediato) y ORI (OR inmediato). Este subgrupo de instrucciones tiene la particularidad de que sólo aceptan como tamaño de dato el Byte. Es de especial interes utilizar como operando el CCR (evidentemente se pueden utilizar el resto de los registros), de esta forma se puede trabajar con los bits del registro que contiene los códigos de condición. Observaremos el siguiente ejemplo:

Mediante esta operación se borran los flags (bits) del CCR sin utilizar la instrucción CLR. Es conveniente utilizar este grupo de instrucciones siempre que se realicen las operaciones lógicas con Bytes, ya que de esta forma se gana velocidad.


Rotación / Desplazamiento

Dentro de este apartado existen tres modos de operación; el desplazamiento lógico, desplazamiento aritmético y rotación de bits. En cualquier caso todas las instrucciones contenidas en estos grupos trabajan con bytes. palabras o palabras largas.

Siguiendo la lista de instrucciones (publicada en el capítulo II) comenzaremos viendo la instrucción ASL (perteneciente al grupo de desplazamiento aritmético). En esta instrucción es necesario un operando que ejerza como contador y un registro sobre el cual se realizará la operación. La función en concreto es el desplazamiento de todos los bits del registro hacia la izquierda 'n' veces (indicando por el contador). A medida que se produce el desplazamiento, se irán introduciendo ceros por el bit menos significativo. Aclararemos todo esto mediante un ejemplo:

La instrucción ASR realiza la operación contraria a la anterior, es decir el desplazamiento aritmético a la derecha; para ello se siguen las mismas reglas que en el caso anterior. Mediante el siguiente ejemplo se recuperará el valor original de D0.

Por otro lado se encuentran las instrucciones ROL y ROR, cuyo cometido es la rotación de bits. En el caso de ROL, la rotación se realiza de derecha a izquierda, entrando el bit más significativo por el bit menos significativo. En el caso de ROR el proceso es el contrario, desplazando los bits de izquierda a derecha; el bit menos significativo pasará al bit más significativo. Observaremos el siguiente ejemplo para comprobar el funcionamiento de estas dos instrucciones:

Como habrán podido comprobar las instrucciones, tanto aritméticas como lógicas, son mucho más potentes y flexibles que sus equivalentes del Basic. También son más potentes que las de otros procesadores como el 6502 (seguramente lo recordarán aquellos sufridos programadores), en los cuales se debía repetir la operación cuatro veces para rotar cuatro bits de un dato.

De hecho la potencia de estas instrucciones en el 68000 se basa en la capacidad de manejar un 'contador' de operación, así como poder trabajar con datos de 32 bits. De hecho otra de las características es la posibilidad de 'rotar direcciones' siempre que estas se encuentre en forma de puntero (mediante el direccionamiento indirecto). Si se mira a fondo, se pueden encontrar infinidad de usos en los cuales aplicar estas instrucciones.

Las instrucciones,
tanto
aritméticas
como lógicas,
son mucho
más potentes
y flexibles
que sus
equivalentes
del Basic.

¿Qué pasa con el CCR?

Hace tiempo que no hablamos del comportamiento del CCR, en realidad estaba esperando a este capítulo. De hecho nos encontramos con las instrucciones (las anteriormente vistas lógicas/aritméticas y de desplazamiento) que más influyen sobre el CCR a la hora de trabajar. Ahora veremos de que forma afectan estas instrucciones al registro del sistema, así como el qué se puede hacer con dicha información.

AND afecta en sus operaciones al CCR de la siguiente forma: Esta instrucción afecta en concreto a los flags N y Z del registro de condición, así como los bits de acarreo y rebose los cuales siempre se ponen a cero. El primero de los bits informa sobre el estado negativo, mientras que el segundo se encarga de informar al usuario si el resultado de la operación ha sido cero. En este caso el resto de los bits del CCR no se ven afectados. Estas mismas características son iguales para las instrucciones EOR, OR, NOT, ANDI, ORI y EORI.

La potencia
de estas
instrucciones
en el 68000
se basa en la
capacidad de
manejar un
'contador' de
operación

Las instrucciones de rotación/desplazamiento afectan al CCR de la siguiente forma: En el caso de LSL, estas afecta al bit de extensión de signo (dependiendo del último bit desplazado), al de negativo, cero (el cual siempre se pone a 1), acarreo y rebose. En el caso de la instrucción contraria LSR, afecta a los mismos bits; con la diferencia de que el bit de rebose siempre se pone a 1. Estas reglas son las mismas que observan el resto de las instrucciones como son ASL, ASR, ROR, ROR, ROXL y ROXR.

¿Qué es lo que se puede hacer con la información del CCR?. Lo cierto que es que ya lo he comentado alguna vez desde este mismo espacio, en definitiva: controlar el flujo del programa. Dicho así parece simple, y la verdad es que gracias a las instrucciones de flujo de programa y testeo de bits (una instrucción muy útil) esta tarea es realmente sencilla.

Imagínese un programa que controla el número de hombres y mujeres que hay en un colectivo cualquiera. Mediante las instrucciones aritméticas se realizarán las operaciones para separar los hombres de las mujeres, en caso de que el número de mujeres sea mayor que el de hombres el programa bifurcará hacia una subrutina y en el caso contrario se desviará a otra parte del programa. Bien, el poder realizar esta tarea de una forma sencilla es gracias a la información del CCR.


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