Регистровая архитектура х86-совместимых процессоров

Регистр — электронное устройство, способное хранить небольшой объем цифровой информации и состоящее из триггеров.

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

Количество триггеров в регистре определяет его разрядность, т.е. количество бит информации, которое возможно хранить в регистре.

Регистр процессора — блок ячеек памяти, образующий сверхбыструю оперативную память (СОЗУ) процессора; используется самим процессора.

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

Большинство регистров процессора недоступны программисту. Соответственно регистры процессора можно разделить:

• на программно доступные — программист может изменять эти

регистры по своему усмотрению;

• программно недоступные (скрытые) — доступ к ним имеет только

ЦП, поэтому программист либо не имеет возможности изменить

их, либо может изменять их только косвенным образом.

Некоторые регистры х86-совместимых процессоров:

  • 1. Основные регистры:
    • • регистры общего назначения;
    • • сегментные регистры;
    • • регистр указателя следующей команды;
    • • регистр флагов (состояния).
  • 2. Регистры управления памятью.
  • 3. Регистры управления процессором.
  • 4. Отладочные регистры.
  • 5. Регистры FPU(регистры математического сопроцессора).
  • 6. Расширения архитектуры х86 (х86 extended features).
  • 7. Прочие регистры.
  • 1. Основные регистры. Программно доступные. К ним относятся регистры общего назначения, хранят операнды арифметических и логических выражений, индексы, адреса и делятся:
    • • на регистры данных;
    • • регистры индексов;
    • • регистры указателей.

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

  • RAX, ЕАХ, АХ, АН, AL — регистры аккумулятора (Accumulator). Используются для хранения результата арифметических действий;
  • RBX, ЕВХ, ВХ, ВН, BL — регистры базы (Base). Используются для адресации по базе;
  • RCX, ЕСХ, СХ, СН, CL — регистры счетчика (Counter). Используются для организации циклов и в строковых операциях;
  • RDX, EDX, DX, DH, DL — регистры данных (Data). Используются для хранения старшей части результата в том случае, если он не помещается полностью в аккумулятор. Могут использоваться как адресные регистры при работе с портами ввода вывода;

Таблица 4.2

Регистры данных

RAX

RCX

RDX

RBX

ЕАХ

ЕСХ

EDX

ЕВХ

АХ

СХ

DX

ВХ

АН AL

СН CL

DH DL

ВН BL

RSP

RBP

RSI

RDI

Rx

ESP

EBP

ESI

EDI

RxD

SP

BP

SI

DI

RxW

SPL

BPL

SIL

DIL

RxB

  • RS R15, RSD R5D, RSW R5W, RSB R5B — дополнительные регистры данных, появившиеся в 64-разрядных процессорах:
  • - RAX, RCX, RDX, RBX, /^Р, /??Р, /Ш, Л/)/, /?8-/?15 - 64-бит-ные;
  • - ?4Х, PCX, EDX, ЕВХ, PSP, ОР, ?5/, ?/)/, /?8Z)-/?15Z) -32-битные (extended АХ);
  • - АХ, СХ, DX, ВХ, SP, BP, SI, Dl, RSW-RX5W- 16-битные;
  • - АН, AE, CH, СЕ, DH, DE, ВН, BL, SPE, ВРЕ, SIL, DIE, RSB— R5B— 8-битные (половинки 16-битных регистров).

Например, АН — high АХ — старшая половинка 8 бит, AL — low АХ — младшая половинка 8 бит.

Регистры RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, Rx, RxD, RxW, RxB, SPL, BPL, SIL, DIE доступны только в 64-битном режиме работы процессора.

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

  • RSI, ESI, SI, SIE — индекс источника (Source Index);
  • RDI, EDI, DI, DIE — индекс приемника (Destination Index). Регистры указателей (см. табл. 4.3) могут использоваться для хранения временных переменных, но только тогда, когда не используются по основному назначению. Используются при работе со стеком и при адресации по базе:
  • RBP, EBP, BP, BPL — указатель базы (Base Pointer);
  • RSP, ESP, SP, SPE — указатель стека (Stack Pointer).

Таблица 4.3

Регистры индексов и указателей

RSP

RBP

RSI

RDI

Rx

ESP

EBP

ESI

EDI

RxD

SP

BP

SI

DI

RxW

SPL

BPL

SIL

DIL

RxB

Регистры SIE, DIE, ВРЕ, SPE появились только в 64-разрядных процессорах.

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

Используются для хранения селекторов сегментов.

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

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

