Регистры архитектуры x86

 

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

 

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

 

Пользовательские регистры называются так потому, что программист может использовать их при написании своих программ. К этим регистрам относятся:

         восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (их еще называют регистрами общего назначения (РОН)):

o        eax/ax/ah/al;

o        ebx/bx/bh/bl;

o        edx/dx/dh/dl;

o        ecx/cx/ch/cl;

o        ebp/bp;

o        esi/si;

o        edi/di;

o        esp/sp.

         шесть регистров сегментов: cs, ds, ss, es, fs, gs;

         регистры состояния и управления:

o        регистр флагов eflags/flags;

o        регистр указателя команды eip/ip.

         регистры сопроцессора x87 и расширения MMX

         регистры расширения XMM

 

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

 

32 бита

 

 

16 бит

 

 

 

8 бит

 

 

 

 

EAX

 

AX

AH

AL

EBX

 

BX

BH

BL

ECX

 

CX

CH

CL

EDX

 

DX

DH

DL

ESI

 

SI

EDI

 

DI

EBP

 

BP

ESP

 

SP

 

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

 

 

16 бит

Указатель сегмента кода

 

CS

Указатель сегмента стека

 

SS

Указатели сегментов данных

 

DS

ES

FS

GS

 

 

32 бита

 

 

16 бит

EIP

 

IP

EFLAGS

 

FLAGS

 

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

Все регистры этой группы позволяют обращаться к своим младшим частям. Для самостоятельной адресации можно использовать только младшие 16 и 8-битные части этих регистров. Старшие 16 бит этих регистров как самостоятельные объекты недоступны. Это сделано, для совместимости с младшими 16-разрядными моделями микропроцессоров фирмы Intel.

 

Перечислим регистры, относящиеся к группе регистров общего назначения.

  • eax/ax/ah/al (Accumulator register) - аккумулятор.

Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно;

  • ebx/bx/bh/bl (Base register) - базовый регистр.

Часто применяется для хранения базового адреса некоторого объекта в памяти;

  • ecx/cx/ch/cl (Count register) - регистр-счетчик.

Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;

  • edx/dx/dh/dl (Data register) - регистр данных.

Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.

Следующие два регистра используются для поддержки так называемых строковых операций, то есть операций, производящих последовательную обработку строк элементов, каждый из которых может иметь длину 32, 16 или 8 бит:

  • esi/si (Source Index register) - индекс источника.

Этот регистр в цепочечных операциях содержит текущий адрес элемента в строке-источнике;

  • edi/di (Destination Index register) - индекс приемника (получателя).

Этот регистр в цепочечных операциях содержит текущий адрес в строке-приемнике.

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

  • esp/sp (Stack Pointer register) - регистр указателя стека.

Содержит указатель вершины стека в текущем сегменте стека.

  • ebp/bp (Base Pointer register) - регистр указателя базы кадра стека.

Предназначен для организации произвольного доступа к данным внутри стека. Часто регистр bp/ebp хранит адрес начала локальных переменных текущей подпрограммы.

Все регистры общего назначения (кроме esp) могут использоваться при программировании для хранения операндов практически в любых сочетаниях. Но некоторые команды используют фиксированные регистры для выполнения своих действий. Использование жесткого закрепления регистров для некоторых команд позволяет более компактно кодировать их машинное представление.

 

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

В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно, такая организация памяти называется сегментной.

Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, в этих регистрах содержатся адреса памяти, с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:

  1. Сегмент кода. Содержит команды программы.

Для доступа к этому сегменту служит регистр cs (code segment register) - сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ процессор (то есть эти команды загружаются в конвейер микропроцессора).

  1. Сегмент данных. Содержит обрабатываемые программой данные.

Для доступа к этому сегменту служит регистр ds (data segment register) - сегментный регистр данных, который хранит адрес сегмента данных текущей программы.

  1. Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком.

Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) - сегментный регистр стека, содержащий адрес сегмента стека.

  1. Дополнительный сегмент данных.

Большинство машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в регистре ds.

Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).

 

Регистры состояния и управления

В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:

  • регистр флагов eflags/flags;
  • регистр указателя команды eip/ip.

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

eflags/flags (flag register) - регистр флагов. Разрядность eflags/flags - 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для микропроцессора i8086. На рисунке показано содержимое регистра eflags.

 

Содержимое регистра eflags

 

Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:

  • 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд.

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

  • 1 флаг направления. Обозначается df (Directory Flag).

Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1);

Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df).

Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;

  • 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.

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

 

Флаги состояния

Мнемоника флага

Флаг

Номер бита в eflags

