Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Регистр связи (сокращенно 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}, объединяя все необходимые записи в память.
A link register (LR for short) is a register which holds the address to return to when a subroutine call completes. This is more efficient than the more traditional scheme of storing return addresses on a call stack, sometimes called a machine stack. The link register does not require the writes and reads of the memory containing the stack which can save a considerable percentage of execution time with repeated calls of small subroutines. The IBM POWER architecture, and its PowerPC and Power ISA successors, have a special purpose link register, into which subroutine call instructions put the return address. In some other instruction sets, such as the ARM architectures, SPARC, and OpenRISC, subroutine call instructions put the return address into a specific general purpose register, so that register is designated by the instruction set architecture as the link register. In some others, such as PA RISC, RISC V, and the IBM System/360 and its successors, including z/Architecture, the subroutine call instruction can store the return address in any general purpose register; a particular register is usually chosen, by convention, to be used as the link register. The ARMv7 architecture uses general purpose register R14 as the link register, OpenRISC uses register r9, and SPARC uses "output register 7" or o7. Some architectures have two link registers: a standard "branch link register" for most subroutine calls, and a special "interrupt link register" for interrupts. One of these is ARCv2 (ARC processors using version 2 of the ARCompact architecture), which uses general purpose registers r29 for the interrupt link register and r31 for the branch link register. References to "the link register" on such platforms will be referring to the branch link register. Earlier ARC processors based on the ARCompact and ARCtangent architectures had three link registers: two interrupt link registers (ILINK) and one branch link register (BLINK). The two interrupt link registers were ILINK1 (for level 1 (low priority) maskable interrupts), and ILINK2 (for level 2 (mid priority) maskable interrupts). In these architectures, r29 was used as the level 1 interrupt link register, r30 as the level 2 interrupt link register, and r31 as the branch link register. ILINK1 and ILINK2 were not accessible in user mode on the ARC 700 processors. The use of a link register, regardless of whether it is a dedicated register or a general purpose register, allows for faster calls to leaf subroutines. When the subroutine is non leaf, passing the return address in a register can still result in generation of more efficient code for thunks, e. g. for a subroutine whose sole purpose is to call another subroutine with arguments rearranged in some way. Other subroutines can benefit from the use of the link register because it can be saved in a batch with other callee used registers—e. g. an ARM subroutine pushes registers 4 7 along with the link register, LR, by the single instruction
STMDB SP!, {R4 R7, LR} pipelining all memory writes required.