Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение»






НазваниеЗадачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение»
страница1/6
Дата публикации10.05.2015
Размер0.68 Mb.
ТипЗадача
l.120-bal.ru > Документы > Задача
  1   2   3   4   5   6


Федеральное агентство по образованию

Государственное образовательное учреждение

Высшего профессионального образования

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра автоматизированных систем управления


ПРИМЕНЕНИЕ СИСТЕМНЫХ ФУНКЦИЙ

В ЗАДАЧАХ ПРОГРАММИРОВАНИЯ

Лабораторный практикум

по дисциплине «Системное программное обеспечение»

Уфа 2008

Составитель: О.Д. Лянцев

УДК 004.45(07)

ББК 32.973-018.2(я7)

Применение системных функций в задачах программирования. Лабораторный практикум по дисциплине «Системное программное обеспечение» / Уфимск. гос. авиац. техн. ун-т.

Сост.: О.Д. Лянцев. – Уфа, 2008. – 57 с.


Приведены сведения о принципах взаимодействия аппаратных и программных средств персонального компьютера IBM PC и способах выполнения основных системных функций. Рассматриваются процедуры низкоуровневого программирования на базе основных экранных и клавиатурных функций. Рассматриваются возможности системной программы DEBUG для выполнения и отладки программ. Изучается система программирования TASM для трансляции и компоновки программ на языке ASSEMBLER. Практическое применение иллюстрируется различными примерами и упражнениями.

Методические указания предназначены для подготовки дипломированных специалистов направления 230100 «Информатика и вычислительная техника», специальности 230102 – «Автоматизированные системы обработки информации и управления».

Библиогр.: 5 назв.

Рецензенты: В.П. Житников, Н.М. Дубинин

© УГАТУ



СОДЕРЖАНИЕ
Лабораторная работа №1

ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ DOS DEBUG ДЛЯ ОТЛАДКИ И ТЕСТИРОВАНИЯ ПРОГРАММ. 5

УПРАВЛЕНИЕ ВЫВОДОМ ТЕКСТОВОЙ ИНФОРМАЦИИ НА ЭКРАН 25

СИСТЕМНЫЕ СРЕДСТВА ДЛЯ ВЫВОДА ИНФОРМАЦИИ НА ЭКРАН В ГРАФИЧЕСКОМ РЕЖИМЕ 34

ПРОГРАММИРОВАНИЕ СИСТЕМНЫХ ФУНКЦИЙ BIOS И DOS ДЛЯ РАБОТЫ С КЛАВИАТУРОЙ 39

Список литературы 45

Программа DEBUG 46

Трансляция и компоновка программ 56


ЛАБОРАТОРНАЯ РАБОТА № 1

ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ DOS DEBUG ДЛЯ ОТЛАДКИ И ТЕСТИРОВАНИЯ ПРОГРАММ.



1. Цель работы

Целью настоящей работы является изучение возможностей системной программы – отладчика DEBUG по программированию компьютера IBM в машинных кодах.

2. Теоретическая часть

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

2.1. Команды DEBUG

В лабораторной работе используются следующие команды программы DEBUG:

А преобразовать инструкции символьного кода в машинный код;

D показать содержимое области памяти в шестнадцатеричном формате;

Е ввести данные в память, начиная с определенного адреса;

G начать выполнение программы в памяти;

Н выполнить шестнадцатеричные арифметические операции;

N назвать программу;

Р продолжить или выполнить группу связанных инструкций;

Q завершить сеанс работы с DEBUG;

R показать содержимое одного или более регистров в шестнадцатеричном формате;

Т отследить выполнение одной инструкции;

U преобразовать (дизассемблировать) машинный код в символьный.


2.2. Основные особенности программы DEBUG.

  • DEBUG не различает строчные и заглавные буквы.

  • Все вводимые числа задаются в шестнадцатеричной форме.

  • Пробелы используются в командах только для разделения параметров.

  • Сегмент и смещение указываются с использованием символа двоеточия, т.е. в форме сегмент:смещение.

Приложение 1 содержит полное описание команд DEBUG, включая инструкции по его запуску.

2.2.1. Команда D (Display - показать) в программе DEBUG

Эта команда выводит содержимое указанной области памяти на экран. Следующие три примера используют команду D для просмотра одного и того же участка памяти, начинающегося со смещения ЗС1H в сегменте кода (CS):

D CS:3C1 (команда набрана заглавными буквами с пробелом);

DCS:3C1 (команда набрана заглавными буквами без пробела);

dcs:3cl (команда набрана строчными буквами без пробела);

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

Команда D выводит 8 строк данных, в каждой из которых по 16 байт (32 шестнадцатеричных разряда), всего – 128 байт, начиная с указанного адреса.

Адрес слева относится только к первому байту в строке, адреса последующих байтов могут быть легко найдены простым счетом: например, если адрес первого байта – 0159:0240Н, то одиннадцатый байт в строке имеет адрес 0159:024АН. Шестнадцатеричное представление содержит два знака для каждого байта, байты разделяются пробелами для улучшения читаемости. Кроме того, восьмой и девятый байты разделяет дефис. Поэтому, например, если требуется найти байт со смещением хх13Н, начните с байта хх10Н и найдите третий после него байт.

