ОСНОВНЫЕ РЕГИСТРЫ ВЫПОЛНЕНИЯ ПРОГРАММЫ



Архитектура IA-32 предоставляет 16 базовых регистров выполнения программ для использования в общем системном и прикладном программировании (см. Рис. 3-4). Эти регистры могут быть сгруппированы следующим образом:

• Регистры общего назначения. Эти восемь регистров доступны для хранения операндов и указателей.

• Регистры сегментов. Эти регистры содержат до шести сегментных селекторов.

• Регистр EFLAGS (статус программы и управление). Отчет регистра EFLAGS о статусе программы

выполняется и позволяет ограничить (уровень прикладной программы) управление процессором.

• Регистр EIP (указатель инструкции). Регистр EIP содержит 32-битный указатель на следующую команду, которая должна быть выполнена.

Регистры общего назначения

Предусмотрены 32-разрядные регистры общего назначения EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP для хранения следующих элементов:

• Операнды для логических и арифметических операций

• Операнды для расчета адресов

• Указатели памяти

Хотя все эти регистры доступны для общего хранения операндов, результатов и указателей, следует соблюдать осторожность при обращении к регистру ESP. Регистр ESP содержит указатель стека, а общее правило не должно использоваться для других целей.

Многие инструкции назначают определенные регистры для хранения операндов. Например, строковые инструкции используют содержимое регистров ECX, ESI и EDI в качестве операндов. При использовании сегментированной модели памяти некоторые инструкции предполагают, что указатели в определенных регистрах относятся к определенным сегментам. Например, некоторые инструкции предполагают, что указатель в регистре EBX указывает на ячейку памяти в сегменте DS.

Особое использование регистров общего назначения по инструкциям описано в главе 5 «Сводка инструкций» в этом томе. См. Также: Глава 3, глава 4 и глава 5 Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32, тома 2A, 2B и 2C. Ниже приводится сводка специальных применений:

• EAX - Аккумулятор для данных о операндах и результатах

• EBX - указатель на данные в сегменте DS

• ECX - счетчик для операций с строкой и контуром

• EDX - указатель ввода-вывода

• ESI - указатель на данные в сегменте, на который указывает регистр DS; указатель источника для строковых операций

• EDI - указатель на данные (или получатель) в сегменте, на который указывает ES-регистр; указатель назначения для строковых операций

• ESP - указатель стека (в сегменте SS)

• EBP - указатель на данные о стеке (в сегменте SS)

Как показано на рисунке 3-5, младшие 16 бит регистров общего назначения отображаются непосредственно в набор регистров, найденный в процессорах 8086 и Intel 286, и могут быть указаны с именами AX, BX, CX, DX, BP, SI , DI и SP. На каждый из двух нижних байтов регистров EAX, EBX, ECX и EDX могут ссылаться имена AH, BH, CH и DH (высокие байты) и AL, BL, CL и DL (низкие байты).

Регистры общего назначения в 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. Адресные регистры общего назначения

     
     
     
     
     

 

В 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-битного режима

3.4.2 Регистры сегментов

Регистры сегментов (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 ™.

3.4.2.1 Регистры сегментов в 64-битном режиме

 

 


Дата добавления: 2018-02-28; просмотров: 281; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!