Регистры общего назначения в 64-битном режиме
В 64-битном режиме имеется 16 регистров общего назначения, а размер операнда по умолчанию - 32 бита. Однако регистры общего назначения могут работать либо с 32-битными, либо с 64-битными операндами. Если указан размер 32-разрядного операнда: доступны EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D-R15D. Если указан размер 64-разрядного операнда: доступны RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8-R15. R8D-R15D / R8-R15 представляют восемь новых регистров общего назначения. Доступ к этим регистрам можно получить на уровне байта, слова, слова и уровня qword. Префиксы REX используются для генерации 64-разрядных операндов или для ссылок на регистры R8-R15.
Регистры, доступные только в 64-битном режиме (R8-R15 и XMM8-XMM15), сохраняются на переходах из 64-разрядного режима в режим совместимости, а затем обратно в 64-разрядный режим. Однако значения R8-R15 и XMM8-XMM15 не определены после переходов из 64-битного режима через режим совместимости в прежний или реальный режим, а затем обратно через режим совместимости в 64-разрядный режим.
Таблица 3-2. Адресные регистры общего назначения
Тип регистра | Without Rex | With REX |
Byte register | AL, BL, CL, DL, AH, BH, CH, DH | AL, BL, CL, DL, DIL, SIL, BPL, SPL, R8L - R15L |
Word register | AX, BX, CX, DX, DI, SI, BP, SP | AX, BX, CX, DX, DI, SI, BP, SP, R8W - R15W |
Doublewordregister | EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP | EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D - R15D |
Quadwordregister | N.A. | RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8 - R15 |
В 64-битном режиме существуют ограничения на доступ к байтовым регистрам. Инструкция не может ссылаться на устаревшие высокие байты (например:AH, BH, CH, DH) и один из новых байтовых регистров одновременно (например: младший байт регистра RAX).Однако инструкции могут ссылаться на старые байты с низким байтом (например:AL, BL, CL или DL) и новые байтовые регистры одновременно (например: младший байт регистра R8 или RBP). Архитектура применяет это ограничение, изменяя высокобайтовые ссылки (AH, BH, CH, DH) на ссылки с низким байтом (BPL, SPL, DIL, SIL: низкие 8 бит для RBP, RSP, RDI и RSI) для инструкций с использованием Префикс REX.
Когда в 64-битном режиме размер операнда определяет количество действительных битов в целевом регистре общего назначения:
• 64-разрядные операнды генерируют 64-битный результат в целевом регистре общего назначения.
• 32-разрядные операнды генерируют 32-битный результат с нулевым расширением до 64-битного результата в целевом регистре общего назначения.
• 8-битные и 16-разрядные операнды генерируют 8-битный или 16-разрядный результат. Верхние 56 бит или 48 бит (соответственно) целевого регистра назначения не изменяются операцией. Если результат 8-разрядной или 16-разрядной операции предназначен для вычисления 64-разрядного адреса, явным образом выставляю регистр до полного 64-битного.
Поскольку верхние 32 бита 64-разрядных регистров общего назначения не определены в 32-битных режимах, верхние 32 бита любого универсального регистра не сохраняются при переходе из 64-разрядного режима в 32-разрядный (для защищенного режим или режим совместимости). Программное обеспечение не должно зависеть от этих битов для поддержания значения после переключения с 64-битного до 32-битного режима
Регистры сегментов
Регистры сегментов (CS, DS, SS, ES, FS и GS) содержат 16-битные сегментные селектора. Селектор сегмента - это специальный указатель, который идентифицирует сегмент в памяти. Для доступа к определенному сегменту в памяти селектор сегмента для этого сегмента должен присутствовать в соответствующем регистре сегментов.
При написании кода приложения программисты обычно создают селектор сегментов с ассемблерными директивами и символами. Затем ассемблер и другие инструменты создают фактические значения селектора сегментов, связанные с этими директивами и символами. При написании системного кода программистам может потребоваться создать селектор сегментов напрямую. См. Главу 3 «Управление памятью с защищенным режимом» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, том 3A.
Использование сегментных регистров зависит от типа модели управления памятью, которую использует операционная система или исполнительная власть. При использовании плоской (несегментированной) модели памяти регистры сегментов загружаются селекторами сегментов, которые указывают на перекрывающиеся сегменты, каждый из которых начинается с адреса 0 линейного адресного пространства (см. Рис. 3-6). Эти перекрывающиеся сегменты затем содержат линейное адресное пространство для программы. Как правило, определяются два перекрывающихся сегмента: один для кода и другой для данных и стеков. Регистр сегмента CS указывает на сегмент кода, а все остальные регистры сегментов указывают на сегмент данных и стека.
При использовании сегментированной модели памяти каждый сегментный регистр обычно загружается с помощью другого селектора сегментов, так что каждый сегментный регистр указывает на другой сегмент в линейном адресном пространстве (см. Рис. 3-7). В любой момент программа может, таким образом, получить доступ к шести сегментам в линейном адресном пространстве. Для доступа к сегменту, на который не указывает один из сегментных регистров, программа должна сначала загрузить селектор сегмента для сегмента, к которому нужно получить доступ в регистре сегментов.
Каждый из регистров сегментов связан с одним из трех типов хранилища: кодом, данными или стеком. Например, регистр CS содержит селектор сегмента для сегмента кода, где хранятся выполняемые инструкции. Процессор извлекает команды из сегмента кода, используя логический адрес, который состоит из селектора сегментов в регистре CS и содержимого регистра EIP. Регистр EIP содержит смещение внутри сегмента кода следующей команды, которая должна быть выполнена. Регистр CS не может быть загружен явно прикладной программой. Вместо этого он неявно загружается инструкциями или операциями внутреннего процессора, которые изменяют управление программой (например, вызовы процедур, обработку прерываний или переключение задач).
Регистры DS, ES, FS и GS указывают на четыре сегмента данных. Доступность четырех сегментов данных обеспечивает эффективный и безопасный доступ к различным типам структур данных. Например, могут быть созданы четыре отдельных сегмента данных: один для структур данных текущего модуля, другой для данных, экспортированных из модуля более высокого уровня, третий для динамически созданной структуры данных и четвертый для данных, совместно используемых с другим программа. Для доступа к дополнительным сегментам данных прикладная программа должна загружать сегментные селектора для этих сегментов в регистры DS, ES, FS и GS, если это необходимо.
Регистр SS содержит селектор сегментов для сегмента стека, где стек процедуры хранится для выполняемой в настоящее время программы, задачи или обработчика. Все операции стека используют регистр SS для поиска сегмента стека. В отличие от регистра CS, регистр SS может быть загружен явно, что позволяет прикладным программам устанавливать несколько стеков и переключаться между ними.
См. Раздел 3.3 «Организация памяти» для обзора того, как регистры сегментов используются в режиме реального адреса.
Четыре сегмента регистров CS, DS, SS и ES такие же, как регистры сегментов, найденные в процессорах Intel 8086 и Intel 286, а регистры FS и GS были введены в архитектуру IA-32 с семейством процессоров Intel386 ™.