| Volver menú revistas | Número 1 - JULIO 1992 |
Página anterior |
|
INICIACION
A LA PROGRAMACION EN ENSAMBLADOR (c) Warlord Con este curso, pretendemos iniciar a todas aquellas personas que aún no lo han hecho, en la programación del 68000. Para ello empezaremos, explicando desde un nivel básico, todos los conceptos y comandos del 68000. Para no hacer este curso interminable no nos detendremos en temas tales como la aritmética binaria, algebra de Boole o conceptos informáticos elementales: CPU, RAM, ..., todos estos conceptos podéis hallarlos en cualquier buen libro de informática general.
CUSTOM CHIPS: Son los llamados Agnus, Denise y Paula. La principal tarea del Agnus, (alias blitter) es el movimiento de areas de memoria, útiles para tareas tales como cambios de pantallas. El Denise está relacionado con las transferencias a pantalla y por último, el Paula se ocupa de tareas de entrada y salida. MEMORIA: La memoria RAM puede ser dividida en dos zonas:
Este es el esquema de la memoria del amiga: $000000 - $07FFFF Chip ram $080000 - $1FFFFF Reservada $200000 - $9FFFFF Fast Ram $A00000 - $BEFFFF Reservada $BFD000 - $BFDF00 PIA B (direcciones pares) $BFE001 - $BFEF00 PIA C (direcciones impares) $C00000 - $CFEFFF Reservada para expansiones $DFF000 - $DFFFFF Registros de los Custom Chips $E00000 - $E7FFFF Reservada $E80000 - $EFFFFF Puertos de expansión $F00000 - $F7FFFF Reservada $F80000 - $FFFFFF Rom ¿Que es un registro?: Digamos que un registro es una pequeña porción de memoria en la que podéis ir metiendo y sacando datos instantáneamente. Generalmente estas zonas son de 32 bits, aunque como veremos hay alguno de 16.
El CCR dispone de 5 indicadores: BIT: 7 6 5 4 3 2 1 0
-------------------------------------
INDICADOR: X N Z V C
C: Bit de acarreo. En ocasiones al hacer alguna operación, nos quedan cortos los 32 bits.Por ejemplo 2 elevado a 32 sería 1 uno seguido de 32 ceros, por lo que necesitaríamos 33 bits para guardarlo, pues en uno de 32 bits, serían todos ceros. Para ellos contamos con este bit de acarreo que podemos utilizar eventualmente para hacer operaciones de 33 bits. X: Bit de extensión. Disponemos de 8 registros de datos, pero sólo 1 de acarreo. A veces nos haría falta utilizar varios bits de acarreos. Esto no es posible, sin embargo en este caso el bit de extensión nos puede ayudar. Este bit X es una especie de memoria del C. Hay muchas operaciones durante las cuales el bit C se pierde, esto no ocurre así con el X. N: Bit de signo. Es 0 para los positivos y uno para los negativos. Recordemos que los números negativos tienen su bit 31 con un 1, mientras los positivos tienen un cero. Z: Se pondrá a uno si el resultado de la última operación ha sido cero, o en caso contrario se pondrá a uno. V: Rebose. Sirve para evitar errores en la aritmética con signo. En la aritmética con signo, los números tienen un rango menor, que la de sin signo. Sin querer podemos cometer un error. Por ejemplo, con 4 bits, el rango sería de 0-15 para la aritmética sin signo y de -7 a +8 para la de con signo. En este último caso, no podríamos sumar +9 + (-3) pues +4 cae fuera de la aritmética con signo. Sin embargo, la operación ha sido completamente legal, (para la aritmética sin signo) por lo que el bit C de acarreo no nos ha advertido del error. Por lo tanto, si el indicador V ha sido puesto a una tras alguna operación, significará que en la aritmética con signo ha habido un error. El byte del sistema. Recordemos que es el byte más significativo del SR (bits del 8 al 15 del SR). En el se almacenan datos relativos al funcionamiento general del sistema. Puede ser leído por el usuario, pero no alterado por él. (a no ser que se encuentre en un modo especial llamado supervisor). Bits 9-10: Máscara de interrupciones: Fijan un nivel de prioridad (de 0-7) para las interrupciones. Bit 13: Indicador del estado de supervisor. El amiga puede trabajar en dos estados diferentes: Usuario y supervisor. SS=1 significa modo supervisor o usuario en caso contrario. En modo supervisor se tiene acceso a todos los recursos del sistema. Por ejemplo los sistemas operativos trabajan en modo supervisor, los programas en modo usuario. Más adelante se comprenderá el significado exacto de estos indicadores. Bit 15: Modo traza. (se explicará mas adelante). De ahora en adelante, identificaremos por b a un byte (8 bits), w a un grupo de 16 bits (palabra) y l a una doble palabra (32 bits). En adelante iremos viendo instrucciones que operarán con datos de esta forma. La mayoría de estas instrucciones pueden trabajar con los tres tipos de datos indistintamente, por lo que sustituiremos las 3 por z. Así por ejemplo ADD.z significa que está operando o con un byte, o con una palabra o con una doble palabra indistintamente. DOBLE PALABRA: 31 ..... 23 ..... 15 ..... 7 .... 0 (.L) (32 Bits) PALABRA: 15 ..... 7 .... 0 (.W) (16 bits) BYTE: 7 .... 0 (.B) (8 bits) ¿Cómo accede el procesador a la memoria y cómo podemos nosotros utilizarla? El acceso a la memoria se puede hacer de varios modos. Aquí nos detendremos en el direccionamiento inmediato y absoluto. Ej: La instrucción "move" significa mover. Si escribimos "move #2,d0 llevará 2 ($ -> en hexadecimal) al registro d0, con lo cual ahora d0=2 Sin embargo, move #1, $1023 llevará 1 a la posición de memoria $1023 (hexad.). Vemos que ésta última forma, se caracteriza por llevar un número (se representa #n) a una determinada dirección. Es el llamado direccionamiento INMEDIATO, pues el número y la dirección están fijos. Otro modo de direccionamiento, es el ABSOLUTO. Veámoslo con un ejemplo: MOVE.L $1000,D3 ADD.L $1004,D3 MOVE.L D3,$1008 Aquí no trabajamos con números fijos, sino con registros y direcciones fijas de memoria (pero no son fijos los contenidos de las direcciones) En la primera línea llevamos el
contenido de la dirección 1000 al registro D3. Así si en
la dirección mil había un 5, ahora D3=5 Notas: - Como véis la diferencia fundamental es: MOVE.L $1000,D0 ;Direccionamiento Absoluto.Llevamos el contenido de la
dirección $1000 al registro D3
MOVE.L #$1000,D0;Direccionamiento Directo. Llevamos el NUMERO (#) $1000 al
;registro D3. Ahora D3=$1000
- Hemos utilizado .L , esto quiere decir que hemos tratado con Dobles palabras.(32 bits). Por eso hemos ido saltando las direcciones de 4 en 4: $1000,$1004,$1008... (4x8=32 bits). - ¿Qué hubiera ocurrido si... MOVE.L $1000,D3 ADD.L $1001,D3; ¡Cuidado!. De $1000 a $1001 hay un sólo bit, luego no sería correcto. Esto nos lleva a una regla importante: Las direcciones utilizadas para palabras y dobles palabras deben ser siempre pares.
MOVE #1,A0 ;Llevará 1 al registro A0. Luego ahora A0=1
MOVE.B $1000,A0 ; En esta ocasión llevamos el byte que se encuentra en la
posición 1000 al registro A0
MOVE.L A0,D0 ;Lleva el contenido de los 4 bytes de A0 a D0.
CLR.B A0;pone el byte más bajo de A0 completamente a cero Es lógico que al utilizar esta instrucción, pone el indicador del CCR correspondiente a Z (Zero) a 1.
ADD.L D0,D1; Añade los 32 bits de D0 a D1. Si por ejemplo D1=1, D2=135, NOTA: De los comandos MOVE y ADD hay muchas variantes:MOVEQ, ADDI,... pero éstas se explicarán conforme vayan saliendo.
Por hoy, ya está bien. Perdón por los errores que pueda haber, que seguro que los hay. Espero vuestras preguntas... ¡Hasta la próxima! |