$ zero на MIPS действительно аппаратный ноль?

Я вроде как фирма с сборкой x86-64 (возможно, не эксперт), но многие аспекты похожи от ассемблера одной платформы до следующего, поэтому я также пытаюсь ответить на вопросы, которые на самом деле не находятся в моем диапазоне знаний, и я наткнулся на несколько вопросов о сборке MIPS.

это пробудило мой интерес к деталям, поэтому я проверил несколько онлайн-ресурсов для получения подробной информации. mips.com много читать, но просто для моей быстрые информация:

Это $zero зарегистрировать только обычный ноль или аппаратный ноль?

некоторые источники говорят, что обычно он равен нулю, другие утверждают, что он всегда равен нулю. Или последний просто предполагает, что он равен нулю, потому что это условно?

заранее спасибо за разъяснение (и/или указатели на конкретный документ с сайта MIPS, поэтому мне не нужно сканировать информацию, которая мне на самом деле не нужна).

2 ответов


на окончательно ответ на этот вопрос можно найти в архитектура MIPS32® для программистов Том I: введение в архитектуру MIPS32® (pdf), доступный на mips.com (требуется регистрация). В соответствии с разделом 2.4.8.1 этого документа:

два регистра ЦП общего назначения имеют назначенные функции:

  • r0 жестко привязан к нулевому значению и может использоваться в качестве цели зарегистрируйтесь для любой инструкции, результат которой должен быть отброшен. Р0 может также используется в качестве источника, когда требуется нулевое значение.

  • r31-регистр назначения, используемый JAL, BLTZAL, BLTZALL, BGEZAL и BGEZALL без явного указания в слово инструкции. В противном случае r31 используется как обычный регистр.

остальные регистры доступны для общего назначения.


верхние 5 ссылок говорят, что это hardw(are|ired) ноль.

и, как бы удивительно это ни было, MIPS не одинок в наличии такого странного регистра.

для сравнения, MSP430 TI имеет два специальных регистра: R2 (регистр статуса) и R3 (постоянный генератор). Когда вы читаете операнд памяти через них (или читаете R3 напрямую), вы получаете одну из следующих предопределенных констант: -1, 0, 1, 2, 4, 8. Константа зависит от регистра номер и вид доступа (прямой, индексированный, косвенный, косвенный+автоинкремент). Это уменьшает размер кода и (AFAIR) время выполнения, потому что в противном случае непосредственные константы занимают 16 бит и должны быть извлечены.