Содержание и назначение

cf

Флаг переноса
(Carry Flag)

0

1 ≈ арифметическая операция произвела перенос из старшего бита результата. Старшим является 7, 15 или 31-й бит в зависимости от размерности операнда;

0 ≈ переноса не было

pf

Флаг паритета
(Parity Flag)

2

1 ≈ 8 младших разрядов результата содержат четное число единиц (этот флаг ≈ только для 8 младших разрядов операнда любого размера);

0 ≈ 8 младших разрядов результата содержат нечетное число единиц

af

Вспомогательный флаг переноса
(Auxiliary carry Flag)

4

Только для команд работающих с BCD-числами. Фиксирует факт заема из младшей тетрады результата:

1 ≈ в результате операции сложения был произведен перенос из разряда 3 в старший разряд или при вычитании был заем в разряд 3 младшей тетрады из значения в старшей тетраде;

0 ≈ переносов и заемов в(из) 3 разряд(а) младшей тетрады результата не было

zf

Флаг нуля (Zero Flag)

6

1 ≈ результат нулевой;

0 ≈ результат ненулевой

sf

Флаг знака
(Sign Flag)

7

Отражает состояние старшего бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно):

1 ≈ старший бит результата равен 1;

0 ≈ старший бит результата равен 0

of

Флаг переполнения
(Overflow Flag)

11

Флаг of используется для фиксирования факта потери значащего бита при арифметических операциях:

1 ≈ в результате операции происходит перенос (заем) в(из) старшего, знакового бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно);

0 ≈ в результате операции не происходит переноса (заема) в(из) старшего, знакового бита результата

iopl

Уровень Привилегий ввода-вывода
(Input/Output Privilege Level)

12, 13

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

nt

флажок вложенности задачи
(Nested Task)

14

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

 

Системные флаги

Мнемоника флага

Флаг

Номер бита в eflags

Содержание и назначение

tf

Флаг трассировки
(Trace Flag)

8

Предназначен для организации пошаговой работы микропроцессора.

1 ≈ микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды. Может использоваться при отладке программ, в частности отладчиками;

0 ≈ обычная работа

if

Флаг прерывания
(Interrupt enable Flag)

9

Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по входу INTR).

1 ≈ аппаратные прерывания разрешены;

0 ≈ аппаратные прерывания запрещены

rf

Флаг возобновления
(Resume Flag)

16

Используется при обработке прерываний от регистров отладки.

vm

Флаг виртуального
(Virtual 8086 Mode)

17

Признак работы микропроцессора в режиме виртуального 8086.

1 ≈ процессор работает в режиме виртуального 8086;

0 ≈ процессор работает в реальном или защищенном режиме

ac

Флаг контроля выравнивания
(Alignment Check)

18

Предназначен для разрешения контроля выравнивания при обращениях к памяти. Используется совместно с битом am в системном регистре cr0. К примеру, Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию

 

eip/ip (Instraction Pointer register) ≈ регистр-указатель команд.

Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.

 

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

Сопроцессор (FPU) предназначен для выполнения операций над вещественными числами. С программной точки зрения сопроцессор содержит блок регистров данных, регистр управления и группу регистров состояния и указателей. Восемь регистров данных разрядностью 80 бит организованы в стек. Номер регистра, являющегося текущей вершиной стека, хранится в специальном поле регистра состояния (указателе вершины стека). Операция push уменьшает значение указателя на 1 и помещает в стек данные в регистр, являющийся новой вершиной стека. Операция pop записывает данные с вершины стека в память или регистр и увеличивает указатель на 1. Инструкции адресуют регистры либо явно, либо неявно. Неявная адресация подразумевает операнд, находящийся на вершине стека. Явная адресация подразумевает указание смещения регистра относительно вершины стека - st(i).

 

Регистры данных FPU (арифметический стек)

 

Физические номера

80 бит

Относительные номера

1 бит

15 бит

64 бит

Знак

Порядок

Мантисса

0

 

 

mm0

ST(5)

1

 

 

mm1

ST(6)

2

 

 

mm2

ST(7)

3

 

 

mm3

ST(0)

4

 

 

mm4

ST(1)

5

 

 

mm5

ST(2)

6

 

 

mm6

ST(3)

7

 

 

mm7

ST(4)

 

 

 

Регистры MMX / 3DNow!

 

 

Расширение MMX

MMX было первым расширением, реализующим технологию SIMD (Single Instruction - Multiple Data). Основная идея SIMD заключается в одновременной обработке нескольких элементов данных одной операцией. Расширение MMX использует новые типы упакованных 64-битные целочисленных данных:

