Введение
Микропроцессоры корпорации
Intel и персональные компьютеры на их базе прошли не очень длинный во времени,
но значительный по существу путь развития, на протяжении которого кардинально
изменялись и возможности и даже сами принципы их архитектуры. В то же время,
внос в микропроцессор принципиальные изменения, разработчики были вынуждены
постоянно иметь в виду необходимость обеспечения совмести мости новых моделей
со старыми, чтобы не отпугивать потенциального покупателя перспективой полной
замены освоенного или разработанного им программного обеспечения. В результате
современные микропроцессоры типа Pentium, обеспечивая такие возможности, как
32-битную адресацию почти неограниченных объемов памяти, многозадачный режим
с одновременным выполнением нескольких программ, аппаратных средства защиты
операционной системы и прикладных программ друг друга, богатый набор дополнительных
эффективных команд и способе адресации, в то же время могут работать (и часто
работают) в режиме первых микропроцессоров типа 8086, используя всего лишь 1
мегабайт оперативной памяти, 16-разрядные операнды (т. е. числа в диапазоне
до 216 - 1 = 65535) и ограниченный состав команд. Поскольку программирование
на языке ассемблера напрямую затрагивает аппаратные возможности микропроцессора,
прежде всего следует выяснить, в какой степени программист может использовать
новые возможности микропроцессоров в своих программах и какие проблемы программной
несовместимости могут при этом возникнуть.
Первые персональные компьютеры корпорации IBM, появившиеся в 1981 г. и получившие
название IBM PC, использовали в качестве центрального вычислительного узла 16-разрядный
микропроцессор с 8-разрядной внешней шиной Intel 8088. В дальнейшем в персональных
компьютерах стал использоваться и другой вариант микропроцессора, 8086, который
отличался от 8088 тем, что являлся полностью 16-разрядным. С тех пор его имя
стало нарицательным, и в программах, использующих только возможности процессоров
8088 или 8086, говорят, что они работают в режиме 86-го процессора.
В 1983 г. корпорацией Intel был предложен микропроцессор 80286, в котором был
реализован принципиально новый режим работы, получивший название защищенного.
Однако процессор 80286 мог работать и в режиме 86-го процессора, который стали
называть реальным.
В дальнейшем на смену процессору 80286 пришли модели 80386, i486 и, наконец,
различные варианты процессора Pentium. Все они могут работать и в реальном,
и в защищенном режимах. Хотя каждая следующая модель была значительно совершеннее
предыдущей (в частности, почти на два порядка возросла скорость работы процессора,
начиная с модели 80386 процессор стал 32-разрядным, а в процессорах Pentium
реализован даже 64-разрядный обмен данными с системной шиной), однако с точки
зрения программиста все эти процессоры весьма схожи. Основным их качеством является
наличие двух режимов работы - реального и защищенного. Строго говоря, в современных
процессорах реализован еще и третий режим - виртуального 86-го процессора, или
V86, однако в плане использования языка ассемблера этот режим не отличается
от обычного режима 86-го процессора, мы его касаться не будем.
Реальный и защищенный режимы прежде всего принципиально различаются способом
обращения к оперативной памяти компьютера. Метод адресации памяти, используемый
в реальном режиме, позволяет адресовать память лишь в пределах 1 Мбайт; в защищенном
режиме используется другой механизм (из-за чего, в частности, эти режимы и оказались
полностью несовместимыми), позволяющий обращаться к памяти объемом до 4 Гбайт.
Другое важное отличие защищенного режима заключается в аппаратной поддержке
многозадачности с аппаратной же (т.е. реализованной в самом микропроцессоре)
защитой задач друг от друга.
Реальный и защищенный режимы имеют прямое отношение к работе операционной системы,
установленной на компьютере.
В настоящее время на персональных компьютерах типа IBM PC используются в основном
два класса операционных систем (оба - разработки корпорации Microsoft): однозадачная
текстовая система MS-DOS и многозадачная графическая система Windows. Операционная
система MS-DOS является системой реального режима; другими словами, она использует
только средства процессора 8086, даже если она установлена на компьютере с процессором
Pentium. Система Windows - это система защищенного режима; она значительно более
полно использует возможности современных процессоров, в частности, многозадачность
и расширенное адресное пространство. Разумеется, система Windows не могла бы
рабо-тать с процессором 8086, так как в нем не был реализован защищенный режим.
Соответственно двум типам операционных систем, и все программное обеспечение
персональных компьютеров подразделяется на два класса: программы, предназначенные
для работы под управлением MS-DOS (их часто называют приложениями DOS) и программы,
предназначенные для системы Windows (приложения Windows). Естественно, приложения
DOS могут работать только в реальном режиме, а приложения Windows - только в
защищенном.
Таким образом, выражения "программирование в системе MS-DOS", "программирование
в реальном режиме" и "программирование 86-го процессора" фактически
являются синонимами. При этом следует подчеркнуть, что хотя процессор 8086,
как микросхема, уже давно не используется, его архитектура и система команд
целиком вошли в современные процессоры. Лишь относительно небольшое число команд
современных процессоров специально предназначены для организации защищенного
режима и распознаются процессором, только когда он работает в за щенном режиме.
Поэтому изучение языка ассемблера целесообразно начинать с изучения архитектуры
процессора 8086 или, точнее, того гипотетического процессора, который как бы
объединяет часть архитектур средств современных процессоров, предназначенных
для использования в реальном режиме, и соответствующих архитектуре процессора
8086. будем называть этот гипотетический процессор МП 86. Изучению архитектуры
и программирования МП 86 посвящены первые три главы.
Деление программ на приложения DOS и приложения Windows исчерпывают вопроса
о возможных типах программ. Дело в том, что ряд дополнительных средств, имеющихся
в современных процессорах, вполне можно использовать и в реальном режиме (хотя
сама операционная система MS-DOS, разработанная еще в эпоху процессора 8088,
ими пользуется). К этим средствам относится расширенный состав команд процессоров
и, главное, их 32-разрядная архитектура.
Современные процессоры (начиная с 80386), в отличие от своего предшественника
8086, являются 32-разрядными. Это дает возможность программисту использовать
в программе 32-разядные операнды (т. е. числа в диапазоне до 232-1=4 294 967
295), что во многих случаях позволяет упростить алгоритм программы и повысить
ее быстродействие. Программа, предполагающая работать с 32-разрядными операндами,
должна иметь в своем составе одну из директив .386, .486 или .586, которые разрешают
транс тору использовать дополнительные средства соответствующего процессе. Включение
в программу этой директивы одновременно открывает доступ и к дополнительным
командам и способам обращения к памяти, отсутствующим в процессоре 8086, что
также расширяет возможности программирования. Эти средства описаны в главе,
посвященной расширенным возможностям современных процессоров.
Особая ситуация возникает, если программист хочет использовать не только 32-битовые
данные, но и 32-разрядные адреса ячеек памяти. Программы такого рода называются
32-разрядными приложениями (в отличие от 16-разрядных, в которых все адреса
16-разрядные, хотя дани могут иметь размер 32 бит). Для создания 32-разрядного
приложения в состав программы необходимо включить (в соответствующем месте)
oписатель use32. Однако следует иметь в виду, что MS-DOS не позволяет пускать
32-разрядные приложения, которые, таким образом, должны 6ыть приложениями Windows.
В то же время приложения Windows обычно составляются не на языке ассемблера,
а на одном из языков высокого уровня - Паскаль, С или C++, где тип создаваемой
программы (16-разрядная или 32-разрядная) определяется настройками компилятора.
Поэтому вопросы разработки 32-разрядных приложений на языке ассемблера не вошли
в настоящую книгу.
Как известно, система Windows.-допускает запуск приложений DOS (программ реального
режима), организуя для этого так называемый сеанс DOS, в котором программы фактически
выполняются в режиме 86-го процессора. Кроме этого, в Windows предусмотрена
возможность загрузки компьютера в режиме эмуляции DOS, когда компьютер работает
под уп-равлением варианта DOS, встроенного в систему Windows. Наконец, ком-пьютер
можно сконфигурировать так, чтобы он позволял загружать как Windows, так и "чистую"
DOS (например, MS-DOS 6.22), без всякой Windows. Каким вариантом загрузки компьютера
пользоваться при проработке настоящей книги - дело вкуса и привычек читателя.
Приводимые в книге примеры в своем большинстве просты, не затрагивают каких-то
специальных системных средств и будут работать в любом режиме. Последнее замечание
не относится только к примеру программы защищенного режима, приводимому в гл.
4, а также к обработчику прерываний от мыши, рассматриваемому в гл. 3. Эти программы
следует запускать на "чистой" DOS.