Введение в язык Assembler

0
955

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

Итак, на Ассемблере пишут:

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

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

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

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

и многое другое.

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

Как же так? Ведь всем известно, что Ассемблер – неудобный язык, и писать на нём долго и сложно! Давайте перечислим мотивы, которые обычно выдвигаются в доказательство того, что Ассемблер не нужен.

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

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

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

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

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

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

 

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

Почти всё, что надо знать об Ассемблере, где-нибудь да объяснено, а также объяснено многое из того, что не заботит большинство программистов. С одной стороны, чтобы написать простую программу, не нужно знать язык и устройство процессора в совершенстве, но, с другой стороны, по-настоящему серьёзная работа потребует и основательной подготовки.

Степень мотивации при изучении того или иного раздела науки или практического навыка имеет первостепенное значение и во многом определяет успех или неудачу. Для себя вопрос можно сформулировать более точно: зачем мне нужно изучать Ассемб­лер?

При честном ответе самому себе на этот вопрос, несомненно, необходимо учитывать соображения научной и практической значимости проблемы, честолюбия (в хорошем смысле), прак­тических последствий (получение диплома, возможность уст­ройства на работу), стремление к постижению научной истины и, далеко не в последнюю очередь, материальные, финансовые интересы.

В настоящее время на всём земном шаре миллионы, если не миллиарды, людей вовлечены в процесс компьютеризации. Без преувеличения можно сказать, что люди, общающиеся с ком­пьютером на уровне Ассемблера, стоят на вершине этой гигант­ской пирамиды. Это – жрецы информатики, они же относятся к самым высокооплачиваемым программистам. Таким обра­зом, изучив Ассемблер, можно в полной мере удовлетворить собственное честолюбие не в ущерб окружающим и приобрести специальность с высокой степенью востребованности.

Переходя к более специфическим аспектам, необходимо отме­тить, что программа на Ассемблере как никакая другая близка к машинному коду, является лишь «слегка причёсанным» ма­шинным кодом.

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

Именно ассемблер (и ничто другое) служит инструментом для построения интерфейсов и поддержки протоколов связи с лю­быми нетрадиционными внешними устройствами (например, с аппаратурой некоторого физического эксперимента, космиче­ского корабля и т. п.).

Неоспорима методическая ценность изучения Ассемблера для досконального понимания работы компьютера. Полностью и до конца понять работу компьютера (за исключением его элек­троники) можно, только освоив Ассемблер и управление ком­пьютером на самом нижнем уровне.

Можно утверждать, что знание Ассемблера и умение работать с компьютером на самом нижнем уровне обязательны для сис­темного программиста-профессионала. Однако и учёный-прикладник может делать простые ассемблерные вставки в свои программы на Паскале или на C++, «вылизывая» наиболее ответ­ственные их места. Кстати, можно и наоборот, вставлять процеду­ры на языках высокого уровня в ассемблерную программу.

Наконец, нельзя не отметить удовольствие от программирования, когда вы работаете один на один с «железом» компьютера и между вами и компьютером никто не стоит (имеется в виду автор компи­лятора с языка высокого уровня), как бы ни был высок его профес­сиональный уровень.

Итак, если Вы хотите до конца понять, как работает ваш ком­пьютер и использовать возможности компьютера на 100 %, соз­давать интерфейсы с внешними устройствами, перехватчики, перекодировщики, надёжно защищать свои программные про­дукты и иметь потенциальную возможность взламывать чужие и многое другое, – Ассемблер для Вас.