Registro de enlace
Un registro de enlace (LR para abreviar) es un registro que contiene la dirección a la que regresar cuando se completa una llamada de subrutina. Esto es más eficiente que el esquema más tradicional de almacenar direcciones de retorno en una pila de llamadas, a veces denominada pila de máquina. El registro de enlace no requiere escrituras y lecturas de la memoria que contiene la pila, lo que puede ahorrar un porcentaje considerable del tiempo de ejecución con llamadas repetidas de pequeñas subrutinas.
La arquitectura IBM POWER y sus sucesores PowerPC y Power ISA tienen un registro de enlace de propósito especial, en el que las instrucciones de llamada de subrutina colocan la dirección del remitente. En algunos otros conjuntos de instrucciones, como las arquitecturas ARM, SPARC y OpenRISC, las instrucciones de llamada de subrutina colocan la dirección de retorno en un registro de propósito general específico, de modo que la arquitectura del conjunto de instrucciones designe ese registro como registro de enlace. En algunos otros, como PA-RISC, RISC-V e IBM System/360 y sus sucesores, incluido z/Architecture, la instrucción de llamada de subrutina puede almacenar la dirección de retorno en cualquier registro de propósito general; Por convención, normalmente se elige un registro concreto para utilizarlo como registro de enlace.
La arquitectura ARMv7 utiliza el registro de propósito general R14 como registro de enlace, OpenRISC usa el registro r9 y SPARC usa el "registro de salida 7" o o7.
Algunas arquitecturas tienen dos registros de enlace: un "registro de enlace de rama" para la mayoría de las llamadas a subrutinas, y un "registro de enlace de interrupción" para interrupciones. Uno de ellos es ARCv2 (procesadores ARC que utilizan la versión 2 de la arquitectura ARCompact), que utiliza registros de propósito general r29 para el registro de enlace de interrupción y r31 para el registro de enlace de rama. Las referencias al "registro de enlaces" en dichas plataformas se hará referencia al registro de enlaces de sucursales.
Los procesadores ARC anteriores basados en las arquitecturas ARCompact y ARCtangent tenían tres registros de enlace: dos registros de enlace de interrupción (ILINK) y un registro de enlace de rama (BLINK). Los dos registros de enlace de interrupción eran ILINK1 (para interrupciones enmascarables de nivel 1 (prioridad baja)) e ILINK2 (para interrupciones enmascarables de nivel 2 (prioridad media)). En estas arquitecturas, se utilizó r29 como registro de enlace de interrupción de nivel 1, r30 como registro de enlace de interrupción de nivel 2 y r31 como registro de enlace de rama. No se podía acceder a ILINK1 e ILINK2 en modo de usuario en los procesadores ARC 700.
El uso de un registro de enlace, independientemente de si es un registro dedicado o un registro de propósito general, permite llamadas más rápidas a subrutinas de hoja. Cuando la subrutina no es hoja, pasar la dirección de retorno en un registro aún puede generar un código más eficiente para los procesadores, p. para una subrutina cuyo único propósito es llamar a otra subrutina con argumentos reorganizados de alguna manera. Otras subrutinas pueden beneficiarse del uso del registro de enlace porque se puede guardar en un lote con otros registros utilizados por el destinatario de la llamada, p. una subrutina ARM empuja los registros 4-7 junto con el registro de enlace, LR, mediante una única instrucción
STMDB SP!, {R4-R7, LR}
canaliza todas las escrituras de memoria necesarias.