Команда D также показывает содержимое регистров и состояние флагов в регистре Flags.

2.2.2. Упражнение 1: просмотр области данных BIOS

Первое упражнение показывает содержимое области данных BIOS в памяти, начиная с адреса 400Н или, более точно, с адреса сегмента 40[0]Н. BIOS инициализирует значения в этой области памяти при включении компьютера и меняет их в ходе выполнения программ.

Просматривайте эти значения при помощи адреса из двух частей: в качестве адреса сегмента (то есть 400, с отброшенным младшим разрядом), и nn в качестве смещения от начала сегмента. Воспринимайте адрес 40:nn как сегмент 40[0]Н плюс смещение nnН.

2.2.3. Проверка параллельных и последовательных портов

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Введите следующую команду:

D 40:00 (и нажмите )

Первые четыре выведенных слова указывают на адреса портов от СОМ1 до COM4. Если на компьютере два последовательных порта, первые два слова, вероятно, содержат F803 и F802 в обращенной (с переставленными байтами) последовательности. Последовательные порты имеют адреса 03F8 и 02F8. Следующие 4 слова указывают на параллельные порты от LPT1 до LPT4. Для системы с одним параллельным портом первое слово, вероятно, содержит 7803, т.е. адрес порта – 0378.

2.2.4. Проверка оборудования системы

Слово состояния оборудования в области данных BIOS предлагает базовую информацию о присутствующих в системе устройствах. Это слово, расположенное по адресу 410Н - 411Н, можно просмотреть командой

D 40:10 (и нажмите )

Выведенные строки должны начинаться так:

0040:0010 хх хх ...

Допустим, что слово содержит 23 44 в шестнадцатеричной форме. Чтобы интерпретировать его, переставим байты (44 23) и преобразуем в двоичную форму:

Двоичное значение: 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1

Позиция бита: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Эти биты означают:

Биты Устройство

15, 14 Число параллельных (принтерных) портов = 1 (двоичное 01)

11 – 9 Число последовательных портов = 2 (двоичное 010)

7,6 Число дисководов = 1 (00 = 1,01 = 2, 10 = 3, 11 = 4)

5,4 Начальный видеорежим = 10 (01 = 40x25 цветной,

10 = 80x25 цветной, 11 = 80x25 монохромный)

1 1 = присутствует математический сопроцессор

0 1 = присутствует привод для дискет




Неописанные биты не используются.

2.2.5. Проверка состояния регистра клавиатуры (клавиша Shift)

В области данных BIOS по адресу 417Н хранится первый байт состояния регистра клавиатуры. Убедитесь, что Num Lock и Caps Lock выключены, и просмотрите содержимое байта по этому адресу командой D 40:17.

Результат будет похож на

0040:0017 00 00 ...

Теперь включите Num Lock и Caps Lock и введите вновь команду D 40:17. Результат должен начинаться с 60 00.

2.2.6. Проверка состояния видеоустройства

В области данных BIOS по адресу 449Н находится первая область видеоданных (Video Data Area). Введите команду D 40:49. Первый показанный байт указывает на текущий видеорежим (например, 03 - цветной), а второй – число столбцов на экране (например, 50 означает режим с 80 столбцами). Число строк хранится по адресу 40:84Н.

2.2.7. Упражнение 2: Просмотр ROM BIOS

Сведения об авторском праве BIOS системы встроены в ROM BIOS no адресу FE00:0. В зависимости от производителя компьютера будут выведены различные строки, после которых будет указан семизначный серийный номер. Строка, указывающая на авторство BIOS, легко читается в виде ASCII-последовательности, а серийный номер – в виде шестнадцатеричного числа. Строка с указанием авторских прав может быть длиннее, чем показанный участок памяти; в этом случае для просмотра не показанной части снова введите D и нажмите .

2.2.8. Проверка даты производства BIOS

Эта дата, записанная в виде мм/дд/гг, начинается с адреса FFFF5H. Для ее просмотра введите команду D FFFF:5. Знание этой даты полезно при определении возраста и модели компьютера.

Используя команду D, вы можете просмотреть содержимое любой области памяти. Можно также последовательно просматривать память, просто повторно вводя D – DEBUG будет выводить 128 байт, следующих за последними просмотренными.

Для завершения работы с DEBUG введите Q.

2.2.9. Упражнение 3: Использование непосредственных данных

Воспользуемся DEBUG для ввода первой из двух программ непосредственно в память и наблюдения за ее выполнением. Обе программы включают простые инструкции машинного языка в виде, в котором они находятся в памяти, и позволяют продемонстрировать эффект их выполнения. Выполнение упражнения начинается с команды Е (Enter, ввести).

Первая программа использует непосредственные данные - данные, определенные в теле инструкций. Далее показан как машинный код и соответствующий символьный код с комментариями для улучшения восприятия. Первой инструкции, В82301, соответствует символьный код MOV АХ,0123, заносящий (копирующий) значение 0123Н в регистр АХ (непосредственные данные записываются в прямой, с непереставленными байтами, форме). MOV – инструкция, АХ – ее первый операнд, непосредственное значение 0123Н – второй.
Машинная Символьный код Пояснение

инструкция
В82301 MOV AX,0123 Переслать значение 012Зh в АХ

