Эту книгу можно рассматривать как своеобразную форму программного продукта. Даже беглое ее пролистывание показывает, как много в ней программного кода. Более того, так как ассемблерный код неэк'ономичен с точки зрения использования поверхности листа бумаги для его записи, то в тексте книги приведены лишь значимые для каждого конкретного контекста изложения фрагменты программ. Полные тексты этих программ содержатся на дискете. Некоторые наиболее объемные по размеру исходного текста программы целиком вынесены на дискету без приведения их фрагментов в тексте книги. Для эффективной работы с ними читателю следует внимательно следить за ссылками на них и соответствующими пояснениями. Насколько это возможно, программы были проверены, но было бы опрометчиво утверждать, что вероятность появления ошибок в них равна нулю. Любому программисту, даже имеющему очень скромный опыт практической работы, известно, что вероятность последней ошибки есть всегда. В связи с этим просьба к читателям сообщать о найденных ошибках по указанным ниже адресам электронной почты. Книга состоит из 10 разных по объему глав. Ниже приведены краткие сведения о цели и характере содержимого каждой из этих глав.
- Глава 1 «Программирование целочисленных арифметических операций». В этой главе приводятся исчерпывающие сведения об алгоритмах реализации четырех основных арифметических операций над числами различной разрядности. На практике нередко возникают ситуации, когда численные значения данных выходят за пределы максимально представимых диапазонов чисел в компьютере. В этом случае нужно использовать алгоритмы для производства вычислении над многобайтными (с разрядностью от 1 до оо) числами. В этой главе приведена реализация этих алгоритмов для двоичных и двоично-десятичных (BCD) чисел. Кроме этого, глава содержит описание алгоритмов генерации псевдослучайных последовательностей, проблема организации которых также возникает достаточно часто.
- Глава 2 «Сложные структуры данных». Содержимое этой главы значительно дополняет и расширяет содержимое одноименного урока 12 учебника. Достаточно перечислить номенклатуру рассмотренных структур данных, названных «сложными», — это множества, массивы, структуры, таблицы. одно- и двусвязные списки, деревья. Для демонстрации работы с этими «сложными структурами данных» подобраны интересные и востребованные на практике алгоритмы. Так, работа с массивами показана на примерах популярных алгоритмов сортировки и поиска, работы с матрицами. Работа со структурами иллюстрируется на примерах организации массивов структур — таблиц. При этом наряду с обычными таблицами рассмаривается специальный класс таблиц — таблиц с вычисляемыми входами, или хэш-таблиц. Интересные примеры иллюстрируют выполнение основных операций над элементами одно- и двусвязных списков. Работа с сетью показана на примере организации в программе такой структуры, как конечный автомат. Заканчивается глава рассмотрением элементов компиляции программ. Это логичное и оправданное с практической точки зрения завершение главы о сложных структурах данных. Наверняка каждому из вас приходилось организовывать элементарный языковой интерфейс с пользователем и обрабатывать его ввод. О существующих подходах к практической реализации формальных механизмов распознавания ввода пользователя вы узнаете из главы 2.
- Глава 3 «Процедуры в программах ассемблера». Также достаточно интересная глава, которая является существенным дополнением урока 14 «Модульное программирование» учебника. Большое внимание уделено в ней реализации рекурсивных процедур в программах на ассемблере. Реализация рекурсии в любом языке — предмет дискуссии, причем от полного неприятия до слепого поклонения. Мы не стали принимать участие в этой дискуссии, а просто показали технологию разработки рекурсивных программ на ассемблере. Попутно обсуждению подвергаются проблемы передачи параметров и сохранения локальных параметров процедуры. В несколько более скромном объеме приведены сведения об организации вложенных процедур. В этой главе также содержится очень важный материал для программирующих под Windows — о разработке и об организации работы с DLL-библиотеками в программах на ассемблере.
- Глава 4 «Обработка цепочек элементов» содержит пример реализации некоторых полезных алгоритмов поиска подстроки в текстовой строке. Материал этой главы представляет собой существенное дополнение (а где-то предлагает и альтернативные решения) урока 11 «Цепочечные команды» учебника.
- В Глава 5 «Работа с консолью в программах на ассемблере» в полном объеме рассматривает проблему ввода информации с клавиатуры и вывода информации на экран компьютера. Для этого приведено описание соответству-щих средств BIOS, операционных платформ MS DOS и Windows.
- Глава 6 «Преобразование чисел» предлагает набор алгоритмов для преобразования представлений чисел между различными системами счисления. Этот вид преобразования данных также часто встречается на практике. Из-за того что в ассемблере нет для этого соответствующих средств, каждый из программистов решает эту задачу по-своему, исходя из своего опыта и знаний.
- Глава 7 «Работа с файлами в программах на ассемблере» содержит систематизированные сведения по работе с файлами из программ на ассемблере. За неимением соответствующих средств языковой поддержки со стороны программистов на практике также наблюдается «свободное творчество». Приведенные сведения относятся к уровню практической реализации задач в MS DOS и Windows с учетом возможности использования как длинных, так и коротких имен.
- Как оценить эффективность кода, который вы пишете? В этом вам поможет материал главы 8 «Профайлер». В ней содержится описание двух макрокоманд, использующих средства микропроцессора Pentium, которые помогут вам решить эту задачу.
- Глава 9 «Вычисление CRC» описывает.варианты решения одной интересной практической задачи, которой на практике можно найти достаточно много применений. Обладая этим инструментом, можно проводить быстрые оценочные проверки целостности данных, которыми манипулирует ваша программа. Суть этих алгоритмов с первого взгляда не очень очевидна, поэтому данная глава содержит подробное их объяснение.
- Глава 10 «Программирование ХММ-расширения» призвана дополнить материал урока 20 «ММХ-технология микропроцесоров Intel» учебника. В ней на примере реализации нескольких характерных алгоритмов приводятся сведения о порядке использования команд ХММ-расширения микропроцессора Intel. Более того, предлагается альтернативный подход к решению проблемы поддержки работы с этими командами в программах на ассемблере. Механизм решения этой проблемы можно использовать и в других случаях, когда требуется обеспечить поддержку новых команд микропроцессора, работая со старыми версиями компилятора (и не только ассемблера), процесс обновления которых по объективным причинам значительно значительно более инертен, чем процесс обновления системы команд микропроцессора.
Необходимо подчеркнуть тот факт, что
программы книги реализованы с помощью двух версий ассемблера — 16- и
32-разрядной. Выбор операционной платформы и средств реализации задач
книги производился исходя из их конкретной постановки. Главный критерий
здесь — подчеркнуть особенности реализации алгоритма. Если для этого
достаточно платформы MS DOS, то задача реализовывалась с использованием
средств этой ОС. При необходимости вы достаточно легко сможете
доработать свою программу так, чтобы она функционировала в среде
Windows. Для этого книга содержит достаточно практических примеров.
Многие задачи реализованы непосредственно для функционирования в среде
Windows. Сделано это в основном на примерах консольных приложений
Windows. Тем самым был дополнен материал учебника, в котором процесс
разработки оконных приложений для Windows описан достаточно подробно.
Следует отметить, что для пояснения наиболее сложных алгоритмов в
некоторых примерах книги введен псевдоязык, синтаксис которого
рассмотрен в главе 2. Для экономии места такой вид пояснения
используется для текстов программ, вынесенных на дискету. Поэтому имейте
в виду, что исходные тексты программ на дискете немного отличаются от
соответствующих текстов программ в книге — прежде всего тем, что
программы на дискете снабжены более подробными комментариями и
псевдокодом. Для общеизвестных алгоритмов приведены ссылки на источники,
где с ними можно познакомиться более подробно. Более того, система
нумерации программ сделана так, чтобы указать читателю ссылку на
источники, которые можно использовать для более глубокого изучения
соответствующих алгоритмов. Следует отметить, что псевдоязык использован
с двоякой целью. Первую из целей мы уже отметили, что касается второй,
то она заключается в том, чтобы подготовить читателя к изучению теории
компиляции. Так, пояснение примеров программ на ассеблере производится
не только с помощью обычных комментариев, но и с использованием
фрагментов программы на псевдокоде. Такое смешанное пояснение
ассемблерной реализации алгоритма не только дополнительно иллюстрирует
сам алгоритм, но и показывает суть третьего и четвертого этапов
.компиляции программы — генерации и оптимизации кода, так как при этом
можно видеть, какие ассемблерные (машинные) конструкции соответствуют
конструкциям языка высокого уровня.
Завершает книгу достаточно подробный список литературы, который был
использован в процессе подготовки книги и который можно рекомендовать
как основу для дальнейшего изучения затронутых в ней вопросов.