2016-12-21 6 views
1

Я пытался узнать язык Mips Assembly, но мне сложно узнать, какие регистры использовать в разных ситуациях. Как Когда я использую $ v0, $ a0 или $ t1 ...Как я могу узнать, какие регистры использовать в программе Mips

+0

Мы не предоставляем учебники или рекомендовать книги. Если ваш вопрос может стоять без последнего абзаца, отредактируйте его (нижний левый угол, ссылка «редактировать»). Если нет, подумайте об удалении. –

ответ

3

Когда вы не используете любой код, написанный другими, в том числе системных вызовов, вы можете использовать регистры, однако вы хотите, при условии, что $at зарезервирован для ассемблера и что $ra неявно используется jal/jalr.

Это очень маловероятно, что вы не будете использовать системный вызов или какой-либо код, написанный другими пользователями.
Чтобы компиляторы и люди использовали подпрограммы, не глядя на их код, между экспертами устанавливается конвенция.
Он называется Application Binary Interface (ABI) и MIPS got one too.

В ABI указывается, как используются регистры.
Вы должны уважать ABI всякий раз, когда:

  1. Вы можете использовать код, уважать ABI уже. В этом случае ABI в основном информативен, он сообщает вам, где функция ожидает аргумент и какие регистры он использует.
  2. Если вы хотите быть совместимым с кодом или инструментами, которые ожидают 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]