Введение
Микропроцессоры корпорации 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.
|