# Регистры

Запись в часть 64-битного регистра, например в регистр AL, влияет только на биты этой части. В случае AL загрузка 8-битного значения изменяет младшие 8 битов RAX, оставляя остальные 48 бит без изменений.

Виды регистров

<table border="1" id="bkmrk-%D0%9D%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%A0%D0%B0%D0%B7%D1%80%D1%8F%D0%B4-%D0%A2%D0%B8%D0%BF-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 11.2028%;"></col><col style="width: 8.22507%;"></col><col style="width: 15.1371%;"></col><col style="width: 65.435%;"></col></colgroup><thead><tr><td>Название</td><td>Разряд</td><td>Тип</td><td>Назначение</td></tr></thead><tbody><tr><td>RAX

EAX

AX

AH, AL

</td><td>64

32

16

8

</td><td>Универсальный</td><td>(Accumulator): для арифметических операций</td></tr><tr><td>RBX

EBX

BX

BH, BL

</td><td>64

32

16

8

</td><td>Универсальный</td><td>(Base pointer): указатель на базу стека внутри функции</td></tr><tr><td>RCX

ECX

CX

CH, CL

</td><td>64

32

16

8

</td><td>Универсальный</td><td>(Counter): для хранения счетчика цикла</td></tr><tr><td>RDX

EDX

DX

DH, DL

</td><td>64

32

16

8

</td><td>Универсальный</td><td>(Data): для арифметических операций и операций ввода-вывода</td></tr><tr><td>R8-R15

R8D-R15D

R8W-R15W

R8B-R15B

</td><td>64

32

16

8

</td><td>Универсальный</td><td>8 универсальных регистров</td></tr><tr><td>RSP

ESP

SP

</td><td>64

32

16

</td><td>Указатели</td><td>(Stack pointer): указатель на верхушку стека</td></tr><tr><td>RBP

EBP

BP

</td><td>64

32

16

</td><td>Указатели</td><td>(Base pointer): указатель на базу стека внутри функции</td></tr><tr><td>RSI

ESI

SI

</td><td>64

32

16

</td><td>Индексы</td><td>(Source index): указатель на источник при операциях с массивом</td></tr><tr><td>RDI

EDI

DI

</td><td>64

32

16

</td><td>Индексы</td><td>(Destination index): указатель на место назначения в операциях с массивами</td></tr><tr><td>RFLAGS

</td><td></td><td>Флаги</td><td>Биты состояния процессора после предыдущей операции</td></tr><tr><td>RIP

EIP

</td><td>64

32

</td><td>Специальный</td><td>Счетчик команд</td></tr><tr><td>ST0 - ST7

</td><td>80

</td><td>Специальные</td><td>Регистры для работы с числами с плавающей точкой</td></tr><tr><td>YMM0-YMM15

XMM0 - XMM15

</td><td>256

128

</td><td>  
</td><td>Каждый регистр можно настроить как четыре 32-битных регистра с плавающей точкой; два 64-битных регистра двойной точности с плавающей точкой; или шестнадцать 8-битных, восемь 16-битных, четыре 32-битных, два 64-битных или один 128-битный целочисленный регистр.

</td></tr></tbody></table>

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

<table class="tab" id="bkmrk-%D0%91%D0%B8%D1%82-%D0%98%D0%BC%D1%8F-%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-0" style="width: 100%;"><tbody><tr class="tabhead"><td style="width: 5.7211%;">Бит

</td><td style="width: 6.43127%;">Имя

</td><td style="width: 87.8476%;">назначение

</td></tr><tr><td style="width: 5.7211%;">0

</td><td style="width: 6.43127%;">CF

</td><td style="width: 87.8476%;">Флаг переноса (Carry flag):казывает, был ли при сложении перенос или заимствование при вычитании. Используется в качестве входных данных для инструкций сложения и вычитания.

</td></tr><tr><td style="width: 5.7211%;">2

</td><td style="width: 6.43127%;">PF

</td><td style="width: 87.8476%;">Флаг четности: устанавливается, если младшие 8 битов результата содержат четное число единиц.

</td></tr><tr><td style="width: 5.7211%;">4

</td><td style="width: 6.43127%;">AF

