logo
!Архитектура ЭВМ и вычислительных систем

Процессор. Структура и основные регистры. Назначение и особенности работы. Регистр флагов.

Схема управления выборкой команд выполняет чтение команд из памяти и их дешифрацию. В первых микропроцессорах было невозможно одновременное выполнение предыдущей команды и выборка следующей команды, так как процессор не мог совмещать эти операции. Но уже в 16-разрядных процессорах появляется так называемый конвейер (очередь) команд, позволяющий выбирать несколько следующих команд, пока выполняется предыдущая. Два процесса идут параллельно, что ускоряет работу процессора. Конвейер представляет собой небольшую внутреннюю память процессора, в которую при малейшей возможности (при освобождении внешней шины) записывается несколько команд, следующих за исполняемой. Читаются эти команды процессором в том же порядке, что и записываются в конвейер (это память типа FIFO, First In — First Out, первый вошел — первый вышел). Правда, если выполняемая команда предполагает переход не на следующую ячейку памяти, а на удаленную (с меньшим или большим адресом), конвейер не помогает, и его приходится сбрасывать. Но такие команды встречаются в программах сравнительно редко.

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

Арифметико-логическое устройство (или АЛУ, ALU) предназначено для обработки информации в соответствии с полученной процессором командой. Примерами обработки могут служить логические операции (типа логического «И», «ИЛИ», «Исключающего ИЛИ» и т.д.) то есть побитные операции над операндами, а также арифметические операции (типа сложения, вычитания, умножения, деления и т.д.). Над какими кодами производится операция, куда помещается ее результат — определяется выполняемой командой. Если команда сводится всего лишь к пересылке данных без их обработки, то АЛУ не участвует в ее выполнении.

Быстродействие АЛУ во многом определяет производительность процессора. Причем важна не только частота тактового сигнала, которым тактируется АЛУ, но и количество тактов, необходимое для выполнения той или иной команды. Для повышения производительности разработчики стремятся довести время выполнения команды до одного такта, а также обеспечить работу АЛУ на возможно более высокой частоте. Один из путей решения этой задачи состоит в уменьшении количества выполняемых АЛУ команд, создание процессоров с уменьшенным набором команд (так называемые RISC-процессоры). Другой путь повышения производительности процессора — использование нескольких параллельно работающих АЛУ.

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

Регистры процессора представляют собой по сути ячейки очень быстрой памяти и служат для временного хранения различных кодов: данных, адресов, служебных кодов. Операции с этими кодами выполняются предельно быстро, поэтому, в общем случае, чем больше внутренних регистров, тем лучше. Кроме того, на быстродействие процессора сильно влияет разрядность регистров. Именно разрядность регистров и АЛУ называется внутренней разрядностью процессора, которая может не совпадать с внешней разрядностью.

По отношению к назначению внутренних регистров существует два основных подхода. Первого придерживается, например, компания Intel, которая каждому регистру отводит строго определенную функцию. С одной стороны, это упрощает организацию процессора и уменьшает время выполнения команды, но с другой — снижает гибкость, а иногда и замедляет работу программы. Например, некоторые арифметические операции и обмен с устройствами ввода/вывода проводятся только через один регистр — аккумулятор, в результате чего при выполнении некоторых процедур может потребоваться несколько дополнительных пересылок между регистрами. Второй подход состоит в том, чтобы все (или почти все) регистры сделать равноправными, как , например, в 16-разрядных процессорах Т-11 фирмы DEC. При этом достигается высокая гибкость, но необходимо усложнение структуры процессора. Существуют и промежуточные решения, в частности, в процессоре MC68000 фирмы Motorola половина регистров использовалась для данных, и они были взаимозаменяемы, а другая половина — для адресов, и они также взаимозаменяемы.

В первую группу входят регистры общего назначения. В процессорах 386 и выше имеются восемь 32-битовых регистров общего назначения EAX, EBX, ECX, EDX, ESI, EDI, EBP, и ESP. Процессоры 386 и выше могут обращаться к 16-битовым половинам 32-битовых регистров. При необходимости возможна работа с половинами регистров, поскольку они разделены на старшую и младшую половину, называемые AH и AL, BH и BL и т.д. Такое разделение регистров имеется во всех процессорах. Значительная часть внутренних операций компьютеров производится с использованием регистров общего назначения.

