Язык ассемблера MIPS - временный регистр и сохраненные регистры

До сих пор я использовал регистры $s0- $s9 и то же самое, что и регистры $t0- $t9. Мне сказали и читали бесчисленные сообщения и параграфы форума здесь и в Google, объясняющие разницу, но без примеров кодирования. Мне сказали, что я должен видеть разницу, связанную с использованием процедур, но я создал бесчисленное множество сценариев, связанных с процедурами, чтобы найти разницу между сохраненными регистрами и временным регистром, но я потерпел неудачу.

Я бы убил, чтобы увидеть относительно простой пример, когда регистр $t0-9 не будет действовать так же, как регистр $s0-9, и в результате получится другое значение?

Ответы

Ответ 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, чтобы они не были перезаписаны вызовом функции.