Ваша функция не должна буквально сохранять / восстанавливать их, вы просто должны убедиться, что они по-прежнему имеют свое первоначальное значение, когда ваша функция вернется. Самый простой способ сделать это - вообще не касаться этих регистров.
Сохраненные регистры вызывающего и вызываемого абонентов вводят в заблуждение терминологией и неверно подразумевают, что все регистры должны сохраняться где-то каждый раз, когда естьвызов функции.
Гораздо лучшая терминология: сохраняемый вызов или закрытый вызов. В обоих случаях вы смотрите на регистры с одной и той же точки зрения, а также не подразумеваете, чтона самом деле кто-то тратит впустую инструкции, делая какие-либо сбережения.Просто позвольте регистрам быть захваченными, если вам не нужно значение в них после jal
.
Вы можете использовать регистры с вызовом, такие как $t0..$t9
, для всего, что вы хотите, и вы можете вернуться с ними, удерживаякакой бы мусор не оставался после вашего кода.
Если вы выполняете вызов функции внутри цикла, вы, вероятно, захотите сохранить пару регистров, сохраняемых при вызове ($s0..$s7
), и использовать один для вашего цикласчетчик.Затем восстановите его в конце своей функции.Вы не хотите хранить / перезагружать его внутри цикла;это было бы большой тратой, если вызываемая вами функция не касается регистра.