Что означает «R» в именах регистров x64?


27

Я знаю, что 32-битные регистры были названы как 16-битные регистры с префиксом «E», что означает «расширенный». Я всегда предполагал, что это означает расширение с 16 до 32 бит, хотя я никогда не видел этого в явном виде.

Я пытался выяснить, что означает «R», но мои навыки Google подвели меня. Кто-нибудь знает?


Ответы:


32

Это означает зарегистрироваться , и это не все по историческим причинам.

Историческая часть заключается в том, что Intel приобрела привычку перечислять регистры буквами с 8008 (от A до E плюс H и L). Эта схема была более чем адекватной в то время, потому что микропроцессоры имели очень мало регистров и вряд ли могли получить больше, и большинство разработок делали это. Тогда преобладало мнение, что программное обеспечение будет переписано для новых процессоров по мере их появления, поэтому изменение схемы именования регистров между моделями не было бы большой проблемой. Никто не предвидел превращение 8088 в «семью» после включения в IBM PC, и ярмо обратной совместимости в значительной степени вынудило Intel принять схемы типа «E» для 32-битных регистров для его поддержки.

Неисторическая часть практична. Использование букв для регистров общего назначения ограничивает вас числом 26, если вы отсеиваете те, которые могут вызвать путаницу с именами регистров специального назначения, такими как счетчик программ, флаги или указатель стека.

У меня нет источника, чтобы подтвердить это, но я подозреваю, что выбор Rпрефикса и введение R8-R15 на 64-битных процессорах сигнализирует о переходе к пронумерованным регистрам, что было нормой среди 32-битных и -большая архитектура не выводится из 8008 почти полвека. IBM сделала это в 1960-х годах с 360-ым, за ним последовали PowerPC, DEC Alpha, MIPS, SPARC, ARM, Intel i860 и i960 и множество других, которые давно забыты.

Вы заметите, что существующие регистры прекрасно вписались бы в R0 - R7, если бы они существовали, и меня не удивит немного, если они будут обрабатываться таким образом внутри. Существующие длинные регистры (RAX / EAX / AX / AL, RBX / EBX / BX / BL и т. Д.), Вероятно, будут оставаться до тех пор, пока не сгорит солнце.


1
Немного антиклиматично, но, думаю, я не должен быть слишком удивлен. Спасибо.
Мэтт

3
Это была вся драма, которую я мог собрать. :-)
Blrfl

+1 за очень интересное чтение. Но если бы это было кратко изложено в одной строке, это был бы ответ, который я дал. Вся эта богатая и интересная информация сводится к «историческим причинам», если обобщить.
Майк Накис

6
AMD было бы переименовать или наложения низких 8 регистров r0- r7или используя UAXвместо r8и т.д. . «Выяснение того, как лучше назвать регистры, было на самом деле одной из самых сложных частей расширения регистра». (См. Stackoverflow.com/a/35619528/224132 для некоторой другой аккуратной истории x86-64.) Кроме того, порядок не RAX / RBX / ... в двоичной кодировке, это AX, CX, DX, BX
Peter Кордес

9

В более ранних процессорах не все регистры были равны:

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

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

Например, 6510 (используемый в Commodore 64) может быть добавлен только с использованием регистра A, а для индексации используются X или Y. Есть инструкции INC X и INC Y, но нет INC A.

Поскольку регистры имели различное использование, были выбраны мнемоники, отражающие их использование. Например, A, X и Y в 6510 (вместо A, B и C).

Имена в 8086 выбраны так, чтобы отражать их использование. С 4 регистрами общего назначения было логично назвать их AX, BX, CX и DX. Дополнительные регистры индексации назывались BP и SP (мнемоника: базовый указатель, указатель стека).

Поскольку многие коды операций были расширены до 16 битов, было место для указания, какой из четырех регистров использовался. Однако некоторые исторические причины все еще применялись, поскольку CX был немного особенным: REP и лайки, которые являются 8-битными кодами операций, всегда используют CX в качестве счетчика. Простая мнемоника CX = Counter помогает запомнить, какая из них используется.

Операционные коды для преемников 8086 должны были быть обратно совместимыми, и это беспорядок в результате использования операционных кодов переменной длины. Когда 32-битные шины стали более распространенными, были опробованы процессоры с фиксированной длиной кода операции. Это упрощает декодирующую часть ЦП, которая высвобождает пространство, которое можно использовать, например, для большего количества регистров.

Процессоры, которые придерживались этой идеи, называются процессорами RISC (CPU с уменьшенным набором инструкций), в отличие от CISC (CPU с комплексным набором инструкций).

Чем больше регистров, тем меньше перетекания в память. По сути, регистры - это самый быстрый доступный кэш, поэтому увеличение количества регистров является хорошей идеей даже в наши дни. Отсутствие специализированных инструкций было (возможно, более чем) компенсировано более быстрым выполнением простых инструкций.

32-битные операционные коды фиксированной длины имеют достаточно места для включения источника, второго источника, операции и места назначения. SPARC удалось сжать 5 битов для каждого из источника, второго источника и места назначения, и, следовательно, одновременно было доступно 32 регистра.

32 регистра слишком много, чтобы использовать буквы, и в любом случае они были в основном равны, поэтому нумерация их была очевидным выбором. Буква «R» использовалась для того, чтобы отличить их от констант 0..31, а буква «R» была легкой мнемоникой для Регистра. Следовательно: R0..R31.

На протяжении многих лет Pentium и его преемники поддерживали обратную совместимость. Тем не менее, многие из наиболее успешных идей RISC также были неоправданными. Часто эти новые RISC-подобные инструкции выполняются быстрее, чем обратно-совместимые версии.

Интел также увеличил количество регистров, чтобы уменьшить количество обращений к памяти.

И, видимо, Intel наконец начала использовать R-нотацию. Обратная совместимость гарантирует, что AX, BX, ... останутся, но я бы поспорил, что AX - это просто синоним, например, R0.


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


1
Семейство 6500 действительно не нуждалось в специальной инструкции для приращения аккумулятора, потому что добавление 1 в немедленном режиме занимало те же два цикла, что и INXили INY, хотя код занимал дополнительный байт. Я написал много сборок для этого чипа, и на практике такое увеличение было редким, за исключением математики, которая в этом нуждалась.
Blrfl

@Blrfl Вы правы: ADD 1работает, поэтому не было необходимости в специализированном увеличении A. И я не припомню, чтобы мне это тоже было нужно.
Sjoerd

1
Следует отметить, что не Intel увеличила количество регистров в x64 и назвала их, а AMD, поскольку 64-разрядные расширения для x86 были созданы AMD . 64-битный дизайн Intel был Itanium , который не очень хорошо работал, хотя в нем было много (128 целочисленных целых и многие другие) регистров.
8bittree

5

Это просто означает «зарегистрироваться». По историческим причинам.


Это не так уж и исторически, если в настоящее время это относится к регистру, не так ли? Я бы сказал, что другие имена для регистров (AX, EAX и т. Д.) Более исторические. Но то, что «R» в RAX на самом деле очень применимо в настоящее время.
Карл Дж.

1
(+1) мем: «Если вы можете объяснить это долго, вы можете объяснить это кратко».
user7813604
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.