Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Пользовательские регистры




II. БАЗОВАЯ РЕГИСТРОВАЯ АРХИТЕКТУРА ПРОЦЕССОРОВ IA-32 СЕМЕЙСТВА Х86.

В целом, регистровая модель процессоров семейства Х86 включает в себя следующие группы регистров.

1. Основные пользовательские регистры – 16 регистров (16 и 32 разрядные, двоичные).

2. Системные регистры – 17 регистров (32 и 48 разрядные, двоичные).

3. Регистры блока обработки чисел с плавающей запятой (регистры FPU) – 11 регистров (16 и 80 разрядные, двоичные).

4. Регистры блока обработки пакетов чисел с плавающей запятой (регистры SSE) – 9 регистров (128 разрядные, двоичные).

5. Служебные или модельно-специфические (MSR – Model-Specific Registers) регистры, которые определяются конкретной моделью процессора. Они служат для тестирования кэш-памяти, а также содержат специфическую информацию о процессе выполнения программы (количество декодированных команд, полученных запросов прерывания, число загрузок в кэш-память и т.п.). Служат они также для выполнения и некоторых других функций. Таких регистров уже в микропроцессорах серии Pentium насчитывалось более 80 и, судя по всему, в микропроцессорах микроархитектур Intel Core 2 их еще больше.

Мы рассмотрим только первые две группы, наиболее значимые для дальнейшего понимания основных принципов функционирования микропроцессоров семейства Х86.

 

Пользовательские регистры

Состав пользовательских регистров МП семейства Х86 приведен на рис.II.1. На рисунке выделены 16 разрядные регистры, используемые в первых моделях МП этого семейства (8086, 80186 и 80286). Пользовательские регистры подразделяются на:

- регистры общего назначения (РОН);

- сегментные регистры;

- регистр указатель инструкций;

Регистр флагов.

 

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

Восемь 32-битных регистров общего назначения используются для текущего хранения данных и адресов. Буква E в названии регистров означает «расширенный» (Extended). Отметим, что для всех РОН допускается адресация в командах их младших 16-битных половин, т.е.AX, BX, CX, DX, SP, BP, SI, DI. Кроме того, в первых четырех РОН отдельно адресуются как младшие (Low), так и старшие байты (High) этих регистров. Таким образом, в программах также можно указывать, по отдельности, имена регистров AL, BL, CL, DL и AH, BH, CH, DH. Это сделано для возможности использования программ, разработанных для младших моделей процессоров семейства Х86. Таким образом, первые четыре регистра РОН позволяют процессору легко оперировать байтами, словами и двойными словами. Однако, старшие половины регистров EAX, EBX, ECX, EDX, отдельно адресовать нельзя.

РОН участвует в командах операций с данными, а также применяется при использовании различных режимах адресации. При этом, в старших моделях семейства, начиная с МП 80386, все восемь регистров РОН можно использовать для адресации операндов, как в качестве базовых, так и в качестве индексных регистров.

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

EAX/AX/AL – регистр аккумулятор (Accumulator). Этот регистр наиболее часто используется для хранения промежуточных данных, поскольку многие команды оперируют данными в регистре аккумуляторе несколько быстрее, чем в других регистрах. Кроме того, при операциях умножения/деления, множимое/делимое всегда содержится в аккумуляторе до выполнения самой операции, а после операции в нем запоминается произведение/частное. Причем, при умножении байтовых операндов, множимое хранится в регистре AL, а произведение – в регистре AX. При умножении слов, множимое хранится в регистре AX, а произведение – в регистре EAX. При умножении двойных слов, множимое хранится в регистре EAX, а произведение запоминается в двух регистрах: младшие два байта – в регистре EAX, а старшие два байта – в регистре EDX.

 

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

 

2. Указатель инструкции (IP) и регистр флагов (FLAGS)

 

 

3. Сегментные регистры

 
 