052500 ADD AX,0025 Прибавить значение О025h к АХ

8ВD8 MOV BX,AX Переслать содержимое АХ в ВХ

03D8 ADD BX,AX Прибавить содержимое АХ к ВХ

8BCB MOV CX,BX Переслать содержимое BХ в CХ

2BС8 SUB CX,AX Вычесть содержимое AХ из СХ

2ВС0 SUB AX,AX Вычесть содержимое АХ из АХ (очистка АХ)

90 NOP Нет операции

EBEE JMP 100 Переход к началу программы.
Из примера видно, что машинные инструкции имеют длину 1, 2 или 3 байта. Первый байт указывает, собственно, операцию, а все последующие – ее операнды (непосредственные значения, ссылки на регистры или адреса в памяти). Исполнение программы начинается с первой машинной инструкции и последовательно проходит через все инструкции одну за другой.

2.2.10. Ввод инструкций программы

Для того чтобы ввести свою программу непосредственно в память, вводите только машинный код, символьный код и комментарии водить не нужно. Введите команду Е и следующие символы, как показано ниже.

Е CS:100 B8 23 01 05 25 00 (и нажмите )

CS:100 указывает начальный адрес области, в которой будет храниться введенный код (обычный начальный адрес для машинного кода в программе DEBUG). Команда Е сохранит следующие за ней байты в адресах от CS:100 до CS:105.

Следующая команда Е сохранит еще 6 байт в адресах от CS:106 до CS:10B.

Е CS:106 8В D8 03 D8 8В СВ (нажмите )

Последняя команда Е сохраните 6 байт в адресах от CS:10С до CS:111.

Е CS:10C 2В С8 2В С0 ЕВ ЕЕ (нажмите )

Если вы введете неправильную строку, просто повторите ввод правильно.

2.2.11. Выполнение инструкций программы

Теперь можно выполнить введенные инструкции по очереди. Можно также просматривать содержимое регистров после выполнения каждой инструкции с помощью команд R (registers - регистры) и Т (trace - отследить).

Для просмотра начального состояния регистров и флагов введите команду R и нажмите . DEBUG показывает содержимое регистров в шестнадцатеричной форме в виде

АХ=0000 ВХ=0000 ...

DEBUG проинициализировал DS, CS, SS и ES одним и тем же адресом, xxxx[0]. IP должен показывать 0100, указывая, что выполнение инструкций начинается со смещения 100Н относительно начала сегмента кода.

Регистр флагов показывает следующие значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

NV UP El PL NZ NA PO NC

Эти значения соответствуют слева направо: отсутствию переполнения, направлению вверх (или вправо), разрешению прерываний, положительному знаку, ненулевому значению, отсутствию дополнительного переноса, нечетному слову, и отсутствию переноса. В данный момент эти значения не важны.

Сразу после регистров командой R показана первая, подлежащая выполнению инструкция:

хххх:0100 В82301 MOV АХ,0123

• хххх означает начало сегмента кода по адресу хххх[0]Н. Значение хххх:0100 означает смещение 100Н от начала сегмента кода, начинающегося по адресу хххх[0]Н.

• В82301 – машинный код, введенный по адресу CS:100.

• MOV АХ,0123 – символьная инструкция на языке Ассемблера, определенная DEBUG из машинного кода. Эта инструкция перемещает (копирует) непосредственное значение 0123Н в регистр АХ. DEBUG дизассемблировал машинный код для лучшего его понимания.

Для выполнения инструкции MOV введите команду Т и нажмите . Машинный код команды – В8 (поместить в АХ), операнд – 2301. Операция помещает 23 в младшую половину регистра (AL) и 01 – в старшую (АН).

DEBUG выводит результаты выполнения – эффект, оказанный операцией на содержимое регистров. Регистр IР содержит теперь 0103Н (0100Н плюс 3 байта – длина выполненной инструкции). Это значение указывает на адрес, по которому расположена следующая подлежащая выполнению инструкция, то есть:

хххх:0103 052500 ADD AX,0025

Для выполнения этой инструкции вновь введите Т. Инструкция добавит 25Н к младшему байту (AL) регистра АХ и 00Н – к старшему (АН), то есть добавит 0025Н к содержимому АХ. Теперь АХ содержит 0148Н, a IP – 0106Н, указывая на следующую инструкцию, которую необходимо выполнить:

xxxx:0106 8BD8 MOV AX,BX

Вновь введите команду Т. Инструкция MOV заносит содержимое регистра АХ в регистр ВХ. После выполнения инструкции ВХ содержит 0148Н. АХ все еще хранит 0148Н, поскольку инструкция MOV копирует данные, не удаляя их из источника.

Теперь последовательно вводите команды Т для выполнения оставшихся инструкций. Инструкция ADD суммирует содержимое регистров АХ и ВХ, записывая значение 0290Н в регистр ВХ. Затем программа копирует содержимое ВХ в СХ, вычитает АХ из СХ и вычитает АХ из самого себя. Последняя инструкция очищает АХ, устанавливая его в 0, и устанавливает флаг ZF из NZ (nonzero – не нуль) в ZR (zero – нуль), отображая результат операции.

