Нулевой регистр 'zr' в aarch64 по существу заземлен? - PullRequest
0 голосов
/ 19 сентября 2018

Недавно начал возиться со сборкой AArch64, и я заметил, что у него есть назначенный регистр строго для нуля , тогда как (для большинства) других архитектур вы бы просто xor var, var.

Сайт IЧитал о zr объяснил это как контрольная точка для нуля , что очень похоже на то, как я определяю землю в электронике постоянного тока.И поскольку ARM используется любителями, для меня имеет смысл привязать ноль в схеме к нулю в коде.

Я уверен, что это намного сложнее, но это безопасная аналогия?И приведет ли использование этого регистра по сравнению с другими способами получения «0» к другим результатам?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Является ли нулевой регистр 'zr' в aarch64 по существу заземленным?... это безопасная аналогия?

Нет.Есть все виды аппаратной логики там. Неважно, связаны ли биты нулевого регистра с землей или нет, поскольку это просто подробности реализации .Вам нужно только думать о нем как о числовом значении ноль и о том, что произойдет, если мы будем читать или записывать этот регистр.Не думайте о базовых схемах, когда вы работаете в программном обеспечении

Например, многие архитектуры могут использовать инвертированную логику ( active-low ), где 0 В означает логику 1, а затем нулевой регистр фактически соединится с V cc .Или некоторые другие используют сбалансированную логику, где логика 0 и 1 представлена ​​-V cc и V cc соответственно.В этом случае нулевой регистр будет подключен к -V куб.см , и он также не заземлен.


Но зачем нужен нулевой регистр?

Общая философия RISC состоит в том, чтобы избегать доступа к памяти в каждой инструкции , вместо этого только инструкции загрузки / сохранения могут касаться памяти .В результате RISC-архитектурам требуется много регистров, чтобы уменьшить потребность в переполнении памяти.

Практически во всех остальных RISC-архитектурах имеется как минимум 32 регистра ,поэтому стоит выделить один для нулевой константы.Мы видим, что: SPARC имеет %g0, MIPS имеет $zero или $0, Itanium (строго говоря, не RISC, а VLIW, но все жетонн регистров [128]) имеет r0, RISC-V имеет x0, SH-5 имеет R63 , Blackfin имеет R0, i860 имеет R0, PA-RISC имеет R0, ARC имеет %r0, Motorola 88000 имеет r0, Alpha с 2-мя отдельными регистрами нуля: целое число R31 и число с плавающей точкой F31 ...

Небольшое отклонение - это PowerPC, где r0 означаетили GPR0 или номер 0 в зависимости от инструкций.Однако Plan 9 для PowerPC еще больше расходится, инициализируя r0 в 0 с помощью программного обеспечения

Единственная нечетная архитектура RISC с 32 регистрами, но без нулевого регистра - Intel i960 , но опять же странноПлан 9 также требует, чтобы регистр R3 был установлен в 0 с помощью программного обеспечения .Другой странный зверь - OpenRISC , где R0 также инициализируется в 0 программным обеспечением .Это означает, что R0 не следует использовать в качестве пункта назначения, поскольку запись в него уничтожит значение

. Регистр 0 позволяет разработчикам удалять многие инструкции, упрощая аппаратное обеспечение.Например, нам больше не нужен mov, вместо этого мы можем просто add с нулем и сохранить в месте назначения.Отрицание также теперь просто вычитание из нуля.Записывает в нулевой регистр, отбрасывает результаты, и нам также не нужен отдельный NOP.ARM и Intel i960 не имеют нулевого регистра, поэтому у них есть явные инструкции mov в ISA

ARM всегда был исключением, поскольку он имеет только 16 регистров (на самом деле ~ 12-13, так как SP, PC ... включены в набор общего назначения), что делает исключительный регистр для нуля расточительным.Более того, ARM не считался чистым RISC, потому что его инструкции и режимы адресации слишком сложны (LDM, STM, shift и условные в каждой инструкции ...)

Несмотря на то, что ARM является архитектурой RISC, она не строго следует принципам RISC, как это делает MIPS.Например, некоторые инструкции ARM, такие как ldm и stm, не являются простыми инструкциями.Кроме того, он обеспечивает большое количество режимов адресации и использует довольно сложный формат инструкций

Руководство по процессорам RISC: для программистов и инженеров