Рис. II.1. Пользовательские регистры процессоров семейства Х86.

 

 

Что касается операции деления, то, прежде всего, заметим, что в самом CPU, операция деления, осуществляется только как целочисленное деление со знаком или без знака. Все операции с вещественными числами осуществляются в арифметическом сопроцессоре. При делении слова, делимое всегда располагается в регистре AX. При этом после операции, частное находится в регистре AL, а остаток – в регистре AH. При делении двойного слова, старшие два байта делимого размещаются в регистре DX, а младшие два байта – в регистре AX. После операции, частное располагается в регистре AX, а остаток – в регистре DX. Наконец, при делении учетверенного слова (квадрослова), старшая часть (четыре байта) этого квадрослова размещается в регистре EDX, а младшая – в регистре EAX. После операции частное располагается в регистре EAX, а остаток – в регистре EDX.

При этом, адресация множителя и делителя указывается в самой команде (инструкции).

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

При реализации команд сканирования цепочек SCAS, сравнение элементов цепочек осуществляется также только с байтами, словами или двойными словами, размещенными, соответственно, в регистре AL, AX или EAX. Сама же цепочка, подвергающаяся сканированию должна размещаться обязательно в сегменте ES.

Кроме того, вся десятичная арифметика выполняется только с участием регистра AL.

EBX/BX – базовый регистр (Base). Применяется для указания базового (начального) адреса объекта данных в памяти, а также содержит базовый адрес таблицы в команде преобразования XLAT. В МП 8086…80286 является единственным базовым регистром при формировании эффективного адреса в сегменте DS.

ECX/CX/CL – регистр-счетчик (Counter). Участвует в качестве счетчика в некоторых командах, которые осуществляют повторяющиеся операции (число которых предварительно записывается в регистр CX/CL), например, при организации циклов, при сдвиговых операциях или при операциях с цепочками (строками).

EDX/DX - регистр данных (Data). Наиболее часто привлекается для хранения промежуточных данных, а также в командах умножения и деления (совместно с аккумулятором). Кроме того, в командах ввода/вывода, при числе портов, превышающем 256, когда приходиться использовать косвенную адресацию, регистр DX содержит адрес порта, к которому производится обращение.

ESP/SP – указатель стека (Stack Pointer). Этот регистр неявно используется в командах PUSH (включение в стек) и POP (извлечение из стека), а также в других стековых операциях, которые процессор автоматически выполняет при обработке прерываний и особых случаев. Кроме того, он используется при исполнении команд CALL (вызов подпрограммы), RET (возврат из подпрограммы) и IRET (возврат из подпрограммы обслуживания прерывания). Регистр ESP/SP адресует вершину стека в текущем сегменте стека.

EBP/BP – указатель базы(Base Pointer). Используется как базовый регистр при формировании эффективного адреса, в случае необходимости произвольного доступа к объектам данных, находящихся в стековой области памяти, например к параметрам подпрограмм.

ESI/SI – индекс источника (Source Index). При реализации цепочечных операций, этот регистр адресует в соответствующем сегменте текущий элемент цепочки – источника. При этом осуществляется автоматический инкремент/декремент содержимого данного регистра. Может также использоваться при формировании эффективных адресов.

EDI/DI – индекс получателя или приемника (Destination Index). При реализации цепочечных операций, адресует в сегменте ES текущий элемент цепочки – получателя. При этом также осуществляется автоматический инкремент/декремент содержимого данного регистра. Может использоваться при формировании эффективных адресов.

 

 

Сегментные регистры

Сегментные регистры предназначены для хранения информации о расположении соответствующих сегментов памяти в адресном пространстве.

CS – сегментный регистр кода (Code Segment Register). Содержит селектор текущего сегмента кода, т.е. сегмента, в котором размещаются исполняемые программы.

SS – сегментный регистр стека (Stack Segment Register). Содержит селектор текущего сегмента стековой памяти.

