Inicio>8051>Set de Instrucciones
ACALL
Sintaxis: ACALL dir_11
Función: Llamada absoluta (incondicional) a subrutina dentro del mismo bloque memoria de 2 KBytes.
Instrucción | Código Operación | 2º Byte | Bytes | Ciclos | Flags |
ACALL dir_11 | d10 d9 d8 1 0 0 0 0 | d7-d0 | 2 | 2 | – |
Descripción
ACALL realiza una llamada incondicional a la subrutina situada en la dirección indicada. ACALL incrementa el Contador de Programa (PC o Program Counter) dos veces para obtener la dirección de la siguiente instrucción a ejecutar tras la vuelta de la subrutina, luego guarda dicha dirección en la pila (el byte de menor peso en primer lugar). En consecuencia el apuntador de Pila (SP o Stack Pointer) incrementa su valor en 2. Posteriormente el control del programa se transfiere a la dirección indicada en la instrucción.
PC ⇐ PC + 2
SP ⇐ SP + 1
(SP) ⇐ PC7-0
SP ⇐ SP + 1
(SP) ⇐ PC15-8
PC10-0 ⇐ dir_11
La dirección de salto, o nuevo valor para el PC se obtiene uniendo a los 5 bits de mayor peso del PC ya incrementado, los bits 7-5 del código de operación y el segundo byte de la instrucción.
Como la instrucción ACALL sólo afecta a los 11 bits de menor peso del PC, la llamada siempre se produce a una dirección de memoria de código situada dentro del bloque de memoria de 2 KBytes al que pertenece el primer byte (el de más peso) de la instrucción que sigue al ACALL.
2 KByte = 1000 0000 0000 en binario
^_________ bit 11
Se puede utilizar ACALL en lugar de la llamada genérica LCALL (llamada a cualquier dirección dentro de los 64 KBytes que puede direccionar el 8051) para ahorrar un byte de memoria de programa, pero es necesario asegurarse de que tanto la llamada a la subrutina, como la propia subrutina se encuentran dentro del mismo bloque de memoria de 2 KBytes (Bloque 1: 0000H-07FFH / Bloque 2: 0800H-0FFFH / Bloque 3: 1000H-17FFH … Bloque 32: F800H-FFFFH)
Cuando el microcontrolador 8051 que se está programando cuenta con menos de 2 KBytes de memoria de programa, es muy recomendable utilizar ACALL en lugar de LCALL.
A la vuelta de la ejecución de la subrutina llamada por ACALL, se liberan las dos posiciones de memoria de la Pila (Stack) que se utilizaron para almacenar temporalmente la dirección de vuelta, y a continuación se ejecuta la instrucción que sigue a la llamada ACALL que se realizó.
Ejemplo
ACALL #0100h : Salta a ejecutar el programa a partir de la dirección 0100H.
ACALL Label : Salta a ejecutar el programa a partir de la dirección etiquetada como Label.
De modo que:
ACALL DecBCD ; Salta a la dirección etiquetada como DecBCD.
….
DecBCD: ; Etiqueta DecBCD. El ensamblador le asignará una dirección.
<Ejecuta instrucciones>
RET ; Retorna a la siguiente dirección tras instrucción ACALL.
….
Véase también: LCALL, RET