Введение

Первый вопрос, который задает себе человек, впервые услышавший об ассембле­ре, - а зачем он, собственно, нужен? Особенно теперь, когда все пишут на C/C++,. Delphi или других языках высокого уровня? Действительно очень многое можно создать на С, но ни один язык, даже такой популярный, не может претендовать на

то, чтобы на нем можно было написать абсолютно все. Итак, на ассемблере пишут:

все, что требует скорости выполнения: основные компоненты

компьютерных игр, ядра операционных систем реального времени и просто критические участки программ;

□ все, что взаимодействует с внешними устройствами: драйверы, программы, работающие напрямую с портами, звуковыми и видеоплатами;

все, что использует полностью возможности процессора: ядра многозадачных операционных систем, DPMI-серверы и вообще любые программы, перево­дящие процессор в защищенный режим;

все, что возможности операционной системы: виру-

сы и антивирусы, защиты от несанкционированного доступа, программы, об­ходящие эти защиты, и программы, защищающиеся от данных программ;

□ и многое другое. Стоит познакомиться с ассемблером поближе, как оказыва­ется, что большую часть из того, что обычно пишут на языках высокого уров­ня, лучше, проще и быстрее написать на ассемблере.

«Как же так? - спросите вы, прочитав последний пункт. - Ведь всем известно, что ассемблер - неудобный язык, и писать на нем долго и сложно!» Попробуем перечислить мотивы, которые обычно выдвигаются в доказательство того, что

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

выучить. Легко выучить С или Delphi после Pascal, потому что они похожи. А по­пробуйте освоить Lisp, Forth или Prolog, и окажется, что ассемблер в действитель­ности даже проще, чем любой абсолютно незнакомый язык программирования.

Говорят, что программы на ассемблере трудно понять. Разумеется, на ассембле­ре легко написать неудобочитаемую программу... точно так же, как и на любом дру­гом языке! Если вы знаете язык и если автор программы не старался ее запутать, то понять программу будет не сложнее, чем если бы она была написана на Basic.

Говорят, что программы на ассемблере трудно отлаживать. Программы на ассемблере легко отлаживать - опять же при условии, что вы знаете язык. Более того, знание ассемблера часто помогает отлаживать программы на других языках, потому что оно дает представление о том, как на самом деле функционирует ком­пьютер и что происходит при выполнении команд языка высокого уровня.

Говорят, что современные компьютеры такие быстрые, что ассемблер больше не нужен. Каким бы быстрым ни был компьютер, пользователю всегда хочется большей скорости, иначе не наблюдалось бы постоянного спроса на еще более мощные компьютеры. И самой быстрой программой на данном оборудовании все­гда будет программа, написанная на ассемблере.

Говорят, что писать на ассемблере сложно. В этом есть доля правды. Очень часто авторы программ на ассемблере «изобретают велосипеды», программируя заново элементарные процедуры типа форматированного вывода на экран или' генератора случайных чисел, в то время как программисты на С просто вызывают стандартные функции. Библиотеки таких функций существуют и для ассемблера, но они не стандартизированы и не распространяются вместе с компиляторами.

Говорят, что программы на ассемблере не переносятся. Действительно, в этом заключается самая сильная и самая слабая сторона ассемблера. Во-первых, благо­даря этой особенности программы на ассемблере используют возможности ком­пьютера с наибольшей полнотой; во-вторых, эти же программы не будут работать на другом компьютере. Стоит заметить, что и другие языки часто не гарантируют переносимости - та же программа на С, написанная, например, под Windows 95, не скомпилируется ни на Macintosh, ни на SGI.

Далеко не всё, что говорят об ассемблере, является правдой, и далеко не все, кто говорят об ассемблере, на самом деле знают его. Но даже ярые противники согласятся с тем, что программы на ассемблере — самые быстрые, самые малень­кие и могут то, что не под силу программам, созданным на любом другом языке программирования.

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

Почти все, что надо знать об ассемблере, где-нибудь да объяснено, а также объяснено многое из того, что не заботит большинство программистов. С одной стороны, чтобы написать простую программу, не нужно знать язык и устройство процессора в совершенстве, но, с другой стороны, по-настоящему серьезная рабо­та потребует и основательной подготовки. Уровень сложности в этой книге воз­растает от начала к концу, но в первой ее половине отдельные абзацы помечены специальной пиктограммой @, которая означает, что данный абзац лучше про­пустить при чтении, если вы знакомитесь с ассемблером впервые. Впрочем, если у вас есть время и желание выучить ассемблер с нуля, - читайте все по порядку. Если же вам хочется немедленно приступить к написанию программ, начните сразу с главы 4, но будьте готовы к тому, что иногда придется возвращаться к пре­дыдущим главам за более подробным описанием тех или иных команд. И нако­нец, если вам уже доводилось программировать на ассемблере, - выбирайте то, что интересно.