DS – сегментный регистр данных (Data Segment). Содержит селектор основного текущего сегмента используемых данных.

ES, FS, GS – дополнительные сегментные регистры данных (ES – Extra Segment, FS и GS – просто обозначения). Эти регистры содержат селекторы, определяющие расположение в адресном пространстве дополнительно еще трех сегментов данных, доступных текущей программе. Специфика сегмента ES заключается в том, что только в нем размещается строка назначения (приемника) или стробирования, при обработке цепочечных команд. Дополнительные сегменты данных FS и GS, впервые появившиеся в МП 80386, не несут каких либо специфических функций и применяются только для удобства размещения данных, и их использование определяется организацией структур данных (способах размещения данных в сегментах). Отметим также, что регистры FS и GS, ни в каких командах по умолчанию не определены.

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

Кроме того, надо учитывать, что сегментный регистр кода CS, в защищенном режиме работы процессора, является программно недоступным, и в него, отличие от всех других, вообще нельзя занести какую либо информацию без специального приема альтернативного переименования сегментов. Начальное содержание CS устанавливается при инициализации системы и затем изменяется программно при выполнении команд межсегментных (дальних - FAR) переходов и вызовов, таких как CALL, JMP, а также при переключении задач.

В базовом микропроцессоре i8086, а также в последующих моделях процессорах семейства Х86 в реальном режиме работы, селектором (указателем начального адреса сегмента) являются старшие 16 разрядов полного 20-ти разрядного адреса младшего байта соответствующего сегмента (младшие 4 разряда полного адреса принимаются равными нулям).

В защищенном режиме работы процессоров семейства Х86, адрес начала любого сегмента (базовый адрес) содержится в так называемом дескрипторе, некоторой 8-ми байтовой структуре данных, адрес которого, в свою очередь, определяется содержимым соответствующего сегментного регистра, т.е. селектором. Для указания адреса конкретного байта внутри сегмента к базовому адресу прибавляется смещение (offset), которое указывается непосредственно в команде. Если сегмент не указывается, то по умолчанию используется сегмент в соответствии с таблицей II.1.

Для каждого из сегментных регистров предусмотрен префикс замены сегмента. Однако этот префикс действует на выбор сегмента не во всех случаях.

- Для цепочек – получателей в цепочечных командах применяется всегда только сегмент ES.

- Получатель включения в стек или извлечения из стека находится всегда только в сегменте SS.

- Выборка команд производится всегда только из сегмента CS.

 

Таблица II.1.

Возможности переопределения сегментных регистров

  Тип обращения к памяти Базовый адрес сегмента Сегментное смещение
По умолчанию Возможность переопределения  
Выборка команды CS Нет IP(EIP)
Обращение к стеку SS Нет SP(ESP)
Адресация операнда DS CS, SS, ES, FS, GS EA
Адресация операнда с использованием BP(EBP) или SP(ESP) как базового регистра SS CS, DS, ES, FS, GS EA
Адресация элемента цепочки-источника DS CS, SS, ES, FS, GS SI(ESI)
Адресация элемента цепочки-получателя (приемника) ES Нет DI(EDI)

 

Регистр указателя инструкций.

Регистр указателя инструкций EIP/IP (Instruction Pointer) предназначен для адресации команд внутри текущего сегмента кода. То есть, в этом регистре содержится смещение в сегменте кода. Программист должен полагать, что к окончанию выборки из памяти текущей команды в регистре EIP/IP образуется адрес следующей по порядку команды. Однако надо иметь в виду, что с учетом внутренней конвейерной архитектуры современных процессоров, а также опережающей выборки команд из оперативной памяти, ситуация с адресацией команд обстоит несколько сложнее.

Указатель команд (инструкций) в командах прямо не указывается, но он обязательно участвует во всех командах передачи управления, к которым относятся команды условных и безусловных переходов, вызова подпрограмм, возврата из подпрограмм и др. В операциях с регистром EIP участвуют двойные слова, а в операциях с регистром IP – слова.

