Instrucciones CALL y Stack en Microcontrolador AVR

CALL es una instrucción de transferencia de control que se utiliza para llamar a una subrutina particular. Una subrutina es un bloque de instrucciones que deben ejecutarse con frecuencia.

En AVR, hay 4 instrucciones para la subrutina de llamada de la siguiente manera.

  1. CALL (subrutina de llamada)
  2. RCALL (subrutina de llamada relativa)
  3. ICALL (llamada indirecta a Z)
  4. EIALL (llamada indirecta extendida a Z)

CALL :
En esta instrucción de 4 bytes, 10 bits se usan para el código de operación y los otros 22 bits se usan para la dirección de la subrutina de destino, al igual que en la instrucción JMP. En esto, el espacio de direcciones de 4M de 000000-$3FFFFF para AVR y se puede usar para llamar a subrutinas dentro del rango de direcciones dado.

Para asegurarse de que el AVR sepa dónde regresar después de la ejecución de la subrutina, el microcontrolador guarda automáticamente la dirección de la instrucción justo debajo de la instrucción CALL en la pila. Después de terminar la ejecución de la subrutina, la instrucción RET transfiere el control de nuevo a la persona que llama. Por lo tanto, cada subrutina tiene una instrucción RET al final.

Stack :
Stack es la parte en la RAM de la CPU para almacenar información temporalmente. La CPU necesita este almacenamiento porque solo hay un número limitado de registros. El registro utilizado para acceder a la pila se denomina registro de puntero de pila (SP).
En el espacio de memoria de E/S, hay 2 registros llamados SPL (el byte bajo de SP) y SPH (el byte alto de
SP). El SP es implementado por estos 2 registros.

En AVRs con más de 256 bytes de memoria tienen dos registros de 8 bits. Por otro lado, si la memoria es menor a 256 bytes, SP se compone solo de SPL, ya que un registro de 8 bits solo puede direccionar 256 bytes de memoria.

El almacenamiento de la información de la CPU en la pila se denomina operación PUSH, y la carga del contenido de la pila nuevamente en la CPU se conoce como operación POP.

Empujar sobre la pila:
El puntero de la pila (SP) apunta a la parte superior de la pila. A medida que empujamos los datos a la pila, los datos se guardan donde apunta el SP y el SP se reduce en uno.

Para empujar un registro a una pila, usamos la instrucción PUSH.

PUSH  Rr; 
Rr can be any general-purpose register (R0 - R31)

Sacar de la pila:
Hacer estallar el contenido de la pila de nuevo en el registro es la función opuesta a empujar. Cuando se ejecuta la instrucción POP, el SP se incrementa en uno y la ubicación superior de la pila se vuelve a copiar en el registro. Esto significa que la pila es LIFO (Last In First Out).

Para recuperar los datos de la pila, usamos la instrucción POP.

POP  Rr; 
Rr can be any general-purpose register (R0 - R31)

Inicialización de punteros de pila:
diferentes AVR tienen diferentes cantidades de RAM. En el ensamblador AVR, RAMEND especifica la dirección de la última ubicación de RAM. Entonces, si queremos inicializar el SP para que apunte a la última ubicación de memoria, simplemente podemos cargar RAMEND en el SP. Observe que SP se compone de 2 registros, SPH y SPL. Entonces, cargamos el byte alto de RAMEND en SPH y el byte bajo de RAMEND en SPL.

Instrucción CALL, instrucción RET y el papel de la pila:
cuando se ejecuta la instrucción CALL, la dirección de la instrucción debajo de la instrucción CALL se coloca en la pila. Cuando finaliza la ejecución de esa subrutina y se ejecuta RET, la dirección de la instrucción debajo de la instrucción CALL se carga en el contador de programa y se ejecuta.

Publicación traducida automáticamente

Artículo escrito por kunalsg18elec y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *