Лабораторная работа №2
(системное программирование и ОС)

Изучение архитектуры процессора 80086 и основ программирования.

Цель данной лабораторной работы:

- изучить основные сведения об архитектуре микропроцессора 80086,

- закрепить знания, полученные на предыдущей лабораторной работе, о процессе получения загрузочного модуля,

- научится работать с отладчиком,

- изучить основные способы представления данных в оперативной памяти и правила кодирования и описания данных на языке ассемблера.

Работа рассчитана на четыре - шесть часов (две - три пары)

Вам необходимо изучить (или использовать как справочные) следующие документы:

1. Архитектура процессора

В этом документе рекомендуется ознакомится с разделами: 1.1. Память и процессор. 1.2. Распределение адресного пространства. 1.3. Регистры процессора. 1.4. Сегментная структура программ. 1.5. Стек. 1.6. Система прерываний. 1.7. Система ввода-вывода

2. Основы программирования

В этом документе рекомендуется обязательно ознакомится с разделами: 2.1. Подготовка и отладка программы. 2.2. Представление данных. 2.3. Описание данных. 2.4. Структуры и записи.

Остальные разделы этого документа - 2.5. Способы адресации. 2.6. Переходы. 2.7. Вызовы подпрограмм. 2.8. Макросредства ассемблера. следует изучить в рамках самостоятельной работы.

План выполнения работы.

0. Откройте в браузере и по возможности не закрывайте документы "Архитектура процессора" и "Основы программирования". Ознакомьтесь с документами.

1. Убедитесь, что подготовленное вами рабочее место программиста находится в актуальном состоянии. Если это не так - подготовьте рабочее место программиста (см. лаб. работу № 1)

2. Подготовьте несколько тестовых программ - они вам понадобятся в дальнейшем. В этом документе приведены коды программ и их описание. Подготовьте исходные файлы программы вывода символа на экран дисплея, программы ввода символа и на их основе - программу вывода на экран всех символов кодовой таблицы. Отладьте программы. Продемонстрируйте преподавателю их работу.

3. Изучите основные правила работы с отладчиком ассемблерных программ. Методика использования отладчика приведена здесь. Выполните пошаговое выполнение любой из написанных вами программ.

4. Составьте программу, состоящую из всевозможных вариантов описания простейших данных. Опишите следующие данные:

- символ, символьная строка;

- целое положительное, размером в один и два байта;

- целое отрицательные, размером в один и два байта;

- целые числа, закодированные на языке ассемблера, в разных системах исчисления;

Указание: Для указанных действий используются так называемые "псевдокоманды".

Псевдокоманда - директива ассемблера, которая приводит к включению данных или кода в программу, хотя сама никакой машинной команде не соответствует.

Псевдокоманда определения данных имеет следующий формат:

имя_переменной D* значение

где D* - одна из псевдокоманд:

DB - определить байт

DW - определить слово

DD - определить двойное слово

DF - определить 6 байт (адрес в формате: 16-битный селетор: 32-битовое смещение)

DQ - определить 8 байт

DT - определить 10 байт

Поле значения может содержать одно или несколько чисел, строк символов в одиночных или двойных кавычках, операторов ? и DUP, которые разделяются запятыми. Все определенные таким образом данные окажутся в выходном файле, а переменная будет соответствовать первого из указанных значений. Несколько примеров:

string DB 'Hello world!'

number DW 75

table DB 1, 2, 3, 4, 5, 6, 7, 8, 9

fnumber DD 3.5e12

array DW 512 dup(?)

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

5. Ассемблируйте составленную программу и изучите листинг. Изучите машинное представление символьных и целых констант.

6. На основе программ display и bkin напишите программу,
которая вводит символ с клавиатуры, а выводит символ, следующий (согласно кодовой таблице) за введенным.

Указание:

а) для увеличения кода, содержащегося в регистре al воспользуйтесь командой inc al.

б) проверьте себя, один из возможных вариантов программы здесь.

7. Напишите программу согласно Вашего варианта:

далее предполагается, что порядок расположения символов соответствует их расположению в стандартной для режима консоли кодовой таблице

вариант | напишите программу, которая
1 | выводит 32 рядом стоящих символа, начиная с символа "А"
2 | выводит 32 рядом стоящих символа, начиная с символа "Q"
3 | выводит 32 рядом стоящих символа, начиная с символа "1"
4 | выводит 32 рядом стоящих символа, начиная с символа "$"
5 | выводит 32 рядом стоящих символа, начиная с символа "*"
6 | выводит 32 рядом стоящих символа, начиная с введенного символа
7 | выводит 16 рядом стоящих символов, начиная с введенного символа
8 | выводит 64 рядом стоящих символов, начиная с введенного символа
9 | выводит 8 рядом стоящих символов, начиная с введенного символа
10 | выводит 16 рядом стоящих символа, начиная с символа, следующего за введенным символом
11 | выводит 32 рядом стоящих символа, начиная с символа, следующего за введенным символом
12 | выводит 64 рядом стоящих символа, начиная с символа, следующего за введенным символом
13 | выводит 128 рядом стоящих символов, начиная с введенного символа
14 | выводит символы, предыдущий и следующий за введенным
15 | выводит символ, отстоящий от введенного на два символа
16 | выводит символ, отстоящий от введенного на три символа
17 | выводит символ, отстоящий от введенного на четыре символа
18 | выводит символ, отстоящий от введенного на пять символов
19 | выводит 32 рядом стоящих символа через один, начиная с символа "А"
20 | выводит 32 рядом стоящих символа через один, начиная с символа "Q"
21 | выводит 32 рядом стоящих символа через один, начиная с символа "1"
22 | выводит 32 рядом стоящих символа через один, начиная с символа "$"
23 | выводит 32 рядом стоящих символа через один, начиная с символа "*"
24 | выводит символы, обозначающие цифры в десятичной системе исчисления
25 | выводит символы, обозначающие цифры в шестнадцатеричной системе исчисления
26 | выводит 32 рядом стоящих символа через два, начиная символа "А"
27 | выводит 32 рядом стоящих символа через два, начиная с символа "Q"
28 | выводит 32 рядом стоящих символа через два, начиная с символа "1"
29 | выводит 32 рядом стоящих символа через два, начиная с символа "$"
30 | выводит 32 рядом стоящих символа через два, начиная с символа "*"

7а. Измените программу так, что бы вывод осуществлялся по одному символу в одной строке. Для этого после вывода каждого символа достаточно вывести соответствующее указание - перейти на следующую строчку. Это достигается выводом символов с кодами 10,13

8. Подготовьте ответы на следующие контрольные вопросы:
- регистры процессора, их назначение и наименование.
- сегменты оперативной памяти.
- правило вычисления исполнительного адреса.
- основное понятие об прерываниях и функциях ОС.
- назначение отладчика, его основные возможности.
- команды и псевдо команды, необходимые для реализации элементарных подпрограмм ввода - вывода.
- процедура получения загрузочной (исполняемой) программы. Необходимые для этого компоненты системного программного обеспечения.
- основные базовые типы данных. Правила их кодирования и хранения в оперативной памяти компьютера.
- основные правила записи данных на языке ассемблера.
- основные команды изменения последовательности выполнения операций.
- Основные методы адресации оперативной памяти.
- Понятие косвенной адресации.
- Адресация памяти с использованием базового регистра и смещения.

9. Подготовьте отчет о проделанной работе. В отчет необходимо включить листинги программ, разработанных вами в ходе выполнения данной лабораторной работы. Результаты работы программ так же включите в отчет.

10. Основные контрольные вопросы на повторение пройденных тем.

- Основные задачи, решаемые компилятором.

- Основные задачи решаемые редактором связи.

- Структура листинга ассемблерной программы.

- Основные регистры процессора.

- Сегменты оперативной памяти и их "определение" в программе.

- Архитектура процессора: - адресация оперативной памяти.

- Архитектура процессора: - основные регистры и их назначение.

Успехов в работе.