Для сведения, несколько забегая вперед, отметим, что современный процессор из памяти выбирает не по одной команде. Он осуществляет опережающую выборку выровненных 16 байтных (в МП 80386 и i486) или 32 байтных (в МП типа Pentium+) блоков. (4 слова по 32 разряда в первом случае и 4 слова по 64 разряда – во втором). Отметим, что в том и другом случае, размер этих слов соответствует емкости строк соответствующей внутренней кэш-памяти. Заметим также, что выровненный 16 байтный блок всегда должен выбираться по адресу с нулевыми 4 младшими битами, а выровненный 32 байтный блок – с 5 нулевыми младшими битами. Таким образом, при выполнении перехода или вызова процессор выбирает целый выровненный блок по указанному адресу назначения.

 

Регистр флагов

Регистр флагов EFLAFGS/FLAGS (рис.II.2) содержит флаги, которые можно разделить на флаги состояния (NT, OF, SF, ZF, AF, PF, CF) и флаги управления (ID, VIP, VIF, AC, VM, RF, DF, IF, TF, IOPL).

Флаги состояния сообщают об особенностях результата выполнения команд обработки данных. Команды условных переходов позволяют программе учесть состояние этих флагов и отреагировать на них. Команды простой пересылки данных не воздействуют на флаги состояния. Флаги состояния OF, SF, ZF, AF, PF, CF называют, кроме того, арифметическими флагами, поскольку они отражают ту или иную особенность результата арифметической или логической операции.

Рис.II.2. Распределение флагов в регистре EFLAGS/FLAGS.

 

Рассмотрим правила установки флагов состояния более подробно.

CF (Carry Flag) – флаг переноса. Устанавливается в 1, если арифметическая операция вызвала перенос (при операции сложения) из старшего бита результата, или заем (при операции вычитания). В противном случае флаг сбрасывается в 0. В зависимости от разрядности операнда, старшим битом может являться бит 7 (байты), 15 (слова) или 31 (двойные слова). Флаг CF может также изменять свое состояние при сдвиговых операциях. С помощью специальных команд этот флаг можно установить в любое состояние или инвертировать его. Используется процессором в основном при исполнении команд условных переходов и при сдвиговых операциях. При арифметических операциях с целыми беззнаковыми числами служит признаком переполнения разрядной сетки. Кроме того, процессор использует этот флаг при обработке многоразрядных чисел, с разрядностью, превышающей разрядность сумматора арифметико-логического устройства (АЛУ).

PF (Parity Flag) – флаг паритета (четности). Флаг устанавливается в 1, если младший байт результата содержит четное число единичных бит; в противном случае флаг устанавливается в состояние 0. Используется процессором при исполнении команд условных переходов, а также для контроля четности/нечетности при передаче данных.

AF (Auxiliary Carry Flag) – флаг дополнительного переноса. Устанавливается в 1, если арифметическая операция вызвала перенос (при сложении) из первой тетрады младшего байта результата, или заем (при вычитании). В противном случае флаг устанавливается в 0. Используется процессором при операциях десятичной арифметики: при AF=1 процессор вводит коррекцию в полученный результат. Программно этот флаг недоступен.

ZF (Zero Flag) – флаг нулевого результата. Устанавливается в состояние 1, когда результат операции равен 0; в противном случае он сбрасывается в 0. В операциях сравнения ZF устанавливается в 1, когда сравниваемые операнды равны, так как операция сравнения производится с помощью вычитания операндов. Используется процессором при выполнении операций условных переходов.

SF (Sign Flag) – флаг знака результата. Устанавливается в то же состояние, в каком находится старший байт результата. В зависимости от разрядности операндов этим битом может быть бит 7, 15 или 31. При использовании целых чисел со знаком, представляемых в дополнительном коде, флаг SF показывает знак результата. Используется процессором при выводе результатов операций, а также при исполнении команд условных переходов.

