Это старая версия документа!
Регистры
Описание и механика работы
Регистр процессора — поле заданной длины во внутрипроцессорной сверхбыстрой оперативной памяти (СОЗУ). Используется самим процессором, может быть как доступным, так и не доступным программно. Например, при выборке из памяти очередной команды она помещается в регистр команд, обращение к которому программист прописать не может.
Программно недоступные регистры: Программно недоступные регистры — любые процессорные регистры, к которым невозможно так или иначе обратиться из выполняемой программы. Пример таких регистров — это регистр команд.
Регистр команд (англ. instruction register — IR) — часть блока управления центрального процессора, содержащая инструкцию, которая выполняется в настоящий момент, или декодированную. Регистр команд — это регистр управляющего устройства компьютера. Он предназначен для хранения кода команды на период времени, который необходим для ее выполнения. Только разряд командного регистра используется для хранения кода операции: в остальных разрядах хранятся коды адресов операндов.
Программно доступные регистры есть те, к которым возможно так или иначе обратиться из выполняемой программы. Практически каждый такой регистр обозначается своим именем-идентификатором на уровне языка ассемблера и соответствующим числовым кодом-идентификатором на уровне машинного языка.
По уровню доступности программно доступные регистры неодинаковы и практически делятся на две большие подгруппы:
Системные регистры — любые регистры, программно доступные только системным программам (например, ядру операционной системы), имеющим достаточный для этого уровень системных привилегий/прав. В терминах многих машинных систем такой уровень привилегий часто называется «уровнем/режимом ядра» или «режимом супервизора».
Регистры общего назначения (РОН) — регистры, доступные любым программам. В частности, регистры, используемые без ограничения в арифметических и логических операциях, но имеющие определённые аппаратные ограничения (например, в строковых РОН). Эти регистры не характерны для эпохи мейнфреймов типа IBM/370 и стали популярными в микропроцессорах архитектуры X86 — Intel 8085, Intel 8086 и последующих.
Основные регистры и их роль
Одним из ключевых элементов архитектуры процессора являются регистры. Эти быстрые ячейки памяти, расположенные непосредственно в процессоре, играют критическую роль в выполнении программ. В этой статье мы рассмотрим:
Общие регистры.
Такие как EAX, EBX, ECX, EDX, ESP, EBP, ESI и EDI которые используются для хранения данных и выполнения операций.
Сегментные регистры.
Регистры CS, DS, SS, ES, FS, GS – управляют доступом к различным сегментам памяти.
Регистры управления и состояния.
Регистры EIP и EFLAGS, которые отслеживают и управляют потоком выполнения и состоянием процессора.
Переход на 64-битную архитектуру
С появлением архитектуры x86-64 регистры получили свои 64-битные аналоги: RAX, RBX, RCX, RDX, RSP, RBP, RSI и RDI. Расширение до 64 бит позволило увеличить объем данных, с которыми можно работать, и улучшить производительность в современных вычислительных задачах. Кроме того, в x86-64 добавлены новые регистры, такие как R8-R15, что предоставляет дополнительные возможности для оптимизации и параллельной обработки данных.
Понимание и эффективное использование этих регистров — это один из важных навыков в реверс-инжиниринге.
Разрядность регистров
Шестнадцать 64-разрядных регистров RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8, R9, R10, R11, R12, R13, R14 и R15
Шестнадцать 32-разрядных регистров EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, R8D, R9D, R10D, R11D, R12D, R13D, R14D и R15D
Шестнадцать 16-разрядных регистров AX, BX, CX, DX, SI, DI, BP, SP, R8W, R9W, R10W, R11W, R12W, R13W, R14W и R15W
Шестнадцать 8-разрядных регистров AL, AH, BL, BH, CL, CH, DL, DH, DIL, SIL, BPL, SPL, R8B, R9B, R10B, R11B, R12B, R13B, R14B и R15B
Регистры общего назначения
| Имя регистра | Описание:Обозначение | Назначение |
|---|---|---|
| EAX | Аккумулятор (Accumulator) | Арифметические и логические операций. |
| EBX | База (Base) | Применяется как указатель на данные. Используется для хранения данных и может использоваться как базовый регистр при адресации памяти. |
| ECX | Счётчик (Counter) | Хранение счетчика цикла. Используется в операциях цикла и как счетчик в командах REP и LOOP. |
| EDX | Регистр данных (Data) | Арифметические операции и операций ввода-вывода |
EAX
EAX (extended accumulator register). Часто используется для операций ввода-вывода, арифметических вычислений и хранения возвращаемых значений функций.
EBX
EBX (base register). Применяется как указатель на данные в сегменте данных и для хранения адресов.
ECX
ECX (count register). Традиционно используется в циклах как счетчик итераций.
EDX
Указательные и индексные регистры
| Имя регистра | Описание:Обозначение | Назначение |
|---|---|---|
| ESP | Указатель стека (Stack pointer) | Указатель на верхушку стека. Указывает на последний аргумент стека. |
| EBP | Указатель базы (Base pointer) | Указатель на базу стека внутри функции. Ссылка на аргумент локальной переменной. |
| ESI | Индекс источника (Source index) | Указатель на источник при операциях с массивом. Исполняет в инструкции по перемодуляции памяти. |
| EDI | Индекс приёмника (Destination index) | Указатель на место назначения в операциях с массивами. Исполняет в инструкции по перемодуляции памяти. |
| FLAGS,EFLAGS,RFLAGS | Регистр флагов (Flag) | Содержит биты состояния процессора |
| EIP | Указатель команд. | Указатель адреса следующей инструкции для выполнения. Не регистр а указатель на текущую функцию. |
| СS | Хранение базовых адресов (Code Segment) | Хранение базовых адресов сегмента кода в ОЗУ, откуда процессор считывает команды для выполнения. Если проводить аналогию между кодом и книгой, то CS указывает на номер страницы в книге (программе) |
| DS | (Data Segment Register) | |
| ES | (Extra Segment Register) | |
| FS | (Additional Segment Registers) | |
| GS | (Additional Segment Registers) | |
| SS | (Stack Segment Register) | |
| RAX | (Accumulator Register) | Арифметические, логические операций и операций ввода-вывода. |
| RBX | (Base Register) | Хранение данных и иногда используется как базовый регистр при адресации памяти. |
| AX | ||
| AH | ||
| AL | ||
| B, BH, BL | ||
| SP, BP, SI, DI | ||
| SPL, SDL, SIL, DIL | ||
| RxD, RxW, RxB | ||
| A | ||
| B,C,D,E,H,L | ||
| DC | ||
| SP | ||
| LDA | ||
Регистр флагов RFLAGS
| Бит | Имя | Назначение |
| 0 | CF | Флаг переноса (Carry flag):казывает, был ли при сложении перенос или заимствование при вычитании. Используется в качестве входных данных для инструкций сложения и вычитания. |
| 2 | PF | Флаг четности: устанавливается, если младшие 8 битов результата содержат четное число единиц. |
| 4 | AF | Флаг настройки: указывает, был ли при сложении перенос или заимствование при вычитании младших 4 битов. |
| 6 | ZF | Флаг нуля (Zero flag): устанавливается, если результат операции равен нулю |
| 7 | SF | Флаг знака (Sign flag): устанавливается, если результат операции отрицательный. |
| 8 | TF | Флаг прерывания выполнения (Trap flag): используется при одношаговой отладке. |
| 9 | IF | Флаг разрешения прерывания: установка этого бита разрешает аппаратные прерывания. |
| 10 | DF | Флаг направления: контролирует направление обработки. Если не установлен, то порядок от самого младшего до самого старшего адреса. Если установлен, то порядок обратный - от самого старшего до самого младшего адреса. |
| 11 | OF | Флаг переполнения (Overflow flag): если устанавлен, то операция привела к переполнению со знаком. |
| 12-13 | IOPL | Уровень привилегий ввода-вывода (I/O privilege level): уровень привилегий текущего выполняемого потока. IOPL 0 — это режим ядра, а 3 — пользовательский режим. |
| 14 | NT | Флаг вложенной задачи (Nested task flag): управляет цепочкой прерываний. |
| 16 | RF | Флаг возобновления (Resume flag): используется для обработки исключений во время отладки. |
| 17 | VM | Флаг режима виртуальной машины 8086: если установлен, режим совместимости с 8086 активен. Этот режим позволяет запускать некоторые приложения MS-DOS в контексте операционной системы в защищенном режиме. |
| 18 | AC | Флаг проверки выравнивания (Alignment check flag): если установлен, проверка выравнивания памяти активна. Например, если установлен флаг AC, сохранение 16-битного значения по нечетному адресу вызывает исключение проверки выравнивания. Процессоры x86 могут выполнять невыровненный доступ к памяти, когда этот флаг не установлен, но количество требуемых командных циклов может увеличиться. |
| 19 | VIF | Флаг виртуального прерывания (Virtual interrupt flag): виртуальная версия флага IF в виртуальном режиме 8086. |
| 20 | VIP | Флаг ожидания виртуального прерывания: Устанавливается, когда прерывание находится в состоянии ожидания в виртуальном режиме 8086. |
| 21 | ID | Флаг ID: если этот бит установлен, то поддерживается инструкция cpuid. Эта инструкция возвращает идентификатор процессора и информацию о его функциях. |