MIPS сохранены и временно

Я читал кое-что, описывающее разницу между $S и $T. Кажется, я не могу понять, в чем именно разница. Итак, для начинающего программиста, который только начал изучать RISC.

В чем именно разница с точки зрения непрофессионалов? Кажется, они должны делать то же самое для сложения, вычитания? Разница заключается в массивах?

Спасибо!


person user3175173    schedule 12.01.2014    source источник
comment
Это не имеет никакого отношения ни к RISC, ни к MIPS, кроме того, что это платформа, которая использует это соглашение об именах, соглашение о вызовах и сборку.   -  person old_timer    schedule 13.01.2014


Ответы (2)


Нет никакой разницы в том, как работают регистры. Существует разница в том, как обычно используются регистры. В соответствии с соглашением о вызовах MIPS, значения $S регистрируют $S0,.. ,$S7 сохраняются при вызовах функций, а значения регистров $T0,...,$T9 могут быть изменены вызываемой функцией.

Рассмотрим следующий код в качестве конкретного примера: (Обратите внимание, что syscall в основном является вызовом функции.)

li   $s3, 42
li   $t0, 81
move $a0, $t0         # the value in $a0 will be printed
li   $v0, 1           # syscall 1 is print integer
syscall

После syscall соглашение о вызовах по-прежнему гарантирует, что $s3 будет иметь значение 42, а значения других регистров $sxx не изменятся. Мы не знаем, каким будет значение $T0 после вызова, потому что соглашение не требует сохранения его значения.

(Отредактировано, чтобы добавить пример.)

person markgz    schedule 13.01.2014
comment
сохраняются при вызовах функций, регистры могут быть изменены вызываемой функцией. Это та часть, которую мне трудно понять. Можете ли вы привести простой пример? Это бы очень помогло! - person user3175173; 13.01.2014
comment
@user3175173 user3175173 Боюсь, это не будет иметь смысла, пока вы не поймете концепцию вызова функции. Может быть, было бы полезно думать о них как о t=временных и s=менее временных? Пока вы не начнете использовать jal и jr $ra, вам не нужно беспокоиться о разнице между $t# и $s#. - person RobertB; 15.01.2014

Они совершенно одинаковы, это просто регистры. Единственное отличие заключается в соглашении о вызовах, протоколе вызова функций:

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

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

person Community    schedule 13.01.2014