Архитектурные особенности
Операционная система MS-DOS, язык ассемблера МП 86 и методы программирования
микропроцессоров корпорации Intel разрабатывались применительно к 16-разрядному
процессору 8086 и тому режиму, который впоследствии получил название реального.
Появление процессора 80386 знаменовало собой начато нового этапа в развитии
операционных систем и прикладного программирования - этапа многозадачных графических
операционных систем защищенного режима типа Windows и 32-разрядных прикладных
программ. При этом, как уже отмечалось во введении, все архитектурные средства
86-го процессора входят в состав любого современного процессора, который, таким
образом, можно условно разделить на две части - МП 86 и дополнительные средства,
обеспечивающие защищенный режим, 32-разрядную адресацию и прочее. Из этих дополнительных
средств можно выделить те, которые обеспечивают защищенный режим, и в реальном
режиме не используются (во всяком случае, явным образом; в действительности,
процессор, даже работая в реальном режиме, использует по крайней мере некоторые
из этих средств). Сюда, например, относятся регистры таблиц дескрипторов, регистры
тестирования и отладки, привилегированные команды защищенного режима, система
страничного отображения адресов и др. С другой стороны, часть новых свойств
современных процессоров можно использовать и в реальном режиме, выполняя программы
под управлением MS-DOS. Сюда, прежде всего, относится использование 32-битовых
операндов, некоторых новых команд процессора и расширенных возможностей старых
команд. Настоящая глава будет в основном посвящена именно этим средствам процессоров
80386, i486 и Pentium, которые в дальнейшем мы будем обобщенно называть 32-разрядными
процессорами. Вопрос о программировании защищенного режима слишком сложен, чтобы
его можно было осветить в рамках этой книги, хотя основные принципы защищенного
режима будут описаны.
32-разрядные процессоры содержат несколько десятков программно-
адресуемых регистров
(не считая регистров сопроцессора), из которых шесть являются 16-разрядными,
а остальные - 32-разрядными. Регистры принято объединять в семь групп: регистры
общего назначения (или регистры данных), регистры-указатели, сегментные регистры,
управляющие регистры, регистры системных адресов, отладочные регистры и регистры
тестирования. Кроме того, в отдельную группу выделяют счетчик команд и регистр
флагов. Регистры, используемые в реальном режиме, показаны на рис. 4.1.
Рис. 4.1. Основные регистры 32-разрядных процессоров.
Как видно из рис. 4.1,
регистры общего назначения и регистры-указатели отличаются от аналогичных регистров
МП 86 тем, что они являются 32-разрядными. Соответственно, к их мнемоническим
обозначениям добавлена буква Е (от extended, расширенный).
Для сохранения совместимости с ранними моделями процессоров допускается обращение
к младшим половинам всех регистров, которые имеют те же мнемонические обозначения,
что и в МП 86 (АХ, ВХ,СХ, DX, SI, DI, ВР и SP). Естественно, сохранена возможность
работы с младшими (AL, BL, CL и DL) и старшими (АН, ВН, СН и
DH) половинками
регистров МП 86. Однако старшие половины 32-разрядных регистров не имеют мнемонических
обозначений и непосредственно недоступны. Для того, чтобы прочитать, например,
содержимое старшей половины регистра ЕАХ (биты 31...16) придется сдвинуть все
содержимое ЕАХ на 16 бит вправо (в регистр АХ) и прочитать затем содержимое
АХ. Все регистры общего назначения и указатели программист может использовать
по своему усмотрению для временного хранения адресов и данных размером от байта
до двойного слова. Так, например, возможно использование следующих команд:
mov ЕАХ,0FFFFFFFFh ;Работа с двойным словом (32 бит)
mov AX,0FFFFh ;Работа со словом (16 бит)
mov AL, 0FFh ;Работа с байтом (8 бит)
Все сегментные регистры,
как и в МП 86, являются 16-разрядными. В их состав включено еще два регистра
- FS и GS, которые могут использоваться для хранения сегментных адресов двух
дополнительных сегментов данных. Таким образом, при использовании расширенных
возможностей современных процессоров программе одновременно доступны четыре
сегмента данных, а не два, как в МП 86.
Регистр указателя команд также является 32-разрядным и обычно при описании процессора
его называют EIP. Младшие шестнадцать разрядов этого регистра соответствуют
регистру IP процессора МП 86. Весь регистр EIP используется только в 32-разрядных
приложениях; в 16-разрядных программах адреса могут быть только 16-разрядными
и, соответственно, для адресации в программном сегменте используется младшая
половина регистра EIP.
Регистр флагов принято называть EFLAGS (от extended
flags, расширенные флаги).
Хотя он имеет длину 32 бит, только младшие 18 бит (да и то не все) содержат
значащую информацию. Дополнительно к шести флагам состояния
(CF, PF, AF, ZF,
SF и OF) и трем флагам управления состоянием процессора
(TF, IF и DF), назначение
которых было описано в гл. 1, он включает новые флаги задачи, рестарта и виртуального
режима, а также двухбайтовое поле привилегий ввода-вывода. Все эти биты используются
только в защищенном режиме и здесь рассматриваться не будут.