Регистры используются в отношении аппаратных или программных соглашений.
Некоторые регистры имеют значение, заложенное в архитектуре набора команд.Например, вызов функции с jal
сохранит адрес возврата в регистре r31
(он же $ra
).Аналогичным образом r0
(он же $zero
) имеет особое значение и всегда возвращает 0. Поведение этих регистров не может быть изменено без изменения аппаратного обеспечения.
Для обеспечения согласованного поведения различного программного обеспеченияинструменты (компилятор, asm, компоновщик, загрузчик, ОС, ...), соглашения о программном обеспечении уточняют роль некоторых регистров.Эти регистры полностью аналогичны с точки зрения аппаратного обеспечения, но программное обеспечение отводит им особую роль.Эти условные обозначения могут быть изменены без аппаратных модификаций, но для этого потребуется много изменений в цепочке программного обеспечения.
Я до сих пор не совсем понимаю разницу между следующими регистрами: $ at, $ a,$ t, $ s, $ v.
$at
является "временным ассемблером".Он используется ассемблером для расширения макросов с несколькими инструкциями и не должен использоваться для хранения долгосрочных значений, поскольку эта информация может быть уничтожена в любой момент при вызове макроса.
$a0-3
используется для передачипервые аргументы функции (следующие аргументы находятся в стеке).
$v0-1
используется для возврата вычисленного результата функции
$t0-9
и $s0-7
общего назначениярегистры, которые можно свободно использовать в программе.Разница заключается в их сохранности при вызове функций.
$t0-9
- временные регистры с изменчивой скоростью.Предполагается, что они никогда не хранят долгосрочную информацию, и функция вызываемого абонента может использовать их без предосторожности.Если вызывающая сторона хочет сохранить некоторые из них, она несет ответственность за сохранение их до вызова функции и восстановление их значения после возврата функции.Они также называются "сохраненными вызывающими" регистрами.
$v0-7
- временные энергонезависимые регистры.Предполагается, что они содержат долгосрочную информацию, и вызываемым лицам не разрешается использовать какие-либо из них без сохранения их значения в стеке и восстановления его перед возвратом функции.Они также называются «сохраненными вызываемыми» регистрами.
Если вы пишете ассемблерную функцию для изучения MIPS, не используйте $ at, но для других регистров вы можете делать то, что вы хотите.Но при использовании компиляторов, компоновщиков и т. Д. Необходимо соблюдать эти соглашения о программном обеспечении;иначе ваш код, вероятно, не будет работать.