When ArmХолдинги решили, что Aarch64 также будет иметь 32 регистра, они определенно сделают то же самое, чтобы сделать набор команд более RISCy и менее ортогональным .Теперь ПК, SP ... тоже разделены, поэтому у нас более чем в два раза больше регистров по сравнению с ARM.Нет никаких причин, по которым они, как и другие, не делают оборудование более сложным

Подобный случай - архитектура SuperH, где версия SH-4 имеет 16 регистров.Когда Ренесас расширил до 64 регистров в SH-5, они также зарезервировали R63 для нулевой константы

0 голосов
/ 19 сентября 2018

Можно считать, что биты в этом регистре жестко заземлены.Но запись в него не вызывает короткого замыкания.Лучшая аналогия - Unix /dev/zero: отбрасывать записи, читать как бесконечный поток нулевых байтов.

Но нет, это не «ссылка» в том смысле, что вещи измеряются относительно него.Логические 0 биты могут существовать в ЦП независимо от того, имеет ли AArch64 этот регистр, и они не сравниваются с ним, чтобы определить, являются ли они истинными / ложными.С электрической точки зрения логический 1 обычно представляет собой высокое напряжение, а 0 = земля, поэтому вентили сравнивают свой вход с землей, и все биты 0 в любом месте эквивалентны земле.(Это, вероятно, серьезное упрощение, и, конечно, внутренне внутри АЛУ или чего-то другого биты могут быть инвертированы или физически не существовать, только логически в каком-то другом представлении).

Так как аналогия это не работает вообще.Как описание того, как он реализован физически / электрически, он также не работает полностью.Необходимо сбросить записи без короткого замыкания.А в ЦП с переименованием регистров он должен иметь специальный регистр в RAT (таблица распределения регистров), чтобы отслеживать тот факт, что записи отбрасываются и цепочки зависимостей не распространяются через xzr.Если вы проигнорируете это, вы можете представить себе замену для ячеек SRAM с отключенным входом и выходным сигналом, привязанным к нулю.


Это выглядит как неуклюжая формулировка;лучшим описанием было бы то, что нулевой регистр - это фиксированная константа, которая молча отбрасывает записи.

Чтение этого дает вам фиксированный постоянный ноль, что иногда полезно (например, для хранения нулей в памяти без необходимости обнулениязарегистрироваться первым).Если только этот контекст не даст вам псевдоним sp для того же номера регистра;Я не очень хорошо знаю AArch64.

0 голосов
/ 20 сентября 2018

Чтобы ответить на мой главный вопрос, нет Я не думаю, что это особенно "безопасная" (полезная) аналогия.

Концепция заземления в электрическоминженерия имеет очень специфическую семантику и множество связанных понятий, но только очень касательную связь с «регистром с фиксированным нулем» в том смысле, что в обоих случаях используется нулевое число.

Помимо присутствия нуля в обеих концепциях, яне вижу большой пользы в аналогии.Это почти наверняка не отражает реальность того, как реализован регистр, и не позволяет отображать концепции из ваших знаний в области электротехники в программировании сборок ARM.Если у вас есть вопрос о том, как работает нулевой регистр (например, «что происходит при записи?»), Очень маловероятно, что вы сможете ответить на него, ссылаясь на свою аналогию.

Я не знаю, почему (несвязанный) сайт использовал терминологию контрольная точка для нуля , но я думаю, что безопасно игнорировать язык "контрольной точки"полностью.Это просто ноль.Когда вы читаете, он равен нулю, а когда вы пишете, он ничего не делает.Полезность этого объясняется в ответе fuz .

Все это говорит о том, что если вы находите эту аналогию полезной мысленной конструкцией для вас , то ее использование не является неправильнымэто в вашем собственном процессе обучения!

0 голосов
/ 19 сентября 2018

Нулевой регистр xzr соотв.wzr - это симпатичный дизайнерский трюк в Aarch64 ISA.Это номер регистра 31, так же как указатель стека sp соотв.wsp.В зависимости от контекста регистр номер 31 ссылается на один из них.

Этот симпатичный трюк позволяет ISA Aarch64 упростить свой набор инструкций.Например, инструкция cmp xn, xm на самом деле subs xzr, xn, xm, то есть вычитается с отбрасываемым результатом.A mov xn, xm - это просто orr xn, xzr, xm.Регистр 31 распознается как указатель стека только в том случае, если это имеет смысл, а набор команд был выбран с умом, поэтому вы почти никогда не обращаете внимания на эту деталь.

...