Я пытался узнать язык Mips Assembly, но мне сложно узнать, какие регистры использовать в разных ситуациях. Как Когда я использую $ v0, $ a0 или $ t1 ...Как я могу узнать, какие регистры использовать в программе Mips
ответ
Когда вы не используете любой код, написанный другими, в том числе системных вызовов, вы можете использовать регистры, однако вы хотите, при условии, что $at
зарезервирован для ассемблера и что $ra
неявно используется jal
/jalr
.
Это очень маловероятно, что вы не будете использовать системный вызов или какой-либо код, написанный другими пользователями.
Чтобы компиляторы и люди использовали подпрограммы, не глядя на их код, между экспертами устанавливается конвенция.
Он называется Application Binary Interface (ABI) и MIPS got one too.
В ABI указывается, как используются регистры.
Вы должны уважать ABI всякий раз, когда:
- Вы можете использовать код, уважать ABI уже. В этом случае ABI в основном информативен, он сообщает вам, где функция ожидает аргумент и какие регистры он использует.
- Если вы хотите быть совместимым с кодом или инструментами, которые ожидают ABI.
Когда вы пишете функцию, которую вы позже передадите коллеге, приятно написать ее в отношении ABI. Таким образом, они уже привыкли к конвенции, и они сочтут естественным использовать ее.
Если вы используете компилятор, он наверняка скомпилирует исходный код, соответствующий ABI, и поэтому он ожидает, что любая сборка, созданная человеком, сделает это.
Цитируя MIPS32 ABI это использование регистров:
$ 0 ($ ноль) всегда имеет значение 0.
$ в ($ AT) временный обычно используется ассемблером. [Никогда пользователь его]
$ 2 .. $ 3 ($ v0- $ v1) используется для оценки экспрессии и для удержания функции возвращают значения целое число и тип указателя. [$ v0, где целые функции положить их возвращаемое значение]
$ 4 .. $ 7 ($ a0- $ a3) используется для передачи аргументов в функции; значения не равны , сохраненным во всех вызовах функций. Дополнительные аргументы передаются в стек, как описано ниже. [Это где аргументы идут]
$ 8- $ 15 ($ t0- $ t7) временных регистров, используемых для оценки экспрессии; значения не сохраняются во всех вызовах функций.
$ 16- $ 23 ($ s0- $ s7) сохраненные регистры; значения сохраняются во всех функциях вызовов . [Если вы используете эти внутри функции, сохранять и восстанавливать их]
$ 24 .. $ 25 ($ t8- $ t9) временные регистры, используемые для оценки экспрессии; Значения не сохраняются во всех вызовах функций. Когда вызывающие позиции независимые функции $ 25 должны содержать адрес вызываемой функции.
$ 26- $ 27 ($ kt0- $ kt1) Используется только операционной системой.
$ 28 ($ gp) глобальный указатель и указатель контекста. [Используется компилятором]
$ 29 ($ зр) зр указатель стека. [Используйте это для стека]
$ 30 ($ S8) сохранены регистра (например, s0-s7). [Сохранить и восстановить это в функциях в случае изменения]
$ 31 ($ ра) обратный адрес. Обратный адрес - это адрес , который должен возвращать функцию. [Задается
jal
/jalr
]
Мы не предоставляем учебники или рекомендовать книги. Если ваш вопрос может стоять без последнего абзаца, отредактируйте его (нижний левый угол, ссылка «редактировать»). Если нет, подумайте об удалении. –