Что означает R в RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP?

Язык ассемблера x86 должен был измениться по мере того, как архитектура процессора x86 изменилась с 8 до 16 бит на 32 бит и теперь на 64 бит.

Я знаю, что в 32-битных именах регистра ассемблера (EAX, EBX и т.д.) префикс E для каждого из имен означает Extended, означает 32-битную форму регистра, а не 16-битную форму (AX, BX и т.д.).

Что означает префикс R для этих имен регистра на 64-битной?

Ответы

Ответ 1

Я думаю, что это просто R для "register", так как есть дополнительные регистры R8 - R15 на x86-64, а R - общий префикс на многих архитектурах процессора, где регистры нумеруются.

Ответ 2

Первоначальные процессоры Intel x86, процессор 8080, были 8-разрядными процессорами, предназначенными для приложений, таких как специализированные, небольшие компьютеры (например, кассовые аппараты) или контроллеры оборудования, а не компьютеры общего назначения (среди конкурентов были включены Motorola 6800). Следующее семейство процессоров 8086 (8086 и стоимость 8088) было 16-разрядным микропроцессором, который продолжал архитектуру Intel 8080, расширяя его с помощью 16-битных дополнений, обращая внимание на более общие цели использования процессора.

Процессоры Intel 8080 и Intel 8086 имели ограниченное количество регистров, большинство из которых имели особые цели, поэтому у них были определенные имена, такие как A, B или AX, BX на их ассемблере (такие конкуренты, как Motorola 6800, имели аналогичные соглашения). Компьютеры общего назначения, такие как семейство IBM 360/370 или DEC VAX, использовали более общие имена для таких компонентов, как регистры (например, R0, R1 и т.д.), Поскольку регистры были общего назначения (процессор Motorola 68000 32 бит, используемый во многих более высоких конечных рабочих станциях в 1980-х годах было похоже на восемь регистров данных с D0 по D7).

По мере того, как Intel продолжала развивать процессор x86 на протяжении многих лет с 1970-х годов, она также пыталась поддерживать обратную совместимость, даже когда целевые приложения x86 расширились от специализированных приложений микроконтроллера до компьютеров общего назначения. Во время этой эволюции число регистров расширилось, и многие из первоначально назначенных регистров эволюционировали в сторону использования общего назначения, поскольку Intel также представила идею режимов работы процессорных чипов с 80286, чтобы помочь в обратной совместимости.

В 64-разрядных процессорах Intel потребовался некоторый способ идентификации 64-битной передачи по сравнению с 32-разрядной или другой передачей на языке ассемблера. В то же время Intel вводила дополнительные регистры общего назначения. Используя общее соглашение об именовании отрасли для общего реестра, буква R, за которой следует число, было легким решением.

Однако Intel также столкнулась с необходимостью поддерживать обратную совместимость для более старых регистров. Таким образом, буква R использовалась в качестве префикса для 16-разрядного имени регистра так же, как и для 32-разрядных процессоров, буква E использовалась в качестве префикса для 16-разрядного имени регистра. В то же время дизайн операций с 64-битными регистрами был выполнен немного иначе, чем то, что было сделано для операций с 32-разрядными регистрами для предыдущих поколений.

При изменении с 8-битного процессора на 16-разрядный процессор регистры были расширены с 8 бит до 16 бит, поэтому имена имеют букву X после имени регистра, такого как AX, BX и т.д. Эти регистры можно рассматривать как два 8-битных регистра (16-битный регистр AX состоял из 8-битного AH и 8-битного AL, где H представляет собой старший или самый старший бит регистра AX, а L представляет младшие или младшие значащие бит регистра AX).

С изменением от 16 бит до 32-битного процессора регистры были расширены с 16 бит до 32 бит, поэтому имена имеют букву Е в качестве префикса, такого как EAX, EBX и т.д. Эти регистры можно рассматривать как имеющие два отдельные 16-битные компоненты (наименее значимые 16 бит, к которым обращаются с использованием 16-битного имени, такого как EAX → AX, EBX- > BX и т.д.) или четырех 8-битных регистров (наименее значимые 16 бит, к которым обращаются два 8-битных регистра, таких как EAX → AH и AL, EBX → BH и BL и т.д.), Когда сдвиг регистров и побитовые операции были использованы для перемещения 16-битных значений между верхними 16 битами и младшим 16 бит 32-разрядного регистра, такого как EAX, EBX и т.д. Это в некоторой степени подтвердило то, что было сделано при изменении от 8 бит до 16 бит, однако прямой доступ к верхним 16 битам 32-битных регистров был недоступен тем, как прямой доступ к верхним 8 битам 16 разрядные регистры в 8086/8080.

Раздел 3.7.2.1 тома 1: Базовая архитектура руководства разработчика программного обеспечения Intel 64 и IA-32, в котором говорится об режиме с 64 битами.

Register operands in 64-bit mode can be any of the following:
• 64-bit general-purpose registers (RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP, or R8-R15)
• 32-bit general-purpose registers (EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, or R8D-R15D)
• 16-bit general-purpose registers (AX, BX, CX, DX, SI, DI, SP, BP, or R8W-R15W)
• 8-bit general-purpose registers: AL, BL, CL, DL, SIL, DIL, SPL, BPL, and R8L-R15L are available using REX
prefixes; AL, BL, CL, DL, AH, BH, CH, DH are available without using REX prefixes.
• Segment registers (CS, DS, SS, ES, FS, and GS)
• RFLAGS register
• x87 FPU registers (ST0 through ST7, status word, control word, tag word, data operand pointer, and instruction
pointer)
• MMX registers (MM0 through MM7)
• XMM registers (XMM0 through XMM15) and the MXCSR register
• Control registers (CR0, CR2, CR3, CR4, and CR8) and system table pointer registers (GDTR, LDTR, IDTR, and
task register)
• Debug registers (DR0, DR1, DR2, DR3, DR6, and DR7)
• MSR registers
• RDX:RAX register pair representing a 128-bit operand

См. вопрос и ответ для x86_64 регистров rax/eax/ax/al, переписывающих полное содержимое регистра, а также Почему большинство инструкций x64 обнуляют верхнюю часть 32-разрядного регистра, которые дают некоторое объяснение того, как операция 64-разрядного регистра отличается от операции с 32-разрядным регистром.