Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по Микропроцессорам_МИА.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.67 Mб
Скачать

2.1.3. Регистры процессора

Процессоры х86 имеют регистры, подразделяющиеся на следующие категории [1,31-34]:

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

• указатели инструкций;

• регистр флагов;

• регистры сегментов;

• системные адресные регистры;

• управляющие регистры;

• регистры отладки;

• регистры тестирования;

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

Регистры общего назначения относятся к видимой для прикладных программ части архитектуры х86 и представляют собой расширение набора регистров 16-разрядных процессоров 8086/8088 и 80286 [33, 35, 36]. У 16-разрядных процессоров регистры общего назначения AX, BX, CX, DX состоят из двух 8-битных половинок, к которым можно независимо обращаться по символи­ческим именам АН, ВН, СН, DH (старшие байты - High) и AL, BL, CL, DL (младшие бай­ты - Low). Регистры-указатели SP (Stack Pointer - указатель стека), ВР (Base Pointer - базовый регистр) и индексные регистры SI (Source Index - индекс ис­точника), DI (Destination Index - индекс назначения) допускают только 16-бит­ное обращение. Адрес текущей инструкции хранится в 16-битном указателе ко­манд IP (Instruction Pointer). Регистры в командах могут адресоваться явно. В ряде команд подразумевается неявное использование регистров:

• AX - умножение, деление, ввод и вывод слова;

• AL - умножение, деление, ввод и вывод байта; десятичная арифметика, транс­ляция (XLAT);

• АН - умножение и деление байта;

• BX - трансляция;

• CX - счетчик циклов и указатель длины строковых операций;

• CL - сдвиги с указанием переменной;

• DX - умножение и деление слова, ввод и вывод с косвенной адресацией;

• SP - операции со стеком;

• SI, DI - строковые операции.

В процессорах IA-32 все эти регистры расширены до 32 бит и к прежнему обозна­чению их имен добавилась приставка Е (Extended - расширенный). Отсутствие приставки в имени означает ссылку на младшие 16 бит расширенных регистров. Существуют понятия разрядности адреса и данных. Разрядность адреса определя­ет, сколько бит (16 или 32) используется в регистрах, формирующих адрес дан­ных или инструкций, расположенных в памяти. Разрядность данных определяет, сколько бит (16 или 32) используется в инструкциях, оперирующих словами (инструкции с байтами всегда оперируют с 8 битами). В реальном режиме по умолча­нию разрядность адреса и данных - 16 бит. В защищенном режиме разрядность адреса и данных по умолчанию определяется дескриптором кодового сегмента. Инструкции, которые прежде адресовались к 16-разрядным регистрам, теперь могут адресоваться и к 32-разрядным расширенным при том же коде операции. Что имен­но подразумевается в данный момент, определяется текущим значением разряд­ности слова операнда по умолчанию (16 или 32 бит) и может быть изменено на противоположное значение с п омощью префикса SIZ. Как и в 8086, возможно не­зависимое обращение к младшему и старшему байтам регистров АХ, ВХ, СХ и DX.

Процессор содержит 16 регистров, которые могут использоваться прикладными программами. Как показано на рис. 2.1, эти регистры могут быть сгруппированы следующим образом [1, 31-34].

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

Регистрами общего назначения (РОН) являются 32-битовые регистры EAX, EBX, ECX, EDX, EBP, ESI и EDI. Данные регистры используются для хранения 8, 16 и 32 операндов (рис. 2.1). Они также могут использоваться для хранения операндов при вычислении адресов, за исключением регистра ESP, который не может быть использован для хранения индекса. Все РОН могут использоваться для вычисления адреса и формирования большинства арифметических и логических операций. Однако некоторые команды используют отдельные регистры для хранения операндов. Например, команды обработки строк используют содержимое регистров ECX, ESI, EDI в качестве операндов. Использование указанных регистров для этих целей позволяет более компактно кодировать команды. Следующие команды используют фиксированные регистры: умножения и деления с двойной точностью, ввода-вывода, обработки строк, перекодирования, циклического сдвига, операции со стеком.