</td><td style="width: 87.8476%;">Флаг настройки: указывает, был ли при сложении перенос или заимствование при вычитании младших 4 битов.

</td></tr><tr><td style="width: 5.7211%;">6

</td><td style="width: 6.43127%;">ZF

</td><td style="width: 87.8476%;">Флаг нуля (Zero flag): устанавливается, если результат операции равен нулю

</td></tr><tr><td style="width: 5.7211%;">7

</td><td style="width: 6.43127%;">SF

</td><td style="width: 87.8476%;">Флаг знака (Sign flag): устанавливается, если результат операции отрицательный.

</td></tr><tr><td style="width: 5.7211%;">8

</td><td style="width: 6.43127%;">TF

</td><td style="width: 87.8476%;">Флаг прерывания выполнения (Trap flag): используется при одношаговой отладке.

</td></tr><tr><td style="width: 5.7211%;">9

</td><td style="width: 6.43127%;">IF

</td><td style="width: 87.8476%;">Флаг разрешения прерывания: установка этого бита разрешает аппаратные прерывания.

</td></tr><tr><td style="width: 5.7211%;">10

</td><td style="width: 6.43127%;">DF

</td><td style="width: 87.8476%;">Флаг направления: контролирует направление обработки. Если не установлен, то порядок от самого младшего до самого старшего адреса. Если установлен, то порядок обратный - от самого старшего до самого младшего адреса.

</td></tr><tr><td style="width: 5.7211%;">11

</td><td style="width: 6.43127%;">OF

</td><td style="width: 87.8476%;">Флаг переполнения (Overflow flag): если устанавлен, то операция привела к переполнению со знаком.

</td></tr><tr><td style="width: 5.7211%;">12-13

</td><td style="width: 6.43127%;">IOPL

</td><td style="width: 87.8476%;">Уровень привилегий ввода-вывода (I/O privilege level): уровень привилегий текущего выполняемого потока. IOPL 0 — это режим ядра, а 3 — пользовательский режим.

</td></tr><tr><td style="width: 5.7211%;">14

</td><td style="width: 6.43127%;">NT

</td><td style="width: 87.8476%;">Флаг вложенной задачи (Nested task flag): управляет цепочкой прерываний.

</td></tr><tr><td style="width: 5.7211%;">16

</td><td style="width: 6.43127%;">RF

</td><td style="width: 87.8476%;">Флаг возобновления (Resume flag): используется для обработки исключений во время отладки.

</td></tr><tr><td style="width: 5.7211%;">17

</td><td style="width: 6.43127%;">VM

</td><td style="width: 87.8476%;">Флаг режима виртуальной машины 8086: если установлен, режим совместимости с 8086 активен. Этот режим позволяет запускать некоторые приложения MS-DOS в контексте операционной системы в защищенном режиме.

</td></tr><tr><td style="width: 5.7211%;">18

</td><td style="width: 6.43127%;">AC

</td><td style="width: 87.8476%;">Флаг проверки выравнивания (Alignment check flag): если установлен, проверка выравнивания памяти активна. Например, если установлен флаг AC, сохранение 16-битного значения по нечетному адресу вызывает исключение проверки выравнивания. Процессоры x86 могут выполнять невыровненный доступ к памяти, когда этот флаг не установлен, но количество требуемых командных циклов может увеличиться.

</td></tr><tr><td style="width: 5.7211%;">19

</td><td style="width: 6.43127%;">VIF

</td><td style="width: 87.8476%;">Флаг виртуального прерывания (Virtual interrupt flag): виртуальная версия флага IF в виртуальном режиме 8086..

</td></tr><tr><td style="width: 5.7211%;">20

</td><td style="width: 6.43127%;">VIP

</td><td style="width: 87.8476%;">Флаг ожидания виртуального прерывания: Устанавливается, когда прерывание находится в состоянии ожидания в виртуальном режиме 8086.

</td></tr><tr><td style="width: 5.7211%;">21

</td><td style="width: 6.43127%;">ID

</td><td style="width: 87.8476%;">Флаг ID: если этот бит установлен, то поддерживается инструкция cpuid. Эта инструкция возвращает идентификатор процессора и информацию о его функциях.

</td></tr></tbody></table>