Следующая группа из шести регистров помогает процессору обращаться к памяти. Они называются сегментными регистрами и каждый из них помогает обращаться к области (или сегменту) памяти. В прежних процессорах размер сегментов составлял 64 Кбайт, а в новых процессорах длина сегмента переменная и варьируется от одного байта до 4 Гбайт.

Регистр CS сегмента кода (программы) показывает, в каком месте памяти находится программа. Регистр DS сегмента данных локализует используемые программой данные. Регистр ES дополнительного сегмента дополняет сегмент данных. Регистр SS сегмента стека определяет стек компьютера. В процессорах 386 и выше имеются еще два сегментных регистра: FS и GS, предназначенных для адресации памяти.

Если сегментные регистры обеспечивают доступ к большим блокам памяти, то последняя группа используется совместно с сегментным регистром для локализации в памяти конкретных байтов. Регистр указателя команды IP определяет ту точку, где выполняется программа. Регистры указателя стека SP и указателя базы BP помогают следить за информацией в стеке (стек — это область памяти, где хранится информация о текущих действиях компьютера). Регистры индекса источника SI и индекса получателя DI помогают программам пересылать большие блоки данных из одного места в другое.

Регистр признаков (регистр состояния) занимает особое место, хотя он также является внутренним регистром процессора. Содержащаяся в нем информация — это не данные, не адрес, а слово состояния процессора (ССП, PSW — Processor Status Word).

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

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

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

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

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

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

· определяют адрес в памяти, где находится выполняемая в данный момент команда (функция счетчика команд или указателя команд);

· определяют текущий адрес стека (функция указателя стека).

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

Содержимое указателя (счетчика) команд изменяется следующим образом. В начале работы системы (при включении питания) в него заносится раз и навсегда установленное значение. Это первый адрес программы начального запуска. Затем после выборки из памяти каждой следующей команды значение указателя команд автоматически увеличивается (инкрементируется) на единицу (или на два в зависимости от формата команд и типа процессора). То есть следующая команда будет выбираться из следующего по порядку адреса памяти. При выполнении команд перехода, нарушающих последовательный перебор адресов памяти, в указатель команд принудительно записывается новое значение — новый адрес в памяти, начиная с которого адреса команд опять же будут перебираться последовательно. Такая же смена содержимого указателя команд производится при вызове подпрограммы и возврате из нее или при начале обработки прерывания и после его окончания.

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

С выходом микропроцессора 80386 регистр был расширен до 32 бит и стал называться EFLAGS. В нём появились ещё два дополнительных бита: VM и RF. В последующих поколениях 32-разрядных микропроцессоров были добавлены биты AC, VIF, VIP и ID. Тем не менее, сохранялась полная совместимость «снизу вверх»: любая старая программа, которая корректно работала с регистром EFLAGS, не модифицируя «неизвестные» ей биты, оставалась работоспособной и на последующих процессорах.

Расширение разрядности процессора до 64 бит, первоначально произведённое компанией AMD (технология AMD64) и позже скопированное Intel (EM64T), удвоило и размер регистра флагов, получившего название RFLAGS. Однако его старшая половина (биты с 32-го по 63-й включительно) пока не используется и является зарезервированной, поэтому формат «значащей» части RFLAGS полностью совпадает с форматом EFLAGS.

Назначение разрядов

Формат регистра EFLAGS выглядит следующим образом:

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

Далее описывается назначение каждого бита, входящего в состав регистра флагов.

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

Флаги этой группы могут изменяться любыми программами с помощью команд, заносящих в регистр флагов новое значение (SAHF, POPF/POPFD/POPFQ). CF Флаг переноса (бит 0). На самом деле он имеет разное назначение в зависимости от выполняемой инструкции. В арифметических операциях над целыми числами этот флаг, будучи установленным, показывает наличие переноса или заёма (это можно рассматривать как «беззнаковое переполнение»), а будучи сброшеннм — отсутствие переноса или заёма. Кроме того, этот флаг применяется в некоторых других инструкциях и тем или иным образом характеризует полученный результат. Подробно использование этого флага в каждой конкретной инструкции указывается в её описании

PF Флаг чётности (бит 2). Устанавливается, если младший байт результата содержит чётное число единичных битов, в противном случае сбрасывается

AF Флаг вспомогательного переноса (бит 4). Устанавливается при возникновении переноса или заёма в 3-м разряде в операциях двоично-десятичной арифметики, сбрасывается при отсутствии такового. Используется командами десятичной коррекции

