Для кого написано это учебное пособие.
В течение календарного года курс «Организация ЭВМ и систем» изучают почти 500 студентов различных специальностей. В силу специфики, присущей каждой специальности, уровень исходной подготовки студентов имеет существенные различия. В частности, студенты многих специальностей и подавляющее большинство студентов, пришедших из различных филиалов, практически ничего не знают о таком языке как Ассемблер и, тем более, о принципах программирования на этом языке. В то же время изучение курса «Организация ЭВМ и систем» предполагает хотя бы минимальное знание Ассемблера и наиболее распространенных команд этого языка, таких как mov, in, out, push, pop и ряда других. Кроме того, в процессе изучения курса «Организация ЭВМ и систем» студенты выполняют восемь лабораторных работ, половина из которых требует минимального, а вторая половина достаточно полного знания языка Ассемблер, поскольку в последних из указанных работ требуется писать на этом языке полноценные программы.
Изучение принципов программирования на языке Ассемблер для человека, начинающего изучать этот язык «с нуля» сопряжено с немалыми трудностями. Связано это с тем, что программирование на Ассемблере предполагает знания в таких, казалось бы, далеких друг от друга областях как:
· система машинных команд процессора;
· набор доступных программисту внутренних регистров процессора и специфика использования каждого из этих регистров;
· аппаратная организация ПЭВМ;
· программная организация ПЭВМ;
· и.т.д.
Совершенно естественно, что новичок не понимает, за что взяться в первую очередь, решение одной проблемы требует знаний из других областей, то есть приводит к новым проблемам. В результате у новичков начинают «разбегаться глаза», а впоследствии у многих из них «опускаются руки».
По тем же самым причинам возникают серьезные трудности и у преподавателя. Преподавателю, рассказывающему о какой-то проблеме постоянно приходиться привлекать сведения из других областей, логика изложения теряется, и студент перестает понимать что-либо. Другими словами, объяснять программирование на Ассемблере – занятие достаточно неблагодарное.
Авторы данного пособия не претендуют на совершенное знание Ассемблера, однако они имеют большой опыт в проведении лабораторных работ на этом языке, следовательно, им хорошо известны типичные проблемы, с которыми сталкиваются студенты, типичные ошибки, которые они допускают и типичные «грабли», на которые наступает большинство из них.
Данное учебное пособие в первую очередь предназначено для студентов, ничего не знающих о программировании на языке Ассемблер. Именно поэтому авторы стараются давать только минимально необходимые сведения, не перегружая текст очень важными и нужными подробностями, если, по мнению авторов, без них все же можно обойтись. При этом авторы считают, что, освоив азы программирования на Ассемблере, студенты сами (уже без труда) разберутся с этими подробностями.
Итак, резюме: данное пособие предназначено, прежде всего, для начинающих и призвано дать им возможность безболезненно пройти начальный этап в написании ассемблерных программ. А именно этот этап и является «камнем преткновения». После того как освоены азы программирования на Ассемблере, никаких особых трудностей у студентов, как правило, не возникает. Студенты, уже освоившие азы ассемблерного программирования, могут найти в этом пособии ряд алгоритмов, которые удобно использовать при выполнении некоторых лабораторных работ, да и в жизни тоже. Студентам, имеющим большой опыт программирования на Ассемблере, данное пособие можно не читать, оно попросту написано не для них.
Еще одно замечание. В этом учебном пособии ни слова не говориться об ассемблерном программировании под WINDOWS, подразумевается, что мы работаем только с DOS.
2. ПРЕДВАРИТЕЛЬНЫЕ СВЕДЕНИЯ ИЛИ АЗЫ, КОТОРЫЕ НЕОБХОДИМО ЗНАТЬ!
Ассемблер, что это такое?
Процессор всегда выполняет последовательность машинных команд (кодов). Любая машинная команда внешне представляет собой обычное двоичное число (например, 10001000). Очевидно, что написать в машинных кодах, какую-либо программу практически невозможно, хотя бы потому, что вероятность ошибки при написании такой программы приближается к 100%, а вероятность выявления ошибок и их исправления – к 0%. Что, например можно понять из такого фрагмента кода:
Поэтому, в начале 50-х годов было предложено ввести для каждой машинной команды ее, понятный человеку, символический эквивалент. Так и появился язык Ассемблер. То есть каждой ассемблерной команде соответствует конкретная машинная команда и наоборот. Приведенный выше фрагмент кода в записи на Ассемблере выглядит так:
cli ;(11111100) |
mov al, bl; (11000011 10001010) |
nop; (10010000) |
и это уже вполне читабельно. Запретить внешние прерывания, очистив флаг if (команда cli), передать байт из регистра bl в регистр al (команда mov al, bl) и выполнить пустую операцию (команда nop). С программой, заданной в таком виде вполне можно работать.
Конечно, программу на ассемблере писать труднее, чем программу на языке высокого уровня. Однако Ассемблер имеет и очевидные преимущества. Во-первых, программа, написанная на языке высокого уровня, все равно транслируется в ассемблерную программу, причем весьма неоптимальным образом. То есть программа на Ассемблере практически всегда будет работать быстрее и занимать значительно меньше памяти. Во-вторых, доступ ко многим аппаратным ресурсам можно получить только с помощью Ассемблера. При желании можно найти и, в-третьих, и, в-четвертых …