Почему $ ra сохраняется в RIS C -V - PullRequest
4 голосов
/ 11 января 2020

Я считаю, что в RIS C -V, ra сохраняется вызывающим, в MIPS, ra является вызываемым, что означает, что в RIS C -V вызываемый может напрямую изменять значение в ra без сохранить, но с тех пор, как ra изменилось, как вызываемый абонент возвращается к вызывающему абоненту?

Ответы [ 2 ]

3 голосов
/ 11 января 2020

Использование RIS C V ra и MIPS $ ra фактически одинаково независимо от назначения.

Поскольку оба абонента (которым необходимо вернуться к своему вызывающему абоненту) и (не лист) Вызываемому необходимо переназначить регистр адреса возврата, значение в этом регистре должно быть сохранено. Единственный логичный способ сделать это - сохранить регистр один раз при входе и восстановить его один раз при выходе точно так же, как сохраненные регистры s / $ s, сохраняемые при вызове.

Однако после сохранения адрес возврата регистр может быть переназначен функциями для других целей, и любое такое использование будет следовать соглашениям о сохранении вызывающей стороны (в отличие от регистров $ s, которые гарантированно будут сохраняться при вызове).

Таким образом, по сути, ra / $ ra может вести себя в разное время как при сохранении вызывающего, так и при сохранении вызывающего.

Вызывающая сторона не может полагаться на значение, помещенное в ra / $ ra, переживающего вызов функции (как они могли бы с помощью регистров $ s), таким образом это звонящий спасает. Тем не менее, когда вызываемый сохраняет ra / $ ra, он сохраняет его так же, как и регистры сохранения сохраняемого $ s - а именно в прологе / эпилоге.

В отличие от этого, регистры $ t, если они сохраняются вызывающим объектом чтобы пережить вызов функции, должен быть сохранен после каждого обновления значения (например, минимально после первой инициализации), и это сохраняет поведение вызывающей стороны. Эти регистры сначала инициализируются, затем сохраняются, тогда как регистры $ s сохраняются в первую очередь, а затем инициализируются.

ra / $ ra имеет поведение как для сохраняемых, так и для вызывающих: его необходимо сохранить перед инициализацией и повторным использованием / repurposed, который является подходом сохранения вызовов, однако переменная, помещенная в $ ra, не выдержит вызова функции, и поэтому для того, чтобы пережить вызов функции, ее необходимо инициализировать, а затем сохранить.

2 голосов
/ 11 января 2020

Я обнаружил, что в RIS C -V ra сохраняется вызывающим абонентом

Тот факт, что ra является регистром, сохраненным вызывающим абонентом, означает, что вызывающий абонент может ' Предположим, что его значение сохраняется, когда поток управления возвращается к нему. Следовательно, если вызывающий объект хочет сохранить ra, он должен сохранить ra перед передачей элемента управления вызываемому объекту.

Передача управления в подпрограммы может быть достигнута с помощью jal и jalr. Они оба загружают адрес следующей инструкции - обратный адрес - в регистр назначения (обычно ra). Таким образом, в общем случае:

  • ra в момент вызова подпрограммы перекрывается.
  • ra содержит адрес возврата на go назад к текущему вызывающая подпрограмма.

Первый пункт подразумевает, что регистр ra не сохраняется между вызовами. Таким образом, если подпрограмма хочет сохранить ra - адрес возврата для своей подпрограммы вызывающего - при вызове подпрограммы, она должна сохранить ra перед выполнением вызова.

в RIS C -V вызываемый может напрямую изменить значение в ra без сохранения, но, поскольку ra изменился, как вызываемый абонент возвращается обратно к вызывающему?

Если вызываемый абонент теряет адрес возврата для своего вызывающего, нет возможности вернуться к звонящему. Вот почему ra необходимо сохранить перед вызовом, потому что он засорен при выполнении вызова.

...