Инструкция JMP устанавливает IP в 100Н, и обработка возвращается обратно к началу программы. Эта инструкция введена из соображений предосторожности, поскольку за последней введенной инструкцией следует "мусор", который при попытке выполнения мог бы вызвать останов процессора или другие нежелательные результаты.

Регистры DS, ES, SS и CS содержат один и тот же адрес сегмента. Это потому, что DEBUG рассматривает весь введенный код как программу .СОМ, хранящую данные, стек и код в одном сегменте, хотя вы и храните их по отдельности внутри сегмента. При написании программы .ЕХЕ стек, данные и код хранятся в отдельных сегментах с разными адресами.

Для повторного выполнения программы введите еще раз команду Т, DEBUG выполнит инструкцию JMP и перейдет к началу введенной программы.

2.2.12. Просмотр содержимого памяти

Для просмотра программы на машинном языке в сегменте кода запросите вывод информации командой D CS:100. Результаты выполнения этой команды представляются строками с 16 байтами (32 шестнадцатеричными разрядами) в каждой строке. Справа – ASCII представление (если соответствующий символ можно вывести) каждого байта. В случае машинного кода ASCII представление бессмысленно и может игнорироваться.

Первая строка начинается со смещения 100Н в сегменте кода и содержит байты с адресами от CS:100H до CS:10FH. Вторая строка выводит байты с адресами от CS:110H до CS:11FH. Хотя введенная программа заканчивается байтом с адресом CS:111H, DEBUG автоматически выводит восемь строк – от CS:100H до CS:170H. В этом примере все данные, следующие за CS:111H – "мусор".

Введите Q для завершения работы с DEBUG или начните выполнение следующего упражнения.

2.2.13. Использование ранее определенных данных

Предыдущий пример использовал непосредственные данные, определенные прямо в директивах MOV и ADD. В этом примере данные (числовые константы 0123Н и 0025Н) определены в виде отдельных элементов данных в программе. Инструкции программы должны работать с ячейками памяти, содержащими эти значения.

Этот пример показывает, как компьютер получает доступ к данным с помощью адреса в регистре DS и смещений. В примере, начиная с адреса DS:0200H, определены следующие элементы данных.
Смещение в сегменте DS Шестнадцатеричный код содержимого
0200H 2301Н

0202H 2500Н

0204H 0000Н

0206H 2А2А2АН

Шестнадцатеричная цифра занимает полбайта, поэтому, например, 23Н хранится в байте с адресом 200Н, а 01H – в следующем (со смещением 201Н). Ниже приведены машинные инструкции, обрабатывающие эти данные, со значениями, введенными в обратной (с переставленными байтами) форме.

Инструкция Объяснение

А10002 Поместить слово (2 байта), начинающееся с адреса DS:0200H, в

регистр АХ

03060202 Добавить содержимое слова (2 байта), начинающегося с адреса

DS:0202H, к содержимому регистра АХ

A30402 Поместить содержимое АХ в слово, начинающееся с адреса

DS:0204H

EBF4 Перейти к началу программы




Две инструкции по перемещению данных имеют разные машинные коды: А1 и A3. Действительный машинный код инструкции MOV зависит от регистров, на которые ссылается инструкция, размера элемента данных (байт или слово), направления передачи данных (в регистр или из регистра) и того, ссылается инструкция на непосредственные данные, адрес в памяти или регистр.

2.2.14. Ввод инструкций и данных программы

Используйте программу DEBUG для ввода и выполнения программы этого примера. Сначала с помощью команды Е введите инструкции, начиная с адреса CS:0100:

Е CS:100 A1 00 02 03 06 02 02 (и нажмите )

Е CS:107 A3 04 02 ЕВ F4 (и нажмите )

Теперь (также при помощи команды Е) введите соответствующие значения в ячейки сегмента данных:

Е DS:0200 23 01 25 00 00 00 (и нажмите )

Е DS:0206 2А 2А 2А (и нажмите )

Первая команда Е сохраняет три слова (6 байт) в начале области данных – начиная со смещения 0200Н. Все эти слова должны быть введены в форме с переставленными байтами, то есть 0123 как 2301 и 0025 как 2500. Когда в дальнейшем инструкция MOV запросит эти слова из памяти, байты будут переставлены опять, образуя исходные значения.

Вторая команда Е вводит в память три символа звездочки (***) в виде кода 2А2А2А. Вы сможете их увидеть в виде символов с помощью команды D.



Для просмотра данных в сегменте (со смещениями от 0200Н до 0208Н) и инструкций в сегменте CS (от 0100Н до 010АН) введите следующие команды D:

Для просмотра кода: 100,10A

Для просмотра данных: 200,208

2.2.15. Выполнение инструкций программы

Введя инструкции, можно выполнять их тем же способом, что и в предыдущем примере. Сначала убедитесь, что IР содержит 0100Н. После этого командой R просмотрите содержимое регистров, флагов и код первой инструкции. Хотя АХ может все еще содержать значение, присвоенное ему в предыдущем примере, оно скоро будет заменено новым. Первая показанная инструкция

хххх:0100 А10002 M0V АХ,[0200]