Сегментные регистры имеют разрядность 16 бит и делятся:

  • • на CS — регистр сегмента кода (Code Segment);
  • SS — регистр сегмента стека (Stack Segment);
  • DS (Data Segment), ES (Extended data Segment), FS, GS — регистры

сегментов данных.

Регистр указателя следующей команды. RIP, EIP, IP (Instruction Pointer) — хранит смещение следующей команды относительно кодового сегмента.

В 64-разрядных процессорах используется свой регистр — указатель инструкций — RIP.

Младшей частью этого регистра является регистр EIP.

На основе RIP в 64-разрядных процессорах введен новый метод адресации RIP-relative. В остальном работа RIP аналогична работе регистра EIP.

Регистр флагов. RFLAGS, ЕFLAGS, FLAGS — регистры, использующиеся при выполнении большинства команд; например, инструкции условного перехода используют один или несколько флагов состояния для проверки условия. Структура регистра флагов приведена в табл. 4.4.

Таблица 4.4

Структура регистра флагов

Бит,

Обозна

чение

Название

Описание

Тип флага

Когда

введен

FLAGS

0

CF

Carry Flag

Флаг переноса

Состояние

1

1

Зарезервирован

2

PF

Parity Flag

Флаг четности

Состояние

3

0

Зарезервирован

4

AF

Auxiliary Carry Flag

Вспомогательный флаг переноса

Состояние

5

0

Зарезервирован

6

ZF

Zero Flag

Флаг нуля

Состояние

Бит,

Обозна

чение

Название

Описание

Тип флага

Когда

введен

7

SF

Sign Flag

Флаг знака

Состояние

8

TF

Trap Flag

Флаг трассировки (пошаговое выполнение)

Системный

9

1F

Interrupt

Enable

Flag

Флаг разрешения прерываний

Системный

10

DF

Direction

Flag

Флаг направления

Управля

ющий

И

OF

Overflow

Flag

Флаг переполнения

Состояние

12

IOPL

I/O

Privilege

Level

Уровень приоритета ввода/вывода

Системный

80286

13

14

NT

Nested

Task

Флаг вложенности

задач

Системный

80286

15

0

Зарезервирован

EFLAGS

16

RF

Resume

Flag

Флаг возобновления

Системный

80386

17

VM

Virtual -8086 Mode

Режим виртуального процессора 8086

Системный

80386

18

АС

Alignment

Check

Проверка выравнивания

Системный

80486SX

19

VIF

Virtual

Interrupt

Flag

Виртуальный флаг разрешения прерывания

Системный

Pentium

20

VIP

Virtual

Interrupt

Pending

Ожидающее виртуальное прерывание

Системный

Pentium

21

ID

ID Flag

Проверка на доступность инструкции CPU ID

Системный

Поздние

80486121

22

0

Зарезервированы

• • •

31

RFLAGS

32

0

Зарезервированы

• • •

63

В микропроцессорах Intel 8086 имеет название FLAGS и является 16-разрядным. Расширенные регистры EFLAGS и RFLAGS, введенные в архитектурах IA-32 (процессоры 80386) и х86-64, являются 32-бит-ными и 64-битными соответственно. Расширенные регистры сохраняют обратную совместимость.

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

Значение некоторых флагов в регистре флагов можно изменять напрямую, с помощью специальных инструкций (например, CLD для сброса флага направления), но нет инструкций, которые позволяют обратиться (проверить или изменить) к регистру флагов как к обычному регистру. Однако можно сохранять регистр флагов в стек или регистр (Е)АХ и восстанавливать регистр флагов из них с помощью инструкций LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD.

При приостановке задачи (используя многозадачные возможности процессора) процессор автоматически сохраняет значение флага регистров в TSS (task state segment), при активизации новой задачи процессор загружает регистр флагов из TSS новой задачи.

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

Флаги состояния в активном состоянии. Флаги состояния (биты 0, 2, 4, 6, 7 и 11) отражают результат выполнения арифметических инструкций, таких как ADD, SUB, MUL, DIV.

CF — устанавливается при переносе из/заеме в (при вычитании) старший значащий бит результата и показывает наличие переполнения в беззнаковой целочисленной арифметике. Также используется в длинной арифметике.

PF — устанавливается, если младший значащий байт результата содержит четное число единичных (ненулевых) битов. Изначально этот флаг был ориентирован на использование в коммуникационных программах: при передаче данных по линиям связи для контроля мог также передаваться бит четности. Принцип работы и инструкции для проверки флага четности облегчали проверку целостности данных.

