Лекция
доцента кафедры ИВТ Гродненского госуниверситета
канд. техн. наук Ливак Елены Николаевны
Описание набора регистров микропроцессора
Программная модель микропроцессора содержит 32 регистра, которые можно разделить на две группы:
- 16 пользовательских регистров;
- 16 системных регистров.
Заметим, что в данном курсе мы изучаем и применяем только пользовательские регистры.
Системные регистры будут использоваться при изучении дисциплин «Системное программное обеспечение» и «Методы защиты компьютерной информации».
Пользовательскими регистры называются потому, что программист может их использовать при разработке программ.
К пользовательским регистрам относятся:
1) восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (регистры общего назначения)
eax/ax/ah/al
ebx/bx/bh/bl
edx/dx/dh/dl
ecx/cx/ch/cl
esi/si
edi/di
ebp/bp
esp/sp
2) шесть регистров сегментов: cs, ds, ss, es, fs, gs
3) регистр состояния (регистр флагов) eflags/flags;
4) регистр управления (регистр указателя команды) eip/ip.
Обратим внимание, наклонной разделительной чертой обозначены части одного большого 32-разрядного регистра. Они могут использоваться в программе как отдельные объекты.
Благодаря этому поддерживается работоспособность программ, написанных для младших 16-разрядных моделей микропроцессоров фирмы Intel, начиная с i8086. Регистры микропроцессоров i486 и Pentium в основном 32-разрядные. Размерность у них больше, что и отражено в их обозначениях — они имеют приставку e (Extended).
Регистры общего назначения физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), поэтому их еще называют регистрами АЛУ.
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), младшую 16-битную часть (например, ax) и 8-битные части этих регистров (например, ah, al).
!!! Старшие 16 бит этих регистров как самостоятельные объекты недоступны.
Регистры esi/si и edi/di используются для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов (можно сравнить со строками в языке Pascal).
esi/si (Source Index register) — индекс источника.
Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике (первоначальная строка).
edi/di (Destination Index register) — индекс приемника (получателя).
Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике (результирующая строка).
Регистры ebp/bp и esp/sp предназначены для работы со стеком.
esp/sp (Stack Pointer register) — регистр указателя стека.
Содержит указатель вершины стека в текущем сегменте стека.
ebp/bp (Base Pointer register) — регистр указателя базы кадра стека.
Регистр предназначен для организации произвольного доступа к данным внутри стека.
В программной модели микропроцессора имеется шесть сегментных регистров:
cs, ss, ds, es, gs, fs.
Все сегментные регистры ¾ 16-разрядные.
Их существование обусловлено спецификой организации и использования оперативной памяти: микропроцессоры Intel в любом режиме работы (реальный режим, защищенный режим) поддерживают сегментную модель организации оперативной памяти.
Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде частей (фрагментов), которые называются сегментами. Соответственно, такая организация памяти называется сегментной.
Сегментные регистры предназначены для того, чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени.
Фактически в этих регистрах содержатся адреса ячеек памяти, с которых начинаются соответствующие сегменты.
Микропроцессор поддерживает следующие типы сегментов.
1. Сегмент кода (содержит команды программы).
Для доступа к этому сегменту служит регистр
cs (code segment register) — сегментный регистр кода.
Он содержит адрес сегмента кода, к которому в данный момент имеет доступ микропроцессор.
2. Сегмент данных (содержит обрабатываемые программой данные).
Для доступа к этому сегменту служит регистр
ds (data segment register) — сегментный регистр данных.
Он содержит адрес сегмента данных текущей программы.
3. Сегмент стека (область памяти, называемая стеком).
Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым (LIFO).
Для доступа к этому сегменту служит регистр
ss (stack segment register) — сегментный регистр стека.
Он содержит адрес сегмента стека.
4. Дополнительные сегменты данных.
Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных.
Адреса дополнительных сегментов данных должны содержаться в регистрах
es, gs, fs (extension data segment registers).
es ¾ дополнительный сегментный регистр данных или экстракодов (Extra Segment).
Начиная с микропроцессора 80386, появились два дополнительных регистра fs,gs (следующие буквы в латинском алфавите после e).
При использовании дополнительных сегментов данных их адреса требуется указывать с помощью специальных префиксов переопределения сегментов в команде (например, fs:).
eflags/flags (flag register) — регистр флагов.
Разрядность eflags/flags — 32/16 бит.
Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами.
Младшая часть этого регистра полностью аналогична регистру flags для i8086.
Флаги регистра eflags/flags подразделяются на три группы.
1) Флаги состояния
Эти флаги отражают особенности результата исполнения арифметических или логических операций и могут изменяться после выполнения машинных команд.
Это позволяет анализировать состояние вычислительного процесса и реагировать на него (например, с помощью команд условных переходов и вызовов подпрограмм).
cf - флаг переноса (Carry Flag)
pf - флаг паритета (Parity Flag)
af - вспомогательный флаг переноса (Auxiliary carry Flag)
zf - флаг нуля (Zero Flag) (1 — результат нулевой; 0 — результат ненулевой)
sf - флаг знака (Sign Flag)
(1 - старший бит результата = 1; 0 - старший бит результата = 0)
of - Флаг переполнения (Overflow Flag)
Используется для фиксирования факта потери значащего бита при арифметических операциях.
iopl - уровень привилегий ввода-вывода (Input/Output Privilege Level)
Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи.
nt - флажок вложенности задачи (Nested Task)
Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую
2) Флаг направления df (Directory Flag).
Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление обработки в цепочечных операциях: от начала строки к концу (df = 0) или от конца строки к ее началу (df = 1).
3) Системные флаги
Управляют вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.
tf - флаг трассировки (Trace Flag)
Предназначен для организации пошаговой работы микропроцессора.
if - Флаг прерывания (Interrupt enable Flag)
Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний.
(1 — аппаратные прерывания разрешены; 0 — аппаратные прерывания запрещены)
rf - флаг возобновления (Resume Flag)
Используется при обработке прерываний от регистров отладки.
Vm - флаг виртуального 8086 (Virtual 8086 Mode)
Признак работы микропроцессора в режиме виртуального 8086.
(1 - процессор работает в режиме виртуального 8086; 0 - процессор работает в реальном или защищенном режиме)
ac - флаг контроля выравнивания (Alignment Check)
Предназначен для разрешения контроля выравнивания при обращениях к памяти.
eip/ip (Instraction Pointer register) — регистр-указатель команд.
Содержит смещение следующей подлежащей выполнению команды (относительно текущего сегмента кода).
Регистр eip/ip имеет разрядность 32/16 бит.
!!! Этот регистр непосредственно недоступен программисту.
Загрузка и изменение его значения производятся различными командами условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.