CS:0100 указывает на первую инструкцию, А10002. DEBUG интерпретирует эту инструкцию как MOV и определяет, что она ссылается на ячейку со смещением [0200Н] в сегменте DS. Квадратные скобки указывают, что это не непосредственное значение, а адрес в памяти. (Непосредственное значение для записи в АХ выглядело бы как MOV AX,0200.)

Теперь введите команду Т. Инструкция выполняется и помещает значение слова со смещения 0200Н в регистр АХ. Содержимое этого слова – 2301Н, а инструкция переставляет байты и помещает его в регистр АХ в виде 0123Н, стирая любое предыдущее значение.

Введите вторую команду Т. Будет выполнена следующая инструкция, т.е. ADD. Операция добавляет значение из слова по адресу DS:0202H к значению регистра АХ. Результат – сумма 0123Н и 0025Н, то есть 0148Н.

Следующая инструкция – MOV [0204],АХ. Введите Т для ее исполнения. Инструкция копирует значение из регистра АХ в слово в памяти, занимающее ячейки с адресами 0204Н и 0205Н. При этом байты будут переставлены, и слово будет содержать значение 4801Н. Для просмотра изменившегося содержимого ячеек памяти введите команду

D DS:200,208

Выведенные значения должны быть такими:

Значение в ячейке: 23 01 25 00 48 01 2а 2а 2а

Смещение: 200 201 202 203 204 205 206 207 208

Левая сторона дисплея показывает действительный машинный код так, как он хранится в памяти. Правая сторона помогает легко находить символьные данные. Эти шестнадцатеричные значения представлены в правой части экрана соответствующими им символами ASCII. Коды 23Н и 25Н выводятся как # (символ номера) и % (символ процента) соответственно. Три байта 2АН выводятся как три звездочки (*).

Можно завершить работу с DEBUG командой Q или перейти к выполнению следующего примера.

2.2.16. Повторное выполнение инструкций

Иногда необходимо вручную установить значение в регистре IP. Делается это так.

  1. Введите команду R IP для вывода содержимого регистра IP.

  2. Введите значение 100 (или адрес другой инструкции), а затем нажмите .

Эта процедура возвращает к началу программы (или к инструкции внутри программы), и можно повторно выполнить уже пройденные шаги. Введите команду R (без IP). DEBUG выведет на экран содержимое регистров, флаги и следующую подлежащую выполнению инструкцию. Теперь можно использовать команду Т для повторного выполнения инструкций. Если программа накапливает значения, используйте команду Е для очистки ячеек памяти и команду R для очистки регистров.

2.2.17. Сохранение программы в DEBUG

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

1. Для получения с диска существующей программы, внесения в нее изменений и последующего сохранения.

2. Для создания при помощи DEBUG маленькой программы в машинных кодах, которую нужно сохранить.

За детальным объяснением обращайтесь к описанию команды W (write -записать) в приложении 1.

На данном этапе может оказаться полезной команда Н, складывающая и вычитающая шестнадцатеричные числа. Максимальная длина чисел – 4 шестнадцатеричных разряда. Например, введите команду Н 3443 2А2В. Команда выведет сначала сумму (5Е6Е), а затем – разность (0А18).

2.2.18. Программа на языке Ассемблера

DEBUG также можно использовать для ввода программ на языке Ассемблера. Рассмотрим команды DEBUG А и U, используемые для ввода выражений на языке Ассемблера в компьютер.

2.2.18.1. Команда A (Assemble)

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

А 100

DEBUG выведет адрес сегмента кода и смещения (01 ООН) в виде хххх:0100. Введите следующие инструкции:

MOV CL,42

MOV DL,2A

ADD CL,DL

JMP 100

После ввода программы нажмите еще раз для выхода из команды А. Это нажатие указывает DEBUG, что вы больше не собираетесь вводить символьные инструкции. По завершении ввода DEBUG показывает адрес каждой введенной инструкции:

xxxx:0100 MOV CL,42

хххх:0102 MOV DL,2A

хххх:0104 ADD CL,DL

хххх:0106 JMP 100

хххх:0108

Перед выполнением программы воспользуйтесь командой U (Unassemble – дизассемблировать) для просмотра созданного DEBUG машинного кода.

2.2.18.2. Команда U

Команда U выводит на дисплей машинный код, соответствующий введенным символьным инструкциям. Можно использовать эту команду для указания первой и последней инструкций, которые нужно просмотреть, т.е. в данном случае это 0100Н и 0107Н. Введите команду

U 100,107

На экран будут выведены колонки адресов, машинных и символьных кодов, выглядящие приблизительно следующим образом:

xxxx:0100 B142 MOV CL,42

хххх:0102 В22А MDV DL,2A

хххх:0104 00D1 ADD CL,DL

хххх:0106 EBF8 JMP 100

хххх:0108

Теперь отследите выполнение машинного кода введенной программы. Начните с ввода команды R для просмотра содержимого регистров (IР должен содержать значение 0100Н) и следующей выполняемой инструкции (MOV CL,42). Затем последовательно вводите команды Т для выполнения инструкций. Когда дойдете до JMP 100, IР должен содержать 0106Н, a CL – 6СН.

2.2.19.Использование инструкции INT