OF (Overflow Flag) – флаг переполнения разрядной сетки. Флаг OF устанавливается в 1, если при арифметических операциях с целыми знаковыми операндами результат превышает диапазон представления чисел; в противном случае флаг OF устанавливается в 0. Этот флаг введен потому, что при знаковых операндах, установление флага CF в 1 не может служить критерием переполнения разрядной сетки (также как и установка флага ОF в состояние 1 еще не может служить признаком переполнения разрядной сетки при операциях с беззнаковыми целыми числами). Значение флага OF определяется логической функцией неравнозначности сигналов переноса в старший (знаковый) бит результата и из старшего бита. В зависимости от размера операндов старшим битом может являться бит 7, 15 или 31. Флаг OF используется процессором при контроле правильности выполнения арифметических операций и исполнении команд условных переходов.

NT (Nested Task) – флаг вложенной задачи. Этот флаг действует только в защищенном режиме (Р – режиме) и устанавливается в 1, когда текущая задача переключается на другую задачу с помощью команды вызова CALL. Таким образом, с помощью этого флага организуется цепь вложенных задач аналогично вложению подпрограмм. Состояние флага NT проверяется процессором при выполнении команды возврата из прерывания IRET и при NT = 1 осуществляется переключение задачи, а при NT = 0 происходит обычный возврат из подпрограммы с восстановлением из стека содержимого регистров CS, EIP, EFLAGS.

Флаги управления в регистре флагов воздействуют на те или иные аспекты работы процессора.

IOPL (Input/Output Privilege Level) – уровень привилегий ввода/вывода. Это двухбитовое поле является составной частью системы защиты процессора и действует только в P – режиме. Оно показывает тот минимальный уровень привилегий выполняющейся задачи, на котором разрешается производство операций ввода/вывода. Таким образом, эти два бита используются для управления доступом к адресному пространству ввода/вывода. Запись информации в эти два бита может быть произведена командами программ, расположенными только на уровне 0 колец защиты.

TF (Trap Flag или Trace Flag) – флаг пошаговой работы (трассировки). Когда этот флаг установлен в состояние 0, процессор работает обычным образом, а при TF =1 он переводится в режим пошаговой (покомандной) работы, т.е. после выполнения каждой команды генерируется внутреннее прерывание. При этом управление передается отладчику, который обычно выводит на экран дисплея состояние процессора в данный момент времени, и останавливает работу процессора в ожидании действий пользователя. Этот флаг является одним из средств, предназначенных для отладки программ.

IF (Interrupt Flag) – флаг управления прерываниями. Когда флаг IF установлен в состояние 1, процессор распознает и обрабатывает внешние маскируемые аппаратные прерывания, запрос на которые поступает от контроллера прерываний по входу INTR. Таким образом, установка флага IF в состояние 1 разрешает процессору реагировать на внешние прерывания. Если же флаг IF=0, внешние прерывания запрещены, и процессор игнорирует сигналы прерывания по входу INTR. Однако на внешние прерывания по входу NMI установка флага IF влияния не оказывает, так же как и на прерывания внутренние. Отметим, что на выполнение команд, задающих состояние флага IF, влияет механизм защиты процессора.

DF (Direction Flag) – флаг направления обработки цепочек. После операции над одним элементом цепочки производится автоматический инкремент (при DF=0) или декремент (при DF=1) содержимого индексных регистров ESI/SI и EDI/DI, в которых формируются адресные смещения в соответствующих сегментах. Таким образом, при DF=0 цепочки обрабатываются от младших адресов к старшим, а при DF=1 обработка цепочек осуществляется от старших адресов к младшим. Величина инкремента/декремента, составляет 1,2 или 4 в зависимости от размера элементов цепочек (байт, слово или двойное слово). Для задания нужного состояния флага DF в системе команд процессора предусмотрены специальные инструкции.