AF — устанавливается при переносе или заеме из бита 4 результата. Этот флаг ориентирован на использование в двоично-десятичной (binary coded decimal, BCD) арифметике.

ZF— устанавливается, если результат машинной операции по модулю 2 в степени к (где к — разрядность ячейки) равен нулю.

SF — равен значению старшего значащего бита результата, который является знаковым битом в знаковой арифметике.

OF — устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде (регистре или ячейке памяти). Этот флаг показывает наличие переполнения в знаковой целочисленной арифметике (в дополнительном коде).

Из перечисленных флагов только флаг CF можно изменять напрямую с помощью инструкций STC, CLC и СМС. Также битовые инструкции (ВТ, BTS, ВТЯи ВТС) копируют указанный бит во флаг CF

Флаги состояния позволяют одной и той же арифметической инструкции выдавать результат трех различных типов: беззнаковое, знаковое и двоично-десятично кодированное (BCD) целое число. Если результат считать беззнаковым числом, то флаг CFпоказывает условие переполнения (перенос или заем); для знакового результата (в дополнительном коде) перенос или заем показывает флаг OF', а для 7?С/)-результата перенос/заем показывает флаг AF. Флаг 5F отражает знак знакового результата, флаг ZF отражает и беззнаковый, и знаковый нулевой результат.

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

Инструкции условного перехода Jcc (переход по условию сс, например УА^для перехода, если результат не ноль), SETcc (установить значение байта-результата в зависимости от условия сс), LOOPcc (организация цикла) и СМОУсс (условное копирование) используют один или несколько флагов состояния для проверки условия. Например, инструкция перехода JLE (jump if less or equal — переход, если «меньше или равен», <) проверяет условие «ZF- 1 или SEФ OF».

Флаг РЕ был введен для совместимости с другими микропроцессорными архитектурами и по прямому назначению используется редко. Более распространено его использование совместно с остальными флагами состояния в арифметике с плавающей запятой: инструкции сравнения (.FCOM, FCOMPm.n.) в математическом сопроцессоре устанавливают в нем флаги-условия СО, Cl, С2 и СЗ, и эти флаги можно скопировать в регистр флагов. Для этого рекомендуется использовать инструкцию FSTSW АХ для сохранения слова состояния сопроцессора в регистре АХ и инструкцию SAHF для после-

дующего копирования содержимого регистра АН в младшие 8 битов регистра флагов [4]; при этом СО попадает во флаг С/% С2 — в УУ7, а СЗ — в Z/7. Флаг С2 устанавливается, например, в случае несравнимых аргументов (NaN или неподдерживаемый формат) в инструкции сравнения риСОМ.

Управляющий флаг. Флаг направления (А/7, бит 10 в регистре флагов) управляет строковыми инструкциями (ЖЖУ, СЖР5, 5С45, Р0А5 и 8Т08): установка флага заставляет уменьшать адреса (обрабатывать строки от старших адресов к младшим); обнуление заставляет адреса увеличивать. Инструкции ,5УА и СЮ соответственно устанавливают и обнуляют флаг АР1.

Системные флаги и поле ЮРЬ. Системные флаги и поле /АРУ управляют операционной средой и не предназначены для использования в прикладных программах.

/Р— обнуление этого флага запрещает отвечать на маскируемые запросы на прерывание.

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

ЮРЬ — показывает уровень приоритета ввода/вывода исполняемой программы или задачи: чтобы программа или задача могла выполнять инструкции ввода-вывода или менять флаг /Р, ее текущий уровень приоритета (СРР) должен быть < ЮРЬ.

ТУТ — этот флаг устанавливается, когда текущая задача «вложена» в другую, прерванную задачу и сегмент состояния РРР текущей задачи обеспечивает обратную связь с РРР предыдущей задачи. Флаг ТУР проверяется инструкцией ШЕТ для определения типа возврата — межзадачного или внутризадачного.

РР — флаг маскирования ошибок отладки.

УМ — установка этого флага в защищенном режиме вызывает переключение в режим виртуального 8086.

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

АС — установка этого флага вместе с битом АМ в регистре СУЮ включает контроль выравнивания операндов при обращениях к памяти — обращение к невыравненному операнду вызывает исключительную ситуацию.

VIF— виртуальная копия флага IF; используется совместно с флагом VIР.

VIP — устанавливается для указания наличия отложенного прерывания; используется совместно с флагом VIF.