Следующие четыре примера показывают, как запрашивать информацию о системе. Для этого можно использовать инструкцию INT (interrupt – прерывание), которая осуществляет выход из программы, вызов подпрограммы DOS или BIOS, выполнение заданной функции и возвращение в программу. Есть разные типы операций INT, некоторые из них требуют наличия кода функции (function code) в регистре АН для выполнения определенного действия. Вместо использования команды Т для пошагового исполнения программ, используется команда Р (Proceed – продолжить) для выполнения всей программы обработки прерывания сразу. Убедитесь, что IP установлен в 0100Н.

2.2.20. Получение текущих значений даты и времени

Инструкция для получения текущих значений даты и времени – INT 21H, с кодом функции 2АН. Снова введите в DEBUG команду А 100, а затем - следующие инструкции:

M0V АН,2А

INT 21

JMP 100 ,

Введите R для просмотра регистров и Т для выполнения инструкции MOV. После этого введите Р для выполнения подпрограммы обработчика прерываний; выполнение остановится на инструкции JMP. Регистры будут содержать в шестнадцатеричной форме следующую информацию:

AL: день недели, где 0 = воскресенье

СХ: год (например, 07D7H = 2007)

DH: месяц (от 01Н до 0СН)

DL: день месяца (от 01H до 1FH)

Операция для получения текущего времени – INT 21H с кодом функции 2СН. Сначала используйте команду R IP для установки IP в 0100Н, а затем введите следующие команды:

А 100

MOV АН,2С

INT 21

JMP 100

Выполните программу так же, как и предыдущую. Операция помещает число часов в СН (в 24-часовом формате, где 00 – полночь), минуты – в CL, секунды – в DH и сотые доли секунды – в DL.

2.2.21. Определение установленного оборудования

В одном из упражнений в начале работы просматривалось содержимое байтов с адресами 410Н и 411H, для определения оборудования, присутствующего в системе. BIOS содержит прерывание, INT 11H, помещающего соответствующую информацию в АХ. Введите команду А 100 в DEBUG и следующие инструкции:

INT 11

JMP 100 ,

Введите R для просмотра регистров и первой инструкции. Эта инструкция, INT 11H, передает управление подпрограмме BIOS, помещающей данные об установленном оборудовании в АХ. Используйте команды Т для наблюдения за последовательным выполнением инструкций BIOS.

Инструкции, содержащиеся в BIOS вашего компьютера, могут отличаться от приведенных ниже – в зависимости от установленной марки и версии BIOS.

JMP EE53

PUSH DS ; Сохранить адрес из DS в стеке

M0V АХ,0040 ; Получить адрес сегмента,

MOV DS,АХ ; поместить его в DS

MOV АХ,[0010] ; Поместить данные из 40:10 в АХ

POP DS ; Восстановить адрес в DS из стека

IRET ; Вернуться в исходную программу

Последняя команда Т производит выход из BIOS и возвращает управление DEBUG. Если все выполнено правильно, АХ теперь содержит данные об установленном оборудовании. Введите Q для выхода или переходите к следующему примеру (установив IР в 0100Н).

2.2.22. Использование INT для вывода на дисплей

Этот пример, выводящий данные на экран, вводит в употребление несколько новых возможностей. Введите в DEBUG команду А 100, а затем – следующие инструкции:

100 MOV АН,09

102 MOV DX,109

105 INT 21

107 JMP 100

109 DB ‘your name’, ‘$’

