Ответ 1
Нет никакой разницы между временными и сохраненными переменными в том, как они работают. Разница заключается в том, как они используются, а точнее, как они должны использоваться.
Соглашение о вызове MIPS указывает, как использовать различные регистры - регистры $v
- для возврата функций, регистры $a
- для аргументов функции, переменные $t
- это временные регистры, сохраненные вызывающим абонентом, в то время как регистры $s
сохраняются.
Разница между вызываемым абонентом и вызывающим абонентом заключается в следующем: при вызове функции соглашение гарантирует, что регистры $s
совпадают после возврата, тогда как соглашение не гарантирует это для регистров $t
. Конечно, это означает, что если вы хотите использовать регистры $s
в рутине, вы должны сохранить и восстановить их значения. Например, если функция A использует регистры $t0
и $s0
, а затем вызывает функцию B, она должна сохранять регистр $t0
, если он хочет использовать его после возвращения функции B. Функция B должна сохранить $s0
, прежде чем начать ее использовать.
Пример:
main:
li $s0 7
li $t0 7
jal myFunction
#$s0 guaranteed to equal 7
#$t0 value not guaranteed
Эта ссылка выглядит как некоторая более подробная информация.
Конечно, все это только соглашение, и поэтому оно работает только в том случае, если вы и другие программы соблюдаете соглашение, сохраняя и восстанавливая регистры $s
, чтобы они не были перезаписаны вызовом функции.