Кто отвечает за сохранение сохраненных в регистре регистров в MIPS? - PullRequest
0 голосов
/ 18 мая 2018

Когда в MIPS вызывается подпрограмма, поскольку сохраненные в вызове регистры ($ s0- $ s7) сохраняются при вызовах функций / подпрограмм, они сохраняются в стековом кадре подпрограммы, если они будут изменены.Кто несет ответственность за их спасение?Являюсь ли я программистом сборки, ответственным за сохранение этих регистров, сохраненных при вызове, путем написания инструкций для сохранения их в стек?Или ассемблер каким-то образом управляет сохранением сохраненных в вызове регистров автоматически при вызове для меня подпрограммы, чтобы они сохранялись при вызовах?Я только изучаю соглашения о вызовах MIPS, так что это совершенно новое для меня.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

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

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

Гораздо лучшая терминология: сохраняемый вызов или закрытый вызов. В обоих случаях вы смотрите на регистры с одной и той же точки зрения, а также не подразумеваете, чтона самом деле кто-то тратит впустую инструкции, делая какие-либо сбережения.Просто позвольте регистрам быть захваченными, если вам не нужно значение в них после jal.

Вы можете использовать регистры с вызовом, такие как $t0..$t9, для всего, что вы хотите, и вы можете вернуться с ними, удерживаякакой бы мусор не оставался после вашего кода.

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

0 голосов
/ 18 мая 2018

Вы несете ответственность, работа ассемблера заключается в преобразовании написанного вами в машинный код.

...