ID — возможность программно изменить этот флаг в регистре флагов указывает на поддержку инструкции CPUID.

CPUID (идентификация процессора) сообщает информацию о производителе, типе и модификации процессора, о наличии и поддержке различных расширений. Команда CPUID поддерживается х86-совместимыми процессорами, начиная со старших моделей 80486.

  • 2. Регистры управления памятью — это регистры системных адресов. В защищенном режиме процессор берет информацию о сегментах памяти из дескрипторных таблиц — глобальной (GDT) и локальной (LDT), но если положение LDTописано в одном из дескрипторов GDT, то положение самой GDT необходимо указывать иначе. Помимо этого, в процессоре i80286 появилась возможность размещать таблицу векторов прерываний в произвольном месте оперативной памяти, а не обязательно в самом начале, как в процессоре 8086. Это привело к необходимости добавить четыре регистра, указывающих положения структур данных, ответственных за сегментацию в защищенном режиме:
    • GDFR: 48-битный (6-байтный) регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрипторов (GDI) и ее 16-битный размер (минус 1):
      • — чтение — команда SGDT.
      • — запись — команда LGD Т.
    • IDFR: 48-битный (6-байтный) регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрипторов обработчиков прерываний (IDF) и ее 16-битный размер (минус 1). Каждый раз, когда происходит прерывание или исключение, процессор передает управление на обработчик, описываемый дескриптором из IDTс соответствующим номером:
    • — чтение — команда SIDT;
    • — запись — команда LIDT.
    • LDTR: 80-битный (10-байтный) регистр, в видимой части которого содержится 16-битный селектор для GDT( 77селектора равен нулю), а в теневой — весь 8-байтный дескриптор из GDT, описывающий текущую таблицу локальных дескрипторов (LDT):
      • — чтение — команда SLDT
      • — хапись — команда LLD Т.
    • • 77?: 80-битный (10-байтный) регистр, в видимой части которого содержится 16-битный селектор для GDT ( 77 селектора равен нулю), а в теневой — весь 8-байтный дескриптор из GDT, описывающий сегмент состояния текущей задачи — TSS (Task State Segment). Служит для организации многозадачной работы процессора в защищенном режиме:
    • — чтение — команда STR;
    • — запись — команда 7,77?.
  • 3. Регистры управления процессором. Пять 32-битных регистров CR0—CR4 управляют функционированием процессора и работой отдельных его внутренних блоков.

Доступ к этим регистрам возможен с помощью обычной команды MOV.

4. Отладочные регистры. Восемь 32-битных регистров DRQ—DR1 предназначены для аппаратной отладки. Позволяют программам, выполняющимся на уровне привилегий 0, определять точки останова, не модифицируя код программ (например — для отладки программ, применяющих сложные схемы защиты от трассировки).

Доступ к этим регистрам возможен с помощью обычной команды MOV.

  • 5. Регистры сопроцессора х87. Сопроцессор (FPU) предназначен для выполнения операций над вещественными числами. С программной точки зрения сопроцессор содержит блок регистров данных, регистр управления и группу регистров состояния и указателей. Восемь регистров данных разрядностью 80 бит организованы в стек (табл. 4.5). Номер регистра, являющегося текущей вершиной стека, хранится в специальном поле регистра состояния (указателе вершины стека). Операция PUSH уменьшает значение указателя на единицу и помещает в стек данные в регистр, являющийся новой вершиной стека. Операция POP записывает данные с вершины стека в память или регистр и увеличивает указатель на единицу. Инструкции адресуют регистры либо явно, либо неявно. Неявная адресация подразумевает операнд, находящийся на вершине стека. Явная адресация подразумевает указание смещения регистра относительно вершины стека — st(i).
  • 6. Расширения архитектуры х86. Расширения архитектуры х86 — инженерные решения, разрабатываемые различными производителями микропроцессоров архитектуры х86 для собственных процессоров, которые зачастую присутствуют в одних моделях и отсут-

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

Физический

номер

80 бит

Относительный

номер

1 бит

15 бит

64 бит

Знак

Порядок

Мантисса

0

mmO

ST( 5)

1

mm 1

ST( 6)

2

mm2

ST( 7)

3

mm3

ST( 0)

4

mm4

5T(1)

5

mm5

ST( 2)

6

mm6

ST( 3)

7

mm7

ST( 4)

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