Две инструкции MOV указывают INT 21H организовать вывод на экран (АН = 09Н) и с какого начального адреса (DX = 109). По смещению 109Н начинается строка, где DB означает "define byte" – "определить байт". Символы, подлежащие выводу, заключены в апострофы ('). За строкой, которую необходимо вывести, следует знак доллара ($), также заключенный в апострофы, указывающий INT на конец вывода.

Введите R для выполнения просмотра регистров и первой инструкции, две команды Т – для выполнения двух инструкций MOV, и Р – для выполнения INT 21Н, и на экране увидите строку, заключенную в апострофы. Введите Q для выхода или переходите к следующему примеру (установив IP в 0100Н).

2.2.23. Использование INT для ввода с клавиатуры

Этот пример, воспринимающий символы с клавиатуры, также демонстрирует новые возможности. Введите команду DEBUG A 100 и следующие инструкции на Ассемблере:

100 MOV АН,10

102 INT 16

104 JMP 100 ,

Первая инструкция, MOV, указывает код функции, 10Н, задающий использование INT 16H для ввода с клавиатуры. При выполнении инструкций обработчиком с клавиатуры считывается символ и помещается в регистр AL. Введите для просмотра регистров и следующей инструкции, и Т – для выполнения инструкции MOV. Затем введите Р для выполнения INT 16H, после чего система будет ожидать нажатия клавиши. Если вы нажмете клавишу 1, вы увидите, что в AL помещено число З1H(это ASCII-код цифры 1). Введите Т для выполнения инструкции JMP 100, затем еще раз Т – для выполнения MOV АН,10. Когда вы введете Р для выполнения INT 16H, система вновь будет ожидать нажатия клавиши. Если вы нажмете 2, то увидите, что в AL занесено значение 32Н. Можно продолжать ввод до бесконечности, следуя только что описанной процедуре. Введите Q для выхода или переходите к следующему примеру (установив IP в 0100Н).

2.2.24. Использование оператора PTR

В предыдущих примерах, помещавших данные в регистр, DEBUG мог определить, исходя из типа регистра (AL или АХ, например), сколько байтов необходимо переместить. Приведенная ниже программа помещает непосредственные данные в память. Поскольку инструкция вроде MOV [120],25 не указывает количества байт, для этой цели можно использовать оператор PTR. Вот инструкции программы:

100 MOV AX,[11A]

103 ADD AX,[11C].

107 ADD AX,25

10А MOV [11Е],АХ

10D MOV WORD PTR [120],25

113 MOV BYTE PTR [122],30

118 JMP 100

11A DB 14 23

11C DB 05 00

11E DB 00 00

120 DB 00 00 00

Ниже приведено описание инструкций.

100: Поместить содержимое ячеек памяти 11АН и 11ВН в АХ. Квадратные скобки указывают на то, что операнд - адрес в памяти, а не непосредственное значение.

103: Добавить содержимое ячеек памяти 11СН и 11ВН к АХ.

107:Добавить непосредственное значение 25Н к АХ.

10А: Поместить содержимое регистра АХ в ячейки памяти с адресами 11EH и11FH.

10D: Поместить непосредственное значение 25Н в ячейки памяти 120Н и 121Н. Оператор WORD PTR, указывает DEBUG, что значение 25Н должно быть помещено в слово в памяти. Если записать данную инструкцию в виде MOV [120],25, DEBUG не смогла бы определить, какая длина выделенного участка памяти подразумевалась, и вывела бы сообщение об ошибке.

113: Поместить непосредственное значение 30Н в ячейку памяти по адресу 122Н. На этот раз используется оператор BYTE PTR для указания длины в 1 байт.

11А: Определить значения байт 14Н и 23Н. DB определяет байты для элементов данных, на которые инструкции (например, первая) ссылаются.

11С, 11Е, и 120: Определить другие значения, используемые в программе.

Для ввода этой программы сначала введите команду DEBUG A 100, а затем последовательно введите все инструкции (но не адреса, с которых начинаются строки). В конце еще раз нажмите клавишу для завершения ввода. Для выполнения программы сначала воспользуйтесь командой R для просмотра состояния регистров и первой инструкции, а затем используйте последовательность команд Т. Остановите выполнение, когда дойдете до команды JMP 100 по адресу 118Н. Командой D просмотрите содержимое области памяти программы и убедитесь, что изменилось содержимое АХ (23ЗН) и ячеек памяти с адресами 11EH-11FH (ЗЕ23), 120Н-121Н (2500) и 122Н (30). Введите Т для повторения программы или Q – для выхода.

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

1. Область видеопамяти (Video Display Area) для цветного монитора в текстовом режиме начинается с адреса В800[0]. (а) Используйте команду DEBUG D для просмотра этой области памяти. Заметьте, что за каждым символом в этой области следует байт атрибутов (07Н для черно-белого режима). Используйте дополнительные команды D для просмотра всей области видеопамяти. (б) Используйте команду DEBUG F (Fill – заполнить) для вывода на экран 50 звездочек (символов * – код 2АН). Например, следующая команда заполняет всю видеопамять 4000 (FA0H) сердечками (03) и атрибутами (где 16H соответствует коричневым символам на синем фоне):

F B800:0 LFA0 03 16.

2. Рассмотрим следующие инструкции машинного языка:

В0 1С D0 E0 ВЗ 12 F6 ЕЗ ЕВ F6

Эти инструкции выполняют следующие действия.

(а) помещают 1СН в регистр AL,

(б) смещают регистр AL на один бит влево (эквивалент умножения на 2),

(в) помещают 12Н в регистр BL,

(г) умножают AL на BL.

Используйте команду DEBUG E для ввода этой программы, начиная с адреса CS:100. Затем введите D CS:100 для просмотра введенного кода. После этого введите R и последовательными командами Т выполните программу до достижения инструкции JMP. Каков конечный результат в регистре АХ?

3. Используйте DEBUG для ввода следующей программы в машинных кодах:

Код (с адреса 100Н): А0 00 02 D0 E0 F6 26 01 02 A3 02 02 90

Данные (с адреса 200Н): 1E 16 00 00

Эта программа выполняет следующие действия: (а) помещает значение байта DS:0200H (1E) в регистр AL; (б) сдвигает содержимое AL на один бит влево; (в) умножает AL на байт, содержащийся в ячейке с адресом DS:0201H (16), (г) помещает произведение из АХ в слово, начинающееся с адреса DS:0202H.

Введите команды D для просмотра введенных кода и данных. После этого введите команду R и последовательными командами Т выполните программу до достижения инструкции JMP. Каков конечный результат в регистре АХ? Введите еще одну команду D DS:0200 и посмотрите, в каком виде произведение хранится в памяти.

4. Для пункта 2, введите команды, записывающие программу на диск под именем HEXMULT.COM (см. приложение 1).

5. Используйте команду DEBUG А для ввода следующих инструкций:

MOV DX,2E

ADD DX,IF

SHL DX,01

SUB DX,BA

JMP 100.

Дизассемблируйте эти инструкции и проследите их выполнение вплоть до JMP, и просмотрите значение в регистре DX после выполнения программы.

6. Используйте DEBUG для создания и выполнения программы, выводящей на экран фразу "Coffee Break". Начните с А 100 для ввода инструкций и с А 120 для ввода фразы (не забудьте про ограничитель $).

7. Используйте DEBUG для создания и запуска программы, запоминающей три введенных с клавиатуры символа и выводящей их на экран.

(а) Начните с А 100.

(б) Используйте INT 16 для помещения символа в AL и скопируйте его из AL в ячейку с адресом [200].

(в) Опять используйте INT 16 для помещения символа в AL и скопируйте его из AL в ячейку с адресом [201].

(г) В третий раз используйте INT 16 для помещения символа в AL и скопируйте его из AL в ячейку с адресом [202].

(д) Используйте команду Е 123 '$' для установки ограничителя $ после трех введенных символов.

(е) Наконец, используйте INT 21 для вывода символов.

4. Требования к отчету

Отчет по лабораторной работе должен содержать:

а) титульный лист;

