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

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

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

Является ли регистр $zero обычным нулем или аппаратным нулем?

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

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


person IdiotFromOutOfNowhere    schedule 22.09.2012    source источник
comment
Я почти уверен, что это аппаратный нулевой регистр.   -  person Basile Starynkevitch    schedule 22.09.2012


Ответы (2)


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

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

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

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

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

person markgz    schedule 22.09.2012

Первые 5 ссылок говорят, что это аппаратный (исправленный) ноль.

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

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

person Alexey Frunze    schedule 22.09.2012
comment
В принятом ответе говорилось, что регистр не был аппаратно (исключен) нулем? - person Alexey Frunze; 23.09.2012
comment
Я вижу, это веская причина, чтобы понизить правильный ответ. - person Alexey Frunze; 23.09.2012