Использование RIS C V ra и MIPS $ ra фактически одинаково независимо от назначения.
Поскольку оба абонента (которым необходимо вернуться к своему вызывающему абоненту) и (не лист) Вызываемому необходимо переназначить регистр адреса возврата, значение в этом регистре должно быть сохранено. Единственный логичный способ сделать это - сохранить регистр один раз при входе и восстановить его один раз при выходе точно так же, как сохраненные регистры s / $ s, сохраняемые при вызове.
Однако после сохранения адрес возврата регистр может быть переназначен функциями для других целей, и любое такое использование будет следовать соглашениям о сохранении вызывающей стороны (в отличие от регистров $ s, которые гарантированно будут сохраняться при вызове).
Таким образом, по сути, ra / $ ra может вести себя в разное время как при сохранении вызывающего, так и при сохранении вызывающего.
Вызывающая сторона не может полагаться на значение, помещенное в ra / $ ra, переживающего вызов функции (как они могли бы с помощью регистров $ s), таким образом это звонящий спасает. Тем не менее, когда вызываемый сохраняет ra / $ ra, он сохраняет его так же, как и регистры сохранения сохраняемого $ s - а именно в прологе / эпилоге.
В отличие от этого, регистры $ t, если они сохраняются вызывающим объектом чтобы пережить вызов функции, должен быть сохранен после каждого обновления значения (например, минимально после первой инициализации), и это сохраняет поведение вызывающей стороны. Эти регистры сначала инициализируются, затем сохраняются, тогда как регистры $ s сохраняются в первую очередь, а затем инициализируются.
ra / $ ra имеет поведение как для сохраняемых, так и для вызывающих: его необходимо сохранить перед инициализацией и повторным использованием / repurposed, который является подходом сохранения вызовов, однако переменная, помещенная в $ ra, не выдержит вызова функции, и поэтому для того, чтобы пережить вызов функции, ее необходимо инициализировать, а затем сохранить.