ствуют в других. Разработчики программного обеспечения, прежде чем использовать их в собственных программах, должны выполнить специальную команду CPUID, которая сообщает о наличии тех или иных расширений. Если расширение не поддерживается, программа должна либо завершить работу, либо использовать другие алгоритмы, не использующие расширений.

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

Наиболее известные из расширений — MMX, SSE, 3DNow, Hyper-threading. В основном новые расширения разрабатываются фирмой «Intel» и затем подхватываются другими производителями. Но иногда бывает так, что сама «Intel» включает в свои процессоры расширения, созданные иными фирмами. К примеру, так было с архитектурой х86-64, впервые разработанной компанией «AMD», а уже впоследствии реализованная «Intel» как Intel64/EM64T.

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

  • • 8 упакованных байт (Packed byte);
  • • 4 упакованных слова (Packed word);
  • • 2 упакованных двойных слова (Packed double word);
  • • 1 учетверенное слово (Quad word).

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

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

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

SSE (англ. Streaming SIMD Extensions, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, одна инструкция — множество данных), набор инструкций, разработанный «Intel» и впервые представленный в процессорах серии Pentium III как ответ на аналогичный набор инструкций 3D Now', от «AMD», который был представлен годом раньше. Первоначально названием этих инструкций было KNI — Katmai New Instructions (Katmai — название первой версии ядра процессора Pentium III).

Технология SSE позволяла преодолеть две основные проблемы ММХ: при использовании ММХ невозможно было одновременно использовать инструкции сопроцессора, так как его регистры были общими с регистрами ММХ, и возможность ММХ работать только с целыми числами.

В SSE добавлены восемь (шестнадцать для х64) 128-битных регистров, которые называются ХММ0—ХММ1 (-ХММ15). Каждый регистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности.

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

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

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

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

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

пара учетверенных слов.

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

Advanced Vector Extensions (.AVX) — расширение системы команд х86 для микропроцессоров «Intel» и «AMD». AVXпредоставляет различные улучшения, новые инструкции и новую схему кодирования машинных кодов.

Новая схема кодирования инструкций VEX использует VEX-префикс. В настоящий момент существуют два КЕА-префикса — длиной 2 и 3 байта. Для 2-байтного VEX-префикса первый байт равен 0хС5, для 3-байтного — 0хС4.

В 64-битном режиме первый байт FEA-префикса уникален. В 32-битном режиме возникает конфликт с инструкциями LES и LDS, который разрешается старшим битом второго байта, он имеет значение только в 64-битном режиме через неподдерживаемые формы инструкций LES и LDS.

Длина существующих АКТ-инструкций вместе с VEX-префиксом не превышает 11 байт. В следующих версиях ожидается появление более длинных инструкций.

Планируемые дополнения системы команд

Схема кодирования инструкций KEY легко допускает дальнейшее расширение набора инструкций AVX. В следующей версии, AVX2, добавлены инструкции для работы с целыми числами, FMA3 (увеличил производительность при обработке чисел с плавающей запятой в 2 раза [11]), загрузку распределенного в памяти вектора (gather) и прочее.

Различные планируемые дополнения системы команд х86:

  • A ES ;
  • CLMUL;
  • Intel/AMD FМАЪ;
  • AMD FM AA;
  • AMD XOP;
  • AMDCV El 6.

В серверных процессорах поколения Broadwell добавлены расширения AVX ЗА, а в серверных процессорах поколения Skylake — AVX 3.2.

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

Выпущенные фирмой «AMD» процессоры Athlon64 и Opteron имеют архитектуру х86-64, которая, в отличие от архитектуры х86, является полностью 64-битной. Она естественным образом расширяет регистры общего назначения х86 до 64 бит и увеличивает их количество. Также удваивается число регистров ХММ. Регистры FPU/ ММХостаются без изменений (табл. 4.6).

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

Регистры архитектуры х86-64 (АІУШ64)

  • 128 бит
  • 64 бита

ЯАХ

ЕЛХ

явх

ЕВХ

ясх

ЕСХ

ЯРХ

ЕРХ

ЯЯ1

ЕЯІ

ЯРІ

ЕРІ

ЯВР

ЕВР

ЯЯР

ЕЯР

Я8

Я9

Я10

Я11

Я2

ЯП

Я4

Я5

ХМ МО

хмм

ХММ2

хммъ

ХММ4

ХММ5

ХММ6

ХММ1

ХММ8

ХММ9

ХММ10

хммп

ХМ МП

хммп

ХММ14

ХММ15

 
< Пред   СОДЕРЖАНИЕ     След >