Registros del CPU - MC9S08QE128

De Wikitronica
Revisión del 15:07 8 nov 2013 de JCaceres (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar
Registros del CPU.png

Un "registro" es una memoria de alta velocidad, que se utiliza en los microprocesadores para acceder a información importante de manera rápida. Generalmente, los registros se miden de acuerdo al número de bits que almacenan, (por ejemplo, registros de 8 bits o de 16 bits) y pueden contener datos, direcciones de memoria o información acerca del estatus del sistema.

En el caso de los registros del CPU del MC9S08QE128, se refieren a los registros más importantes del CPU que tienes diferentes funciones. Algunos indican el estatus general del sistema así como otros guardan datos o direcciones importantes. Al realizar la simulación de un programa en CODEWARRIOR, podemos observar en un recuadro los datos que guardan estos registros, para tener una idea general de lo que está sucediendo en el DEMOQE. En este artículo mencionaremos cinco, que son los más importantes y los que más se utilizan al momento de programar.

Acumulador

El acumulador es un registro de propósito general de 8 bits, donde se guardan temporalmente datos con los cuales se ejecutará una operación lógica o aritmética por la ULA (Unidad Aritmético- Lógica) del CPU. Generalmente luego de ejecutarse estas operaciones, el resultado también suele guardarse allí. Muchas instrucciones utilizan al acumulador como intermediario para ejecutar ciertas funciones. Así, se pueden cargar datos al acumulador desde direcciones de memoria, o también se puede guardar el dato contenido en el acumulador en alguna dirección.

Cabe destacar además que el reset no tiene ningún efecto sobre el acumulador.

Por ejemplo:

LDA  #$01         ; Se carga el número 01 en hexadecimal al acumulador
ADD  #$02         ; Se suma el número 02 en hexadecimal al valor en el acumulador y se guarda en el acumulador

STA  Suma         ; Se guarda el resultado en la variable "suma"

La mayoría de las instrucciones del DEMOQE utilizan al acumulador. Para saber en detalle cómo lo utilizan, se debe revisar el manual de instrucciones.

Registro H:X

El registro H:X es un registro de propósito general de 16 bits, que pueden ser tratados como dos registros separados, es decir, como un registro H y un registro X de 8 bits cada uno. El registro X almacena los 8 bits menos significativos, y el registro H los 8 bits más significativos. Todas las instrucciones de direccionamiento indexado utilizan este registro, ya que es útil para guardar direcciones de memoria por tratarse de un registro de 16 bits. Así, pueden direccionarse muchas más posiciones de memoria que con un registro de 8 bits. El registro X puede ser manipulado de muchas maneras dependiendo de la instrucción que se esté utilizando. Puede ser incrementado, decrementado, transferido al acumulador, entre otras.

El registro H:X es especialmente útil cuando se quiere manipular directamente una dirección de memoria, y realizar operaciones aritméticas o lógicas con ella.

Además, durante el reset se coloca el contenido del registro H en $00, pero no tiene ningún efecto sobre el registro X. También es importante destacar que cuando se produce una interrupción, en la pila se guarda sólo el registro X, pero no el registro H. Por ello, si se va a trabajar con el registro H:X, es importante tomar en cuenta que debemos guardar manualmente el registro H en la pila al entrar en la interrupción, y sacarlo de la pila al retornar de la misma.

A continuación se mostrará un ejemplo de como realizar operaciones con el registro H:X

LDHX  #$00         ; Se carga el número 00 en hexadecimal al registro H:X
TXA                ; Se transfiere el valor del registro X al acumulador
ADD #$05           ; Se suma el valor 05 al acumulador
TAX                ; Transfiere el valor del acumulador al registro X

                   ; En el registro H:X se encuentra el valor binario %00000000 00000101 ($0005 en hexadecimal)

STHX  Memoria      ; Se guarda el resultado en la variable "suma"

Registro SP

El registro SP es un registro de 16 bits, que funciona como un apuntador a la próxima dirección disponible en donde se puede guardar un dato en la pila (stack). La pila, es un espacio de memoria muy útil para guardar las direcciones de memoria y los registros más importantes a donde debe regresar el CPU luego de una interrupción o de una llamada a subrutina (para más información ver el artículo Interrupciones.También se utiliza para guardar variables locales, o para realizar operaciones aritméticas. Existen muchas instrucciones que involucran al registro SP, para guardar o retirar datos de la pila, entre otras.

Uso de la pila y registro SP

La pila puede localizarse en cualquier parte de la memoria RAM, simplemente cambiando la dirección del registro SP. Es importante destacar que mientras los datos de memoria se van guardando desde menores a mayores direcciones de memoria, la pila guarda sus datos en sentido inverso, es decir, la pila va creciendo hacia menores direcciones de memoria. Por ello, se suele inicializar el registro SP al final de la memoria RAM. Así, se le da más espacio a la pila y se evitan incidentes de que se superpongan datos que se guardan en la pila con los datos que se van guardando en otras posiciones de la memoria RAM.

Un ejemplo de la inicialización de la pila es el siguiente:

LDHX   #RAMEnd + 1       ; Se carga en el registro H:X una etiqueta que corresponde al valor $17FF + $1 = $1800

TXS                      ; Se transfiere el contenido del registro H:X al registro SP

Registro PC

El registro PC (Program Counter), es un registro de 16 bits que indica la próxima instrucción que será ejecutada en la secuencia de un programa. Para hacer esto, en realidad este registro se carga con la dirección de la próxima instrucción a ser ejecutada.

Cuando se está ejecutando una instrucción de salto, una subrutina o una interrupción, el registro PC se carga con la próxima instrucción que se encuentra dentro de la subrutina o la interrupción que se va a ejecutar, mas no con la que se encuentra inmediatamente después de dicha interrupción. Por ello, es necesario guardar en la pila la información acerca de a dónde debe regresar el programa luego de ejecutarse la subrutina o interrupción. Para más información al respecto se recomienda revisar el artículo Interrupciones.

Durante el Reset, el registro PC se carga con la dirección contenida en el vector de interrupción del reset, que se debe de haber indicado a partir de la dirección FFFE que corresponde a la dirección del vector de interrupción. Este vector contiene la dirección de la primera instrucción a donde debe regresar el programa luego de producirse el reset.

Registro CCR

El registro CCR (Condition Code Register), es un registro de 8 bits que indica el estado del sistema luego de ejecutarse una instrucción, por ejemplo, si el resultado de una operación fue cero, negativo, si hubo desbordamiento, entre otras. A continuación se explicará lo que indica cada uno de los bits que integran este registro.

CCR.png
  • Bandera de complemento a dos (V): Si el bit 7 del registro está en 1, entonces quiere decir que alguna instrucción produjo overflow por complemento a dos.
0 No hubo overflow
1 Hubo overflow
  • Bandera de "Half Carry" (H): Esta bandera se coloca en 1 cuando se produce un acarreo entre los bits 3 y 4 del acumulador, es decir, cuando hay acarreo desde la mitad inferior del byte del acumulador hacia la mitad superior luego de producirse una operación de suma.
0 No hubo carry entre los bits 3 y 4 del acumulador
1 Hubo carry entre los bits 3 y 4 del acumulador
  • Bandera de Máscara de Interrupción (I): Cuando esta bandera se encuentra en 1, quiere decir que hay una interrupción en curso, y que ninguna otra interrupción puede producirse hasta que esta bandera vuelva a 0. Al producirse una interrupción, se coloca este bit en 1 justo antes de ejecutarse la primera instrucción de la misma, de manera que no pueda atenderse otra interrupción mientras la primera está en curso. Esto define a las interrupciones "enmascarables", ya que estas no pueden ejecutarse a menos que el bit I de este registro se encuentre en 0.
0 Habilita interrupciones enmascarables
1 Deshabilita interrupciones enmascarables
  • Bandera del Negativo (N): Esta bandera se coloca en 1 cuando el resultado de una operación aritmética o lógica da como resultado un número negativo. Esto se determina evaluando el bit más significativo del registro que contiene el resultado: si este es 1, por estar en complemento a dos se sabe que el resultado es negativo.
0 No se produjo un resultado negativo
1 Se produjo un resultado negativo
  • Bandera del Cero (Z): Esta bandera se coloca en 1 cuando el resultado de una operación lógica o aritmética da como resultado un cero. Cabe destacar que simplemente cargando o guardando un dato, se despliega esta bandera si dicho dato resulta ser cero.
0 No se produjo un resultado igual a cero
1 Se produjo un resultado igual a cero
  • Bandera del "Carry" o "Borrow" (C): Esta bandera se coloca en 1 cuando una operación de suma produce un acarreo más allá del bit 7 del acumulador, o cuando una operación de resta requiere un "borrow".
0 No se produjo un carry luego del bit 7 del acumulador
1 Se produjo un carry luego del bit 7 del acumulador

Cabe destacar que los bits 5 y 6 del regitro siempre se mantienen en 1. Por lo demás, cada una de estas banderas tiene una utilidad muy importante en diferentes áreas. Los bits del cero y el negativo son muy importantes a la hora de pedirle al programa que tome una decisión para realizar una u otra subrutina, es decir, para realizar ramificaciones en el flujo de un programa. Los bits que tienen que ver con el acarreo tienen instrucciones asociadas que realizan saltos de acuerdo al valor de estos bits. Estas resultan útiles dependiendo del programa que se quiera realizar. La máscara de interrupción (bit I), cumple un papel muy importante para evitar interrupciones anidadas. De esta manera, se evita atender más de una interrupción a la vez. Esta condición se puede cambiar simplemente cambiando el valor de este bit, sin embargo según el manual del DEMOQE no es recomendable ya que se producen errores difíciles de detectar y corregir.

Referencias

Contributors

JCaceres, Vegabante