|
|
|||||||||
| 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. |
En el anterior capítulo se trató la primera de las instrucciones aritméticas del 68000, en este capítulo se continuará con la explicación de las mismas. Una función que resulta muy importante a la hora de realizar un programa es la comparación de dos elementos. Dicha función se resuelve en Basic mediante la sintaxis IF THEN o IF THEN ELSE, sin embargo el lenguaje Ensamblador posee cuatro instrucciones específicas para realizar ésta tarea de una forma más flexible; dichas instrucciones son: CMP, CMPA, CMPI y CMPM. La primera de ellas (CMP) es la encargada de realizar la comparación entre los valores de dos registros, pudiendo operar con los tres tamaños de datos (B,W,L). Concretamente la sintaxis de ésta operación abarca distintos modos, a continuación se describen los mismos: CMP.W D0,D1 ; Compara los valores de dos registros CMP.W #23,D1 ; Se comprueba si el registro D1 ; contiene el valor 23. CMP.W D0,(A0 ; Compara el valor contenido en D0 con ; el almacenado en la posici�n de ; memoria contenida en A0. En las operaciones de tipo aritmético es donde toma un principal relieve el CCR. Como recordarán, dicho registro es el encargado de informar al sistema, mediante el correspondiente Bit, del resultado obtenido en la última operación. De este modo si en la anterior comparación entre D0 y D1, éstos contiviesen el mismo valor, se pondría a uno el Bit del CCR correspondiente a Cero. Después de la comparación se puede consultar el CCR para posteriormente mediante las instrucciones de bifurcación saltar a una parte del programa u otra, dependiendo del resultado obtenido. Otra instrucción de comparación es CMPI. Esta instrucción también opera con Bytes, Palabras y Dobles Palabras. A diferencia de la anterior, CMPI sólo compara dos valores en modo inmediato, es decir consume menos ciclos de tiempo, pero también resulta menos flexible, puesto que sólo se puede operar con registros de datos.
CMPA es la instrucción encargada de comparar dos direcciones de memoria, puesto que el 68000 no trabaja con direcciones impares (el resultado sería un GURU) sólo se permite el trabajo con Palabras o Palabras Largas. Por otro lado la instrucción CMPM (comparación entre memoria) aunque parezca que realiza la misma función que la anterior, no es así. La diferencia en cuestión es que CMPA compara las direcciones efectivas, es decir los punteros de dirección o direcciones propiamente dichas; en cambio CMPM compara los valores contenidos en las direcciones señaladas o los punteros de dirección definidos. La mejor forma de diferenciar las dos instrucciones es que CMPM puede manejar tamaños de Byte y CMPA no puede. Como en el caso anterior, el resultado de una comparación se refleja en el CCR informando al programa si el primer elemento resulta mayor que el primero, menor o igual. Como se comentó en el caso anterior, es idóneo consultar dicho registro si se desea bifurcar a una rutina u otra dependiendo del resultado obtenido en la comparación. Pero en Ensamblador no sólo permite comparar elementos, sino que también se pueden realizar las operaciones aritméticas más usuales como restar, dividir, multiplicar o sumar. Para ello el set del 68000 cuenta con unas instrucciones de sencillo manejo y comprensión. Para realizar la división de un elemento, el Ensamblador cuenta con dos instrucciones: DIVS y DIVU. Las dos instrucciones sólo soportan como tamaño de dato la palabra, la única diferencia entre éstas es que la primera realiza la división del dato con signo y la segunda lo realiza sin tener en cuenta dicho elemento. La sintaxis, así como la flexibilidad de este par de instrucciones, es muy buena; bastando con asignar al primer operando el divisor y al segundo el número que será dividido. Este último debe de encontrarse contenido en un registro de dato, ya que el resultado de la división permanecerá en dicho registro, sin embargo el divisor puede ser un número en modo directo o también estar incluido en un registro de datos. Para comprobar dicha sintaxis, con DIVU, observaremos el siguiente ejemplo: MOVE.W #20,D0 ---> Dividendo. DIVU.W #5,D0 ---> Divisor. Al final de la anterior operación el registro D0 contendrá 4 (resultado de dividir 20 / 5). Como podrán observar la flexibilidad de ésta instrucción es absoluta, resultando igual de sencilla que si se realizase desde el Basic. La utilización de la división con signo reportará además del resultado de la operación el signo de dicho resultado (en este caso sería signo positivo). Al igual que en el caso de la comparación, al realizar ésta operación también se encienden los bits correspondientes del CCR.
La siguiente operación que se verá es la multiplicación. Al igual que en el anterior caso existen dos instrucciones para realizar ésta tarea, la primera MULS realiza la multiplicación con signo, la segunda MULU realiza la misma operación sin contar con el signo. También al igual que en el anterior caso sólo se pueden manejar palabras y el multiplicando debe encontrarse contenido en un registro de datos o también en la posición de memoria asociada a un puntero del tipo (A0). En cualquier caso el multiplicador puede encontrarse representado por un valor absoluto, registro de datos o registro de dirección. La sintaxis es la siguiente: MOVE.W #4,D0 ; Se carga D0 con el valor 4. MULU.W #5,D0 ; Se multiplica (sin signo) dicho valor ; por 5. El resultado de dicha operación en D0 será 20. Los usuarios que con anterioridad hayan tenido que sufrir las instrucciones de aritmética en procesadores como el 6502, podrán observar la potencia y sencillez de las instrucciones aritméticas en el 68000. Indicar que en el caso de querer dividir entre 0 o multiplicar por 2, existen un par de instrucciones que se verán posteriormente y que resultan más rápidas a la hora de ejecutar el programa. A la hora de sumar en Ensamblador, existen 5 instrucciones: ADD, ADDA, ADDI, ADDQ y ADDX. La primera de ellas es la encargada de realizar la suma en binario de dos números, pudiendo estar éstos en dos registros de datos o sumar un valor absoluto a un valor contenido en una posición específica de memoria. En cualquier caso el tamaño del dato puede ser Byte, Palabra o Palabra Larga. Otra de las operaciones que se pueden realizar (en este caso con la instrucción ADDA) es sumar dos direcciones, lo cual resulta muy útil a la hora de obtener una nueva dirección de apuntador en una tabla. En este caso sólo se pueden operar con Palabras o Dobles Palabras. En el caso de ADDI y ADDQ se corresponde con la suma inmediata y la suma rápida respectivamente. La última de las instrucciones para sumar (ADDX) realiza la función de suma extendida, es decir teniendo en cuenta el signo.
En el caso de realizar la resta se cuenta con los mismos modos que en el caso de suma, además de contemplar la misma sintaxis y características; las instrucciones correspondientes son las siguientes: SUB, SUBA, SUBI, SUBQ y SUBX. Para completar el cuadro de las operaciones aritméticas se encuentran un par de instrucciones de carácter poco común en el ser de un procesador: NEG y NEGX. Dichas instrucciones tienen como función la negación de un valor, en el primero de los casos sin tener en cuenta la extensión del signo, en el segundo este es contemplado. Por otro lado se encuentran asociadas a las instrucciones aritméticas otras tres, las cuales trabajan sólo en modo decimal (no operan con valores hexadecimales o binarios). Dichas instrucciones son ABCD (sumar), NBCD (negar) y SBCD (restar), trabajando éstas únicamente con Bytes como longitud de datos. Como habrán podido comprobar, el grupo de instrucciones aritméticas del 68000 es bastante amplio, ofreciendo al programador comodidad a la hora de realizar las operaciones así como potencia. |
| Envía esta página web a un amigo: Esta opción está desactivada temporalmente, rogamos disculpen las molestias |
|