MIPS: разница между регистрами - PullRequest
0 голосов
/ 21 февраля 2019

Я сейчас изучаю язык ассемблера MIPS и до сих пор не совсем понимаю разницу между следующими регистрами: $ at, $ a, $ t, $ s, $ v. Более конкретнокогда я должен использовать то, что

1 Ответ

0 голосов
/ 21 февраля 2019

Регистры используются в отношении аппаратных или программных соглашений.

Некоторые регистры имеют значение, заложенное в архитектуре набора команд.Например, вызов функции с 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, но для других регистров вы можете делать то, что вы хотите.Но при использовании компиляторов, компоновщиков и т. Д. Необходимо соблюдать эти соглашения о программном обеспечении;иначе ваш код, вероятно, не будет работать.

...