-         8 упакованных байт (Packed byte);

-         4 упакованных слова (Packed word);

-         2 упакованных двойных слова (Packed double word);

-         1 учетверенное слово (Quad word);

Эти типы данных могут специальным образом обрабатываться в 64-битных регистрах MM0-MM7, представляющих собой младшие биты стека 80-битных регистров FPU. Каждая инструкция MMX выполняет действие сразу над всем комплектом операндов (8, 4, 2 или 1), размещенных в адресуемых регистрах. Как и регистры FPU, эти регистры не могут использоваться для адресации памяти. Совпадение регистров MMX и FPU накладывает ограничение на чередование кодов FPU и MMX. В отличие от стека FPU регистры MMX адресуются не с помощью стека, а физически (по своим физическим номерам).

 

Расширение 3DNow!

Технология 3DNow!, разработанная AMD, расширяет возможности MMX. Она позволяет оперировать с новым типом данных - парой упакованных вещественных чисел одинарной точности. Эти числа занимают по двойному слову (32 бита) в 64-битных регистрах MMX.

Расширение 3DNow! работает с упакованными данными в FP-формате с одинарной точностью, а также упакованными 8 байт, 4 слова, 2 двойных слова и 64-битными целыми числами, размещая их в младших 64 битах регистров FPU/MMX.

 

Блок XMM

Начиная с Pentium III, Intel использует в своих процессорах новое потоковое расширение SSE (Streaming SIMD Extension). Оно реализуется дополнительным независимым блоком, имеющим восемь 128-битных регистров, названных XMM0-XMM7, и регистр состояния/управления MXCSR. В каждый из регистров XMM помещаются четыре числа в формате с плавающей точкой одинарной точности. Блок позволяет выполнять векторные (пакетные) и скалярные инструкции. Векторные инструкции реализуют операции сразу над четырьмя комплектами операндов. Скалярные инструкции работают только с одним комплектом операндов - младшим 32-битным словом. При выполнении инструкций XMM традиционное оборудование FPU/MMX не используется, что позволяет эффективно смешивать инструкции MMX с инструкциями с плавающей точкой.

Кроме инструкций с новым блоком XMM в расширение SSE входят и дополнительные целочисленные инструкции с регистрами MMX, а также инструкции управления кэшированием.

 

В процессоре Pentium4 набор инструкций получил новое расширение - SSE2, в основном касающееся добавления новых типов 128-битных типов данных для блока XMM:

-         упакованная пара вещественных чисел двойной точности;

-         упакованные целые числа: 16 байт, 8 слов, 4 двойных слова или пара учетверенных слов.

В процессор введены новые функции целочисленной арифметики, 128-разрядные для регистров XMM и такие же 64-разрядные для регистров MMX; ряд старых инструкций MMX распространили на XMM (в 128-битном варианте); добавлены инструкции преобразования для новых форматов данных, а также расширены возможности "перемешивания" данных в блоке XMM. Кроме того, расширена поддержка управления кэшированием и порядком исполнения операций с памятью.

 

 

Регистры архитектуры x86-64 (AMD64)

Выпущенные недавно фирмой AMD новые процессоры Athlon64 и Opteron имеют архитектуру x86-64, которая в отличие от архитектуры x86 является полностью 64-битной. Она естественным образом расширяет регистры общего назначения x86 до 64 битов и увеличивает их количество. Также удваивается число регистров XMM. Регистры FPU/MMX остаются без изменений.

 

 

64 бита

 

 

 

 

 

32 бита

 

 

 

 

 

 

 

16 бит

 

 

 

 

 

 

 

 

8 бит

RAX

 

EAX

 

AX

AH

AL

 

 

SSE

128 бит

 

64 бита

 

XMM0

RAX

 

EAX

 

XMM1

RBX

 

EBX

 

XMM2

RCX

 

ECX

 

XMM3

RDX

 

EDX

 

XMM4

RSI

 

ESI

 

XMM5

RDI

 

EDI

 

XMM6

RBP

 

EBP

 

XMM7

RSP

 

ESP

 

XMM8

R8

 

 

XMM9

R9

 

 

XMM10

R10

 

 

XMM11

R11

 

 

XMM12

R12

 

 

XMM13

R13

 

 

XMM14

R14

 

 

XMM15

R15

 

 

В отличие от процессоров x86, у которых все вещественные вычисления производились в сопроцессоре, а блоку XMM отводились только векторные операции, процессоры x86-64 практически все вещественные вычисления выполняют в блоке XMM.