2. Сегментные регистры. Данные регистры хранят селекторы сегментов, соответствующих различным формам доступа к памяти [33, 34]. Например, существуют отдельные сегментные регистры для доступа к программной области и стеку. Эти шесть сегментных регистров (рис. 2.2) определяют сегменты памяти, доступные в каждый момент времени.

Сегментирование обеспечивает разработчикам системы гибкость при выборе различных моделей организации памяти. Сегментние регистры содержат 16-битные селекторы сегментов, адресующих таблицы в памяти, в которых хранятся базовые адреса каждого сегмента и другая информация, определяющая доступ к памяти. При использовании несегментированной модели все сегменты отображаются в единое адресное пространство в физической памяти (рис. 2.2).

В любой момент времени до шести сегментов памяти непосредственно доступны программе. Сегментные регистры CS, DS, SS, ES, FS и GS хранят селекторы сегментов для этих шести сегментов. Каждый регистр ассоциируется с доступом к одному из возможных сегментов (кода, данных или стеку). Каждый регистр указывает на конкретный сегмент, используемый программой и имеющий определенный тип доступа (рис. 2.3). Остальные сегменты могут быть использованы путем загрузки их селекторов в сегментные регистры.

Сегмент, содержащий выполняемые команды, называется сегментом кода, и его селектор находится в регистре CS. Процессор выбирает команды кодового сегмента, используя содержимое указателя команд EIP как смещение внутри сегмента. Регистр CS загружается в результате выполнения прерываний, особых случаев и команд передачи управления между сегментами (например, команды CALL, IRET, JMP). Перед вызовом процедуры должна быть выделена область памяти под стек. В стеке хранятся адрес возврата, параметры вызываемой процедуры и временные переменные.

Все операции со стеком используют регистр SS при обращении к сегменту стека. В отличие от регистра CS регистр SS может быть загружен явно, что позволяет прикладным программам определять стеки.

Р егистры DS, ES, FS, GS являются регистрами сегментов данных и позволяют организовать эффективный и безопасный доступ к различным структурам данных. Например, раздельные сегменты данных могут быть созданы для структур данных текущего программного модуля, данных, полученных из модуля более высокого уровня динамически создаваемых структур данных и данных, разделяемых с другой программой. Механизм сегментации позволяет ограничить влияние от некорректно выполняемых программ вследствие появления ошибок только в сегментах, которые используются этими программами.

В зависимости от структуры данных и распределения их по сегментам программа может получить доступ более чем к четырем сегментам данных. Для доступа к дополнительным сегментам регистры DS, ES, FS, GS могут быть загружены из прикладной программы во время ее выполнения. Единственным требованием является то, что инициализация соответствующего сегментного регистра должна быть выполнена до обращения к данным сегмента.

Базовый адрес хранится для каждого сегмента. Для адресации данных внутри сегмента 32-битовое смещение прибавляется к базовому адресу сегмента. Операнд в сегменте адресуется посредством задания смещения в команде или в регистре общего назначения. Специальные правила определяют, какой сегментный регистр используется для адресации сегмента.

  1. Регистры состояния и управления. Данные регистры отображают и позволяют модифицировать состояние процессора [33, 34]..

Регистр флагов EFLAGS является расширением регистра FLAGS до 32 бит. Биты 0-15, определенные для 8086 и 80286, имеют прежнее назначение [34]. Флаги состояния OF, SF, ZF, AF, PF и CF хранят признаки результатов выполнения арифме­тических и логических операций над операндами, расположенными в регистрах общего назначения и в памяти (исполнение инструкций блоками FPU, ММХ и ХММ держится особняком). Операции пересылки данных на флаги состояния вли­яния не оказывают. Значение этих флагов анализируется при исполнении услов­ных инструкций. Кроме флагов состояния в регистре имеются управляющие и си­стемные флаги, влияющие на поведение процессора, в том числе на обработку маскируемых аппаратных прерываний (IF) и на направление движения в строко­вых операциях (DF). По сравнению с 80286, появились биты VM и RF, ряд флагов добавился с появлением процессоров 4-го и 5-го поколений. Содержимое регист­ра флагов (FLAGS или EFLAGS) может быть сохранено в стеке и восстановлено из него, но ряд системных флагов в защищенном режиме управляем и наблюдаем не на всех уровнях привилегий. Флаги состояния могут быть скопированы в регистр АН и, наоборот, загружены из него. Кроме того, флаги состояния могут быть загружены из блока FPU, и тогда результаты выполнения инструкций в FPU мож­но использовать в условных инструкциях.

