Функция восьми сохраненных регистров (MIPS)

Я наткнулся на это утверждение в своей книге «Организация и проектирование компьютеров» (Patterson & Hennessy):

$s0-$s7: восемь сохраненных регистров, которые должны быть сохранены при вызове процедуры (если они используются, вызываемый объект сохраняет и восстанавливает их)

Я не понимаю, что означает это «сохранение при вызове процедуры».


person funk-shun    schedule 27.02.2011    source источник


Ответы (3)


Это означает, что если вы реализуете подпрограмму (например, вызываемую), вам необходимо сохранить содержимое этих регистров.

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

person payne    schedule 27.02.2011

Обычно мы храним локальные переменные в этих регистрах. Допустим, вы вычисляете факториал числа по следующему алгоритму:

int f(int a){ int t = a-1; return a*f(t); }

В этом случае вы видите, что здесь есть локальные переменные a и t. Поскольку a является аргументом, во время этой процедуры он будет сохранен в $a0-$a3. Однако, скорее всего, вы будете хранить эти аргументы в $s0-$s7 или $t0-$t7. Эта процедура вызывает себя рекурсивно, поэтому значения локальных переменных следует сохранять в стек. (читайте о «записи активации» или «стеке вызовов»). Вы должны поместить эти значения в стек $sp, а затем извлечь их при возврате в случае остановки.

В основном вы сохраняете значения в этом стеке в процедуре или основной программе. Это всего лишь соглашение, вы можете поместить свои значения в регистры $v или $t или $a, они тоже будут работать, но из-за сложности программы все может испортиться.

Если ваша процедура использует $s регистров, перед вызовом этой процедуры вы должны сохранить эти регистры в стеке, чтобы "сохранить" их, если ваша процедура исчерпает $t регистров.

Если вы берете на себя этот вопрос, не беспокойтесь об этом прямо сейчас, вы узнаете намного больше позже.

person Ahmet Alp Balkan    schedule 27.02.2011

регистр s0-s7 (мягкие регистры) (также известные как физические регистры $16-$20) являются временными регистрами, они сохраняются при использовании C/C++.

Если вы не пишете ассемблер, вам вообще не о чем беспокоиться, так как это обычный abi (двоичный интерфейс приложения).

Некоторые закладки из моей коллекции могут помочь, если вам нужно что-то почитать... или вам не спится :-)

[Вики-запись на MIPS][1]

[Примечания ABI][2]

person Stephen Gennard    schedule 27.02.2011