RF (Resume Flag) – флаг возобновления. Этот флаг является составной частью новых средств отладки и действует совместно с регистрами отладки. Используется при отладке программ с помощью контрольных точек. Значение флага проверяется между командами перед прерыванием. Если этот флаг установлен в 1, то любая ошибка отладки перед выполнением следующей команды игнорируется. Флаг RF автоматически сбрасывается при успешном завершении каждой команды, сигнализируя об отсутствии ошибки. Исключения составляют команды IRET, POPF, JMP, CALL и INT, вызывающие переключения задач. Перечисленные команды устанавливают значение флага RF в соответствии с содержимым EFLAGS, вызываемым из памяти.

VM (Virtual Mode) – флаг виртуального режима (V – режима) процессора. Когда VM = 0, процессор может работать в R – или P – режиме, а при VM = 1 процессор превращается в многозадачный высокопроизводительный процессор 8086. Каждой такой задаче выделяется 1 Мбайт адресного пространства. Флаг VM можно установить в состояние 1 только в защищенном режиме работы, т.е. в P – режиме: командой IRET на нулевом уровне привилегий или переключением задач на любом уровне привилегий. Таким образом, установка флага VM в состояние 1 переводит процессор в V – режим, который эмулирует программную среду процессора 8086.

AC (Alignment Cheсk) – флаг контроля выравнивания. Установка в 1 флага AC (а также бита AM в регистре управления CR0) разрешает контроль выравнивания при обращении к памяти. Особый случай контроля выравнивания возникает при обращении к невыравненному операнду, например к слову с нечетным байтовым адресом или к двойному слову, адрес которого не кратен четырем. Особые случаи выравнивания генерируются только в режиме пользователя (уровень привилегий 3). Обращение к памяти, которые по умолчанию относятся к уровню привилегий 0, например, загрузка дескриптора сегмента, не формируют этого особого случая при обращении к памяти даже в режиме пользователя. Наличие контроля выравнивания удобно при обмене данными с другими процессорами, например с процессором i860, который требует выравнивания всех данных.

ID (Identification – опознание, выяснение) – флаг идентификации. Этот флаг предназначен для проверки, поддерживается ли процессором команда CPUID или нет. Если в программе можно установить и сбросить этот флаг, значит, команда CPUID данным процессом поддерживается. Команда же CPUID предоставляет программному обеспечению информацию о продавце, семействе, модели и поколении процессора, на котором она выполнена. Входное значение, загружаемое в регистр EAX, указывает какую информацию необходимо вернуть командой CPUID. После выполнения команды CPUID со значением 0 в EAX, регистр EAX будет содержать максимальное значение, понимаемое командой CPUID. Для процессоров Pentium значение в EAX будет равно 1. В выходное значение этой команды будет также включена строка идентификации продавца, содержащаяся в регистрах EBX, EDX, и ECX. Регистр EBX содержит первые четыре символа данной строки, регистр EDX содержит следующие четыре символа и, наконец, регистр ECX содержит последние четыре символа строки. Для процессоров Intel строка идентификации продавца имеет следующий вид: «GenuineIntel». После выполнения команды CPUID со значением 1 в EAX, EAX[3:0] содержит номер разработки микропроцессора, EAX[7:4] содержит номер модели, (первая модель будет указана в этих битах как 0001B), и EAX[11:8] содержит семейство (5 для линии процессоров Pentium). Регистры EAX [31:12], EBX и ECX – зарезервированы. В EDX указаны еще несколько характеристик (какие свойства данная модель поддерживает).

VIP (Virtual Interrupt Pending) – ожидание виртуального прерывания, а также:

VIF (Virtual Interrupt Flag) – флаг виртуального прерывания, позволяют каждой прикладной программе, в многозадачном режиме, иметь виртуальную версию флага IF.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных