ФЭНДОМ


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

В микропроцессоре 8086 было восемь 16-разрядных регистров общего назначения. Все они могли выступать в качестве операндов основных арифметико - логических инструкций, но только четыре годились для целей адресации. Кроме того, каждый регистр имел свои специфические функции:

  • AX — аккумулятор. Использовался для хранения операндов в командах умножения и деления, ввода-вывода, в некоторых командах обработки строк и других операциях;
  • BX — регистр базы. Используется для хранения адреса или части адреса операнда, находящегося в памяти;
  • CX — счётчик. Содержит количество повторений строковых операций, циклов и сдвигов;
  • DX — регистр данных. Используется для косвенной адресации портов ввода-вывода, а также как «расширитель» аккумулятора в операциях удвоенной разрядности;
  • SI — регистр адреса источника. Используется в строковых операциях, а также в качестве индексного регистра при обращении к операндам в памяти;
  • DI — регистр адреса приёмника. Используется в строковых операциях, а также в качестве индексного регистра при обращении к операндам в памяти;
  • BP — указатель кадра стека. Используется для адресации операндов, расположенных в стеке;
  • SP — указатель стека. Используется при выполнении операций со стеком, но не для явной адресации операндов в стеке.

Первые четыре регистра могут делиться на две однобайтовых части каждый: AH, BH, CH и DH для старших байтов и AL, BL, CL и DL для младших байтов.

В микропроцессоре 80386 разрядность регистров была удвоена и составила 32 бита. Обновлённые регистры не заменили, а дополнили уже имеющиеся: 32-разрядные версии получили имена EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP, а их младшие слова сохранили прежние обозначения, причём у первых четырёх регистров сохранилась возможность раздельного обращения к двум младшим байтам (AH, AL и так далее). С помощью префикса изменения размера операнда возможно выполнение 32-разрядных операций в реальном режиме и режиме виртуального процессора 8086.

Другим важным новшеством процессора 80386 стало уменьшение «дискриминации» между регистрами: теперь компоненты 32-разрядных адресов можно хранить в любом регистре. Появилась также возможность масштабирования — использования содержимого регистра в качестве индекса, при вычислении адреса автоматически умножаемого на 2, 4 или 8. Однако при работе в реальном режиме и режиме виртуального процессора 8086 для адресации по-прежнему используются только BX, BP, SI и DI, отсутствует и возможность масштабирования.

Появление 64-разрядных микропроцессоров (технология EM64T/AMD64) повлекло серьёзные изменения в наборе регистров общего назначения. Суть изменений сводится к следующему:

  • регистров стало 16 вместо восьми, а их разрядность удвоилась и составила 64 бита;
  • новые регистры, а также старшие половины ранее существовавших регистров доступны только в 64-разрядном режиме;
  • по умоланию регистры считаются 32-разрядными (используются младшие половины 64-разрядных регистров) и носят имена EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, R8D–R15D. Для доступа к новым регистрам R8D–R15D в коде команды должен присутствовать специальный префикс, в документации фирмы Intel обозначаемый REX;
  • 64-разрядные регистры носят следующие имена: RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8–R15. Для доступа к ним в код команды включается префикс REX;
  • возможен доступ к младшим словам любого из 16 регистров, обозначаемых в этом случае AX, BX, CX, DX, SI, DI, BP, SP, R8W-R15W. Если требуется обратиться к новым регистрам R8W–R15W, в коде команды используется префикс REX;
  • возможен доступ к младшим байтам любого из 16 регистров, для чего используются обозначения AL, BL, CL, DL, SIL, DIL, BPL, SPL, R8L–R15L. Для доступа к новым однобайтовым регистрам — SIL, DIL, BPL, SPL, R8L–R15L — используется префикс REX;
  • доступ к старшим байтам младших слов регистров возможен только для ранее существовавших регистров AH, BH, CH и DH. Чтобы обратиться к ним, префикс REX должен отсутствовать. Таким образом, невозможно одновременно обратиться к одному из указанных четырёх регистров и к любому из новых регистров независимо от разрядности;
  • при работе в 64-разрядном режиме 32-разрядные арифметико-логические операции, чьим приёмником является регистр общего назначения, обнуляют его старшие 32 бита, а 8- и 16-разрядные операции не изменяют старшие разряды, явно не затрагиваемые операцией. Однако если результат 8- или 16-разрядной операции используется для вычисления 64-разрядного адреса, происходит распространение знака результата на старшие разряды до получения полной 64-разрядной величины;
  • при переключении из 64-разрядного режима в режим совместимости или обратно содержимое старших 32 битов регистров RAX, RBX, RCX, RDX, RSI, RDI, RBP и RSP не сохраняется. Содержимое регистров R8–R15 в аналогичной ситуации сохраняется;