Назначение бит регистра EFLAGS описано ниже [33, 34].

ID (Id Flag) - флаг доступности команды идентификации CPUID (P5 и выше, а также некото­рые 486).

VIP (Virtual Interrupt Pending) - виртуальный запрос прерывания (P5 и выше).

VIF (Virtual Interrupt Flag) - виртуальная версия флага IF (разрешения пре­рывания) для многозадачных систем (P5 и выше).

AC (Alignment Check) - флаг контроля выравнивания. При исполнении про­грамм с уровнем привилегий 3 в случае обращения к операнду, который не выровнен по соответствующей границе (2, 4, 8 байт), и при установленном флаге АС произойдет исключение #АС с нулевым кодом ошибки (о мнемониках исключений см. п. 2.5). На уровнях привилегий 0, 1, 2 контроль выравнивания не производится (486 и выше).

VM (Virtual 8086 Mode) - в защищенном режиме включает режим виртуально­го процессора 8086. Попытка использования привилегированных инструкций в этом режиме вызовет исключение #GP. Бит может устанавливаться только в защищенном режиме: инструкцией IRET на нулевом уровне привилегий или переключением задач на любом уровне привилегий. На бит не действует инст­рукция POPF, а инструкция PUSHF в этот бит всегда заносит 0. Его единичное зна­чение может сохраниться только в образе EFLAGS, сохраняемом при прерыва­нии, переключении задач или переходе в режим SMM.

RF (Resume Flag) - флаг возобновления, используется совместно с регистрами точек останова.

IOPL (Input/Output Privilege Level) - уровень привилегий ввода-вывода.

NT (Nested Task Flag) - флаг вложенной задачи.

OF (Overflow Flag) - флаг переполнения. Устанавливается, если результат арифметической операции не умещается в операнде назначения.

DF (Direction Flag) - флаг управления направлением в строковых операциях. При единичном значении индексные регистры, участвующие в строковых опе­рациях, автоматически декрементируются на количество байт операнда, при нулевом - инкрементируются. Флаг управляется программно, инструкциями CLD и STD.

IF (Interrrupt-enable Flag) - флаг управления прерываниями. При единичном значении разрешается выполнение маскируемых аппаратных прерываний. На этот флаг можно воздействовать программно, явными инструкциями (CLI и STI) и неявными инструкциями восстановления регистра флагов; процессор ма­нипулирует флагом и автоматически, при обработке прерываний.

TF (Trap Flag) - флаг трассировки (пошагового режима). При его установке после выполнения каждой команды вызывается внутреннее прерывание типа 1 (INT 1).

SF (Sign Flag) - флаг знака. Указывает на единичное значение старшего бита результата - признак отрицательного числа.

ZF (Zero Flag) - флаг нулевого результата.

AF (Auxiliary Flag) - флаг дополнительного переноса (заема) в тетраде для де­сятичной арифметики.

PF (Parity Flag) - флаг паритета, устанавливается при четном числе единиц результата.

CF (Carry Flag) - флаг переноса (заема) старшего бита в арифметических опера­циях. Этот флаг может быть программно установлен или сброшен специальны­ми инструкциями (STC, CLC, CMC), благодаря этому свойству его широко использу­ют для сигнализации условия завершения процедур (например, сигнализации об ошибках).

Указатель команд. Указатель команд EIP содержит смещение в текущем сегменте кода. Он непосредственно недоступен программисту и управляется явно командами передачи управления (переходы, возвраты и т. Д.), прерываниями и особыми случаями. Так как используется предвыборка команд в процессор, то значение EIP указывает на загружаемую в процессор команду, а не на выполняемую команду в процессоре.