ZF Флаг нуля (бит 6). Устанавливается при получении нулевого результата, сбрасывается в противном случае.

SF Флаг знака (бит 7). Устанавливается, если в результате операции получено отрицательное число, т.е. если старший разряд результата равен единице. В противном случае сбрасывается

OF Флаг переполнения (бит 11). Устанавливается, если в результате арифметической операции зафиксировано знаковое переполнение, то есть если результат, рассматриваемый как число со знаком, не помещается в операнд-приёмник. Если знакового переполнения нет, этот флаг сбрасывается

Флаг направления Этот флаг может изменяться любыми программами с помощью специальных инструкций CLD и STD, а также загрузкой нового содержимого регистра флагов. DF Флаг направления (бит 10). Когда этот флаг сброшен, строковые операции (MOVS, CMPS, SCAS, LODS и STOS) обрабатывают данные в порядке возрастания адресов (увеличивая содержимое регистров SI/ESI/RSI и DI/EDI/RDI после каждой итерации), а когда установлен — в порядке убывания адресов (уменьшая содержимое указанных регистров после каждой итерации)

Системные флаги Эти флаги могут изменяться только системным программным обеспечением, работающим при нулевом (наивысшем) текущем уровне привилегий (CPL). Исключением является флаг IF, состояние которого в определённых условиях может меняться менее привилегированным кодом. Загрузка регистров флагов программами, выполняющимися не на нулевом уровне привилегий, не изменяет значения системных флагов. TF Флаг ловушки (бит 8). Когда установлен, вызывает прерывание #DB (вектор 1) после выполнения каждой команды процессора за исключением той, которая осуществила установку этого флага

IF Флаг разрешения прерывания (бит 9). Когда установлен, процессор обрабатывает маскируемые прерывания, запросы на которые поступают от контроллера прерываний или улучшенного контроллера прерываний. Когда сброшен, маскируемые прерывания процессором игнорируются (находятся в ожидании обработки). Возможностью установки и сброса флага IF программами, выполняющимися не на нулевом уровне привилегий, управляют поле IOPL регистра флагов и бит VE управляющего регистра CR3

IOPL Поле уровня привилегий ввода/вывода (биты 12 и 13). Содержит уровень привилегий ввода-вывода для выполняемой в настоящий момент программы. Если текущий уровень привилегий (CPL) программы численно меньше либо равен значению, находящемуся в поле IOPL, программа может использовать инструкции ввода-вывода, а также менять состояние флага IF. Поле IOPL дополняется картой разрешения ввода-вывода в TSS, а также битом VME в управляющем регистре CR4

NT Вложенная задача (бит 14). Этот флаг устанавливается процессором автоматически при переключении на новую задачу. Переключение на задачу происходит при использовании её в качестве обработчика прерывания через шлюз задачи в IDT или при её вызове командой CALL, обращённой к TSS или шлюзу задачи, находящимся в GDT или LDT

RF Флаг возобновления (бит 16). Управляет реакцией процессора на точки останова. Когда установлен, запрещает генерацию отладочных прерываний (#DB). Основной функцией флага RF является обеспечение повторного выполнения инструкции после возникновения отладочного прерывания, вызванного точкой останова. Для этого отладчик перед возвратом к прерванной программе должен установить этот бит в регистре флагов прерванной программы, сохранённом в стеке, что обеспечит нормальное выполнение инструкции, к которой произойдёт возврат из отладчика. После её выполнения процессор автоматически сбросит флаг RF, что обеспечит нормальное функционирование установленных точек останова

VM Режим виртуального процессора 8086 (бит 17). Когда этот флаг установлен, процессор работает в режиме виртуального процессора 8086

AC Проверка выравнивания (бит 18). Когда одновременно установлены этот флаг и бит AC управляющего регистра CR0, а программа выполняется на третьем уровне привилегий, активизируется проверка выравнивания операндов, расположенных в памяти. При попытке доступа к невыровненному операнду возникает исключение #AC (вектор 17)

VIF Виртуальный флаг разрешения прерывания (бит 19). Этот флаг используется совместно с флагом VIP, если в управляющем регистре CR4 установлен бит VME, разрешающий использование расширений режима виртуального процессора 8086

VIP Ожидающее виртуальное прерывание (бит 20). Этот флаг используется совместно с флагом VIF, если в управляющем регистре CR4 установлен бит VME, разрешающий использование расширений режима виртуального процессора 8086

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