 |
раммирования на языке Ассемблера для процессора 8086. Мы также
затронем те аспекты программирования, которые относятся конкретно
к компьютерам IBM PC.
Архитектура компьютера
-----------------------------------------------------------------
На нижнем уровне компьютер - это не что иное, как устройство
для перемещения данных из одного места в памяти (или на устройс-
тве) в другое, при котором иногда выполняются также логические
или арифметические преобразования данных. Для наших целей полез-
нее, однако, рассматривать компьютер, как систему, состоящую из
пяти функциональных подсистем: ввода, управления, арифметической
и логической обработки, памяти и ввода (см. Рис. 4.1).
------------------------------------
| Арифметическая подсистема |
| (сложение, вычитание, умножение, |
| деление, операции "И", "ИЛИ", |<----
| "исключающее ИЛИ" и т.д.) | |
------------------------------------ |
|
---------------------- ------------------------- |
| Подсистема ввода | | Подсистема управления |<-----
| (клавиатура, |<------>| (координация всех |
| "мышь", манипуля- | ---->| функций) |<-----
| тор "джойстик" и | | ------------------------- |
| т.д.) | | |
---------------------- | ------------------------- |
| | Подсистема памяти | |
---------------------- | | (до 1 мегабайта па- |<-----
| Подсистема вывода | | | мяти с прямым досту- |
| (дисплей, принтер, |<--- | пом или памяти, дос- |
| графопостроитель, | | тупной только по чте- |
| диск) | | нию - ПЗУ) |
---------------------- -------------------------
Рис. 4.1 Пять подсистем компьютера.
(В данном случае мы говорим о компьютерах вообще, компьюте-
ров с процессорами 8088 мы кратко коснемся далее.)
Арифметическая подсистема компьютера - это тот аспект, в ко-
тором большинство людей привыкли рассматривать весь компьютер.
Ведь что такое, компьютер, как не вычислительное устройство? Ока-
зывается, однако, что на операции с числами большинство компьюте-
ров тратит очень мало времени. Тем не менее арифметическая под-
система очень важна. Кроме того, она выполняет не только
арифметические операции (сложение, вычитание, умножение и деле-
ние), но и такие логические операции, как "И" (and), "ИЛИ" (or) и
"исключающее ИЛИ" (xor).
Арифметические операции - это, конечно, хорошо, но откуда
поступают исходные значения для операций и куда записывается их
результат? Здесь выполняет свои функции подсистема памяти компью-
тера, предоставляя постоянно доступную для хранения многих тысяч
символов и чисел память. В компьютерах имеются также дисководы на
жестких и гибких дисках, обеспечивающие постоянную, но относи-
тельно медленную память для данных большого объема. Однако такие
дисководы представляют собой устройства ввода-вывода, а не часть
подсистемы памяти.
Подсистема ввода позволяет программам обрабатывать данные
из внешней среды, начиная от отдельных нажатий клавиш и перемеше-
ний манипулятора типа "мышь", до целых баз данных, хранящихся на
дисках в виде файлов. Подсистема вывода позволяет программам вы-
водить данные и результаты на экран или принтер, записывать дан-
ные в файлы на дисках или магнитных лентах. Программы без ввода
или вывода довольно редки, поскольку они не могут воспринимать
данные из внешней среды и не могут ничего сделать с полученными
результатами.
Наконец, подсистема управления объединяет работу остальных
четырех подсистем и управляет перемещением данных.
Подсистема управления и арифметическая подсистема вместе об-
разуют то, что известно, как обрабатывающее устройство или про-
цессор. Процессор - это ядро любого компьютера, обеспечивающее
обработку данных и управление подсистемами памяти, ввода и выво-
да. Процессор задает тон всей работе компьютера, так как именно
процессор управляет работой каждой из подсистем и координирует их
в один согласованно работающий модуль. В настоящее время весь
процессор часто представляет собой всего лишь одну интегральную
схему. Именно таким процессором является процессор 8088, выполня-
ющий полную арифметическую обработку, управление и имеющий интер-
фейс с вводам, выводом и памятью.
Поняв, что такое процессор, мы выясним связь между архитек-
турой компьютера и уникальной природой языка Ассемблера.
Язык Ассемблера
-----------------------------------------------------------------
Как мы уже сказали, процессор управляет деятельностью всех
пяти подсистем компьютера: сложением значений, перемещением их из
памяти на устройство вывода, и т.д. Однако здесь возникает воп-
рос, откуда процессор знает, какие именно операции нужно выпол-
нять? То есть, компьютер обладает всеми необходимыми нам свойст-
вами, но у него нет сценария, по которому он может работать.
Ответ здесь удивительно прост: процессор извлекает данные из
памяти, и эти данные указывают ему, что нужно делать. Такие дан-
ные обычно называются инструкциями, однако инструкции - это прос-
то хранимые в памяти значения, аналогичные любым другим данным.
Набор инструкций, которые может выполнять процессор (набор инст-
рукций процессора) в точности соответствует тем действиям, кото-
рые может выполнять аппаратное обеспечение процессора. Другими
словами, инструкции процессора охватывают все операции, выполнить
которые может указать процессору программное обеспечение.
Например, если отсутствует инструкция умножения, то аппарат-
ное обеспечение компьютера не может выполнять умножение. Вместо
этого умножение выполняется программным обеспечением с помощью
операций сдвига и сложения, но такое умножение выполняется значи-
тельно медленнее. Ключевой момент здесь состоит в том, что набор
инструкций процессора отражает действия, которые присущи аппарат-
ному обеспечению. Поэтому язык ассемблера каждого процессора уни-
кален для этого процессора (каждый процессор имеет уникальные
особенности и, таким образом, уникальный набор инструкций).
Значение каждой инструкции имеет для данного процессора
конкретный, строго определенный смысл. Например, значение инст-
рукции 4 говорит процессору 8088 (или 8086), что нужно сложить
значение, хранящееся в следующей ячейке памяти, с регистром AL
(далее мы рассмотрим, что это за регистр). В итоге можно указать
процессору, чтобы он выполнил желаемую последовательность дейс-
твий с помощью соответствующего набора значений инструкций. В
действительности программа представляет собой просто последова-
тельность инструкций и ничего более.
Откуда же процессор знает, какую инструкцию нужно выполнить
следующей? С помощью отслеживания внутреннего указателя, который
указывает на то место в памяти, где хранится значение следующей
выполняемой инструкции. Когда из памяти считывается и выполняется
следующая инструкция, указатель перемещается на следующую инст-
рукцию. Некоторые инструкции могут устанавливать указатель инст-
рукций в новое значение, это дает процессору возможность выпол-
нять ряд инструкций не строго последовательно и даже выполнять
различные группы инструкций, в зависимости от определенных усло-
вий.
Прекрасно, но какое все это имеет отношение к языку Ассем-
блера?. А вот какое: набор инструкций процессора представляет со-
бой его язык Ассемблера. Или, точнее говоря, язык Ассемблера яв-
ляется ориентированной на человека формой набора инструкций про-
цессора (который называется также машинным языком). Ассемблер
преобразуется в машинный язык. Поскольку машинный язык и язык Ас-
семблера функционально эквивалентны, на языке Ассемблера намного
проще программировать. Кроме того, вам конечно больше понравится
программировать с помощью инструкций типа:
add al,1
чем
4
1
не правда ли? Обе формы работают одинаково, но язык Ассемблера
позволяет вам иметь дело с мнемоническими именами инструкций на
машинном языке. При этом Ассемблер транслирует инструкции из мне-
монического вида в их машинный эквивалент. Это, несомненно, боль-
шое преимущество, так как люди просто не могут достаточно эффек-
тивно думать на числовых языках. В основном язык Ассемблер предс-
тавляет собой прямой аналог машинного языка, но реализованный в
том виде, с которым люди могут более эффективно работать.
Неплохим качеством Ассемблера является то, что он позволяет
вам управлять действиями процессора поэтапно (по операциям) и с
максимальной эффективностью. К числу его недостатков можно отнес-
ти тот факт, что при каждом отдельно взятом действии процессора
выполняется совсем немного функций, что отражает ограниченные
возможности того, на что в действительности способен процессор.
Например, процесс сложения двух длинных целых чисел и сохранения
результата в третьем целом значении занимает на языке Си только
одну строку:
i = j + k;
а на Ассемблере процессора 8088 это потребует шести строк:
mov ax,[j]
mov dx,[j+2]
add ax,[k]
addc dx,[k+2]
mov [i],ax
mov [i+2],dx
Конечно, объем скомпилированного кода на языке Си будет не
меньше (а вероятнее всего больше), чем шесть машинных инструкций
на языке Ассемблера, но легче написать одну строку на Си, чем
шесть на Ассемблере (необходимо помнить, что инструкции Ассембле-
ра отражают элементарные "способности" компьютера, и программы,
написанные на любых языках, должны, очевидно, перед выполнением
транслироваться в машинный язык).
Зачем же тогда вообще использовать Ассемблер, если на нем
программировать труднее, чем на других языках? Причина состоит в
том, что Ассемблер позволяет вам достигать любой части памяти и
|