Що означає «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 зробила це в 60-х роках з 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 (мнемонічні: Base Pointer, Stack Pointer).

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

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

Процесори, які дотримувались цієї думки, називаються процесорами RISC (Reduced Instruction Set CPU), на відміну від CISC (Complex Instruction Set CPU).

Більше регістрів призводить до меншої кількості переливів на пам'ять. В основному регістри - це найшвидший доступний кеш, тому збільшення кількості регістрів є хорошою ідеєю навіть в наш час. Відсутність спеціалізованих інструкцій (сподіваємось, що більше) компенсувалася швидшим введенням простих інструкцій.

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

32 регістри - це занадто багато, щоб використовувати букви, і все одно вони були рівними, тому нумерація їх була очевидним вибором. 'R' було використано для відрізнення їх від констант 0..31, а 'R' було простою мнемонікою для Реєстру. Тому: R0..R31.

Протягом багатьох років Pentium та його спадкоємці підтримували зворотну сумісність. Однак також було включено багато більш успішних ідей RISC. Часто ці нові, схожі на RISC інструкції працюватимуть швидше, ніж назад сумісні версії.

Intel також збільшила кількість реєстрів, щоб зменшити кількість доступу до пам'яті.

І, мабуть, 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) мем: "Якщо ви можете пояснити це довго, ви можете пояснити це коротко."
користувач7813604
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.