Задачи лабораторной работы
1. Изучение состава технических средств вычислительной системы.
2. Ознакомление со структурной схемой персонального компьютера.
3. Изучение архитектуры микропроцессора.
4. Изучение программной модели микропроцессора Intel 8086.
5. Ознакомление с организацией программ на языке ассемблера.
6. Освоение методики написания, транслирования и отладки программ на языке Ассемблера.
Алгоритм выполнения лабораторной работы
1. Ознакомиться с целью лабораторной работы.
2. Изучить теоретическую часть работы.
3. Выполнить практическую часть работы.
4. Изучить пояснения к практической части.
5. Ответить на контрольные вопросы по лабораторной работе.
6. Выяснить возникшие затруднения у преподавателя.
7. Подготовить отчет о выполненной работе.
8. Защитить выполненную работу, ответив на поставленные вопросы.
Теоретическая часть
Когда-то ассемблер был языком, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Постепенно ситуация менялась. Появлялись более удобные средства общения с компьютером. Но, в отличие от других языков, ассемблер не умирал, более того он не мог сделать этого в принципе. Почему? В поисках ответа попытаемся понять, что такое язык ассемблера вообще.
Если коротко, то язык ассемблера — это символическое представление машинного языка.
Все процессы в машине на самом низком, аппаратном уровне приводятся в действие только командами (инструкциями) машинного языка. Отсюда понятно, что, несмотря на общее название, язык ассемблера свой для каждого типа компьютеров. Это касается и внешнего вида программ, написанных на ассемблере, и идей, отражением которых является этот язык.
По-настоящему решить проблемы, связанные с аппаратурой (или даже, более того, зависящие от аппаратуры как, к примеру, повышение быстродействия программы), невозможно без знания ассемблера.
Существует фундамент, на котором строится любое сколь-нибудь серьезное компьютерное образование. Этим фундаментом являются знания о принципах работы компьютера, его архитектуре и языке ассемблера как отражении и воплощении этих знаний.
Типичный современный компьютер состоит из компонентов представленных на рисунке рисунок 1.1. Из рисунка видно, что все устройства вычислительной системы подключены к одному блоку, называемому системным.
Если рассуждать логически, то ясно, что он играет роль некоторого управляющего и координирующего устройства. Давайте заглянем внутрь системного блока: открываем корпус и видим так называемую “материнскую” плату, блок питания, соединительные провода. На плате расположены процессор, оперативная память, слоты расширений и другие компаненты.
Рисунок 1.1 − Вычислительная система на базе персонального компьютера
Чтобы понять их функциональное назначение, посмотрим на структурную схему типичного компьютера (рисунок 1.2). Она не претендует на безусловную точность и имеет целью лишь показать назначение, взаимосвязь и типовой состав элементов современного персонального компьютера.
Видим, что типичный персональный компьютер (ПК) состоит из определенного набора устройств, объединенных в единую систему с помощью системной магистрали, состоящей из трех типов шин (набора проводников) – шины данных, шины адресов и шины управления.
Основной блок в этой системе − это микропроцессор (МП), выполняющий чтение и обработку данных, помещенных в основную память и управляющий функционированием всей вычислительной системы.
Из всех блоков процессора программисту видима и доступна только небольшая их часть, которую принято называть программной моделью процессора.
В ней отображаются те регистры процессора, в которые программист может записать какие − либо данные и увидеть содержимое этих регистров на экране монитора.
Программная модель процессора Intel 8086 состоит из 14 регистров, которые участвуют в выполнении команд Ассемблера, они выполняют и общие, и специальные функции.
Регистр − это элементарное электронное устройство способное принимать, хранить, преобразовывать и выдавать на внутреннюю шину двоичные коды. Размер регистров микропроцессора (МП Intel 8086) 16 разрядов (элементарных ячеек). В каждом разряде хранится один бит информации. Разряды регистров принято нумеровать с права налево, начиная с нулевого разряда.
Все видимые регистры процессора имеют собственные имена, например: АХ, ВХ, IP и т.д. В Ассемблере есть определенные команды, по которым возможно обращение к этим регистрам. Под термином обращение понимаем возможность записи или чтения двоичных данных в регистры.
По назначению и способу использования регистры можно разбить на следующие группы:
· Регистры общего назначения (АХ, ВХ, СХ, ДХ);
· Регистры указателей и индексов (SI, DI, BP, SP);
· Сегментные регистры (CS, DS, SS, ES);
· Указатель команд (IP);
· Регистр (или указатель) флагов (FP).
Для того чтобы было понятно, откуда появилась аббревиатура этих регистров, приведем расшифровку этих названий:
1. АХ – accumulator, аккумулятор;
2. ВХ – base, база;
3. СХ – counter, счетчик;
4. DX – date, данные;
5. SI – source index, индекс источника;
6. DI – destination index, индекс приемника;
7. BP – base pointer, указатель базы;
8. SP – stack pointer, указатель стека;
9. IP – instruction pointer, указатель команд;
10. FP – flags pointer, указатель флагов;
11. CS – code segment, сегмент команд;
12. DS – date segment, сегмент данных;
13. SS – stack segment, сегмент стека;
14. ES – extra segment, дополнительный сегмент.
Подробнее работу этих регистров рассмотрим намного позднее.
Микропроцессор обрабатывает данные, подчиняясь определенным машинным командам, сведенным в программу.
Перед исполнением программа помещается в оперативную память. Специальная программа − компоновщик назначает каждой команде и данным конкретные адреса в оперативной памяти. Процессор вычисляет адрес очередной команды и передает этот адрес в контроллер управления оперативной памятью, который извлекает команду из указанного адреса и передает ее по шине данных в процессор, где она расшифровывается и исполняется.
Алгоритм выполнения каждой машинной команды “зашит” в блоке микрокоманд в виде микропрограммы. Эта микропрограмма и определяет порядок действий процессора при исполнении каждой машинной команды.
Процессор, в соответствии с кодом расшифрованной команды, вырабатывает определенную последовательность электрических сигналов, подаваемых на различные логические схемы компьютера, тем самым управляя всеми подсистемами компьютера. В этом состоит так называемый принцип микропрограммного управления.
Таким образом, общение с компьютером на любом языке высокого уровня программирования в конечном итоге сводится к выполнению отдельных машинных команд центральным процессором.
При всем разнообразии машинных команд последовательность действий процессора при их выполнении строго определена. Эта последовательность действий называется базовым циклом работы процессора.
Базовый цикл работы процессора включает следующие действия:
1. вычисление адреса команды;
2. чтение команды из памяти;
3. расшифровка команды (преобразование во внутренний микрокод процессора);
4. исполнение команды.
Конечно, это основные вехи действий процессора, подробнее базовый цикл рассмотрим позднее.
Программа (или ее часть), написанная на любом языке, в том числе и на Ассемблере, во время исполнения находится в оперативной памяти.
Операционная система размещает программу в отдельные блоки оперативной памяти, называемые сегментами. Максимальный объем сегмента (для процессора Intel 8086) составляет 65536 байт. В зависимости от размера программы, сегментов может быть от одного до шести.
Каждый сегмент предназначен для хранения определенного вида информации. Обычно для небольших программ используют три сегмента.
Один сегмент для хранения данных, обрабатываемых программой, он называется сегмент данных и задается директивой Ассемблера .data.
Другой сегмент предназначен для хранения команд программы и называется сегмент кода и задается директивой Ассемблера .code.
Третий сегмент используется и операционной системой, и программистом и называется сегмент стека, или просто стек, этот сегмент задается директивой Ассемблера .stack.
Количество сегментов устанавливает разработчик программы, но он должен обязательно сообщить транслятору число сегментов в его программе.
Тип используемой модели памяти программы определяет количество сегментов в программе. Например:
· модель программы TINY подразумевает, что код, данные и стек в одном сегменте;
· модель типа SMALL подразумевает что код, данные и стек в разных сегментах;
· модель типа COMPACT – программный код находится в одном сегменте, а данные в нескольких сегментах.
Обычно, при выполнении лабораторных работ, применяется модель Small. Транслятору мы сообщаем об этом двумя директивами –.Model и Small. Эти директивы записываются в начале программы.
Далее приступим к написанию первой программы на Ассемблере.
Исходный текст программы можно написать в любом текстовом редакторе, но для удобства написания, отладки и исполнения программ, рекомендуется для этих целей использовать редактор файлового менеджера программ (FAR).
Для трансляции, компоновки и отладки программ необходимо иметь транслятор (TASM), компоновщик (TLINK) и отладчик (TD).
Транслятор (TASM) переводит мнемонический код команд в двоичный код - единственный код понятный процессору.
Компоновщик (TLINK) находит в оперативной памяти место для транслируемой программы, определяет количество и длину сегментов, назначает адреса сегментам, а также каждой команде и всем байтам данных, определяет смещение для каждой метки.
Отладчик (Турбо Дебюггер) позволяет выполнять программу в отладочном режиме, отслеживая выполнение каждой команды и контролируя изменение содержимого регистров процессора.
Следует заметить, что прописные и строчные буквы исходного текста программы транслятор воспринимает и интерпретирует одинаково.