б) условие задания;

в) текст программ на языке Ассемблера;

г) ответы на контрольные вопросы.

5. Контрольные вопросы

1. Объясните назначение следующих команд DEBUG: (а) А, (б) U, (в) Р, (г) Т, (д) Q, (e) D, (ж) R, (з) Е.

2. Укажите команды DEBUG, с помощью которых можно сделать следующее.

(а) Просмотреть содержимое всех регистров.

(б) Просмотреть содержимое регистра IP и установить его в 0100Н.

(в) Просмотреть данные, хранящиеся в памяти, начиная со смещения 2ВСН в сегменте данных.

(г) Просмотреть данные, находящиеся в памяти, начиная с ячейки с адресом 3AFH. (Замечание: разделите этот адрес на части, соответствующие сегменту и смещению.)

(д) Дизассемблировать символьный код по адресам от 100Н до 12ВН.

(е) Ввести 24А63ВН в сегмент данных, начиная с адреса 18АН.

3. Укажите машинный код, выполняющий следующие действия: (а) прибавление непосредственного значения 03А8Н к АХ, (б) помещение значения 2СА4Н в регистр АХ.

4. Предположим, введена такая команда DEBUG:

Е CS:100 B8 45 01 05 25 00

Значение 45 на самом деле должно было быть 54. Укажите команду, изменяющую только этот байт, которая исправляет сделанную ошибку.

5. Предположим, что в DEBUG введена следующая команда:

Е CS:100 B8 05 1В 05 00 2С ЕВ F8

(а) Какие три символьных инструкции здесь закодированы? (Первая программа в работе содержит подсказку.)

(б) При исполнении этой программы вы обнаруживаете, что в регистр АХ помещается значение 4705 вместо ожидаемого 0547. В чем состоит ошибка и как ее исправить?

(в) Исправив ошибку, нужно повторно выполнить программу, начиная с первой инструкции. Какие команды DEBUG необходимо использовать?

6. Каково назначение инструкции INT?

ЛАБОРАТОРНАЯ РАБОТА № 2
  1   2   3   4   5   6

Добавить документ в свой блог или на сайт

Похожие:

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconЛекция 1
Молчанов А. Ю. Системное программное обеспечение. Лабораторный практикум: – спб.: Питер, 2005. – 284 с

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconУчебной дисциплины системное программное обеспечение для специальности 2201
Цель курса «Системное программное обеспечение» дать обучающимся по специальности 2201 «Вычислительные машины, комплексы, системы...

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconПрограмма вступительного экзамена по специальной дисциплине на основную...
«Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей»

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconПояснительная записка Лабораторный практикум разработан в соответствии...
Настоящей лабораторный практикум ориентирован на помощь студентам в выполнении лабораторных работ на учебном занятии, а также самоконтроль...

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconПрограмма дисциплины лабораторный практикум по финансовому учету
Дисциплина «Лабораторный практикум по финансовому учету» является составной частью учебного процесса, позволяющей завершить подготовку...

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconИнструментарий веб-разработчика: Apache, php, Mysql, phpMyAdmin Лабораторный...
Инструментарий веб-разработчика: Apache, php, Mysql, phpMyAdmin: Лабораторный практикум по дисциплине «Сети ЭВМ и телекоммуникации»...

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconКовязин А., Востриков С. Мир InterBase. Учебно-справочное издание
Системное программное обеспечение. Учебник для вузов/ А. Гордеев, А. Молчанов, спб.: Питер, 2007. 736 с

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconК. В. Новиков лабораторный практикум по курсу «системы управления медицинскими базами данных»
Новиков К. В. Лабораторный практикум по курсу «Системы управления медицинскими базами данных» (для студентов специальностей 200401,...

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconРабочая программа учебной дисциплины «Системное программное обеспечение»
Рабочая программа, методические указания и контрольные задания для студентов специальности

Задачах программирования лабораторный практикум по дисциплине «Системное программное обеспечение» iconКурсовая работа на тему: «Организация файловых систем в ос debian...
Среди наиболее перспективных на данный момент файловых систем можно назвать ext3fs, которая во многих дистрибутивах является базовой,...

Вы можете разместить ссылку на наш сайт:


Литература


При копировании материала укажите ссылку ©ucheba 2000-2015
контакты
l.120-bal.ru
..На главную