Введение

Регистр связи (сокращенно LR) — это регистр, который хранит адрес возврата при завершении вызова подпрограммы. Это эффективнее, чем более традиционная схема хранения адресов возврата в стеке вызовов, иногда называемом машинным стеком. Регистр связи не требует операций записи и чтения памяти, содержащей стек, что может сэкономить значительный процент времени выполнения при многократных вызовах небольших подпрограмм. Архитектура IBM POWER и её последователи PowerPC и Power ISA имеют специальный регистр связи, в который инструкции вызова подпрограммы помещают адрес возврата. В некоторых других наборах инструкций, таких как архитектуры ARM, SPARC и OpenRISC, инструкции вызова подпрограмм помещают адрес возврата в конкретный регистр общего назначения, который архитектура набора инструкций определяет как регистр связи. В других, таких как PA RISC, RISC V, IBM System/360 и её последователи, включая z/Architecture, инструкция вызова подпрограммы может сохранять адрес возврата в любом регистре общего назначения; конкретный регистр обычно выбирается по соглашению для использования в качестве регистра связи. Архитектура ARMv7 использует регистр общего назначения R14 в качестве регистра связи, OpenRISC использует регистр r9, а SPARC использует "выходной регистр 7" или o7. Некоторые архитектуры имеют два регистра связи: стандартный "регистр связи при переходе" для большинства вызовов подпрограмм и специальный "регистр связи при прерывании" для прерываний. Один из них — ARCv2 (процессоры ARC, использующие версию 2 архитектуры ARCompact), который использует регистры общего назначения r29 для регистра связи при прерывании и r31 для регистра связи при переходе. Ссылки на "регистр связи" на таких платформах обычно относятся к регистру связи при переходе. Более ранние процессоры ARC, основанные на архитектурах ARCompact и ARCtangent, имели три регистра связи: два регистра связи при прерывании (ILINK) и один регистр связи при переходе (BLINK). Два регистра связи при прерывании были ILINK1 (для маскируемых прерываний уровня 1 (низкий приоритет)) и ILINK2 (для маскируемых прерываний уровня 2 (средний приоритет)). В этих архитектурах r29 использовался как регистр связи при прерывании уровня 1, r30 — как регистр связи при прерывании уровня 2, а r31 — как регистр связи при переходе. ILINK1 и ILINK2 были недоступны в пользовательском режиме на процессорах ARC 700. Использование регистра связи, независимо от того, является ли он выделенным регистром или регистром общего назначения, позволяет быстрее вызывать листовые подпрограммы. Когда подпрограмма не является листовой, передача адреса возврата в регистре все равно может привести к генерации более эффективного кода для заглушек, например, для подпрограммы, единственной целью которой является вызов другой подпрограммы с переупорядоченными аргументами. Другие подпрограммы также могут выиграть от использования регистра связи, поскольку его можно сохранить вместе с другими регистрами, используемыми вызываемой функцией. Например, подпрограмма ARM помещает регистры 4 и 7 вместе с регистром связи LR в стек одной инструкцией STMDB SP!, {R4 R7, LR}, объединяя все необходимые записи в память.