Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №5(full).docx
Скачиваний:
6
Добавлен:
07.08.2019
Размер:
169.54 Кб
Скачать

Министерство образования и науки Российской Федерации

Государственное общеобразовательное учреждение высшего профессионального образования

Пермский национальный исследовательский политехнический университет

Кафедра Автоматизации технологических процессов и производств

Отчет по лабораторной работе № 5

Знакомство с языком ассемблера и работой отладчика

Turbo Debuggеr

Выполнил

студент гр.

АТП-09

Капитонов А.А.

(подпись)

(Ф.И.О.)

Проверил

преподаватель

Вавилин А.С.

(подпись)

(Ф.И.О.)

Пермь 2011

Цель работы: научиться анализировать ход выполнения программы на языке Ассемблера при помощи отладчика Turbo Debugger.

Задание: 1. Изучите возможности отладчика Turbo Debugger.

2. Выполните трассировку программы LAB1.EXE.

3.Ответить на все приведенные ниже вопросы по каждой команде программы LAB1.

4.Ответить на контрольные вопросы.

Введение

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

Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные и непривязанные друг к другу части машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью программы-компоновщика («линкера») может быть скомпонован исполнимый файл.

Архитектура МП I808.

Структура 16-разрядного микропроцессораI8086 представлена на рис. 1.

Рис. 1. Структура 16-разрядного микропроцессора

В состав микропроцессора входят:

  1. Арифметико-логическое устройство (АЛУ), предназначенное для выполнения арифметических и логических операций;

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

  3. Устройство управления, включающее в себя:

  • буфер команд, который представляет собой регистровую память объемом 6 байт, предназначенную для хранения выполняемой в данный момент команды (аналогично регистру команд в структуре классической ЭВМ) и заполняемую очередными командами из оперативной памяти по мере своего освобождения;

  • дешифратор кода операций, определяющий тип выполняемой команды;

  • блок управления операциями, который на основании расшифрованного дешифратором кода операции формирует управляющие сигналы, организующие работу всех блоков микропроцессора;

  1. Указатель команд (IP – instruction pointer), определяющий адрес выполняемой команды в сегменте команд оперативной памяти;

  2. Регистр флагов (FLAGS), содержащий признаки результата выполненных команд и некоторую управляющую информацию. Среди признаков результата отметим следующие:

ZF – флаг нуля: равен 1 при получении нулевого результата,

SF – флаг знака: устанавливается равным старшему биту результата,

CF – флаг переноса: фиксирует факт переноса из старшего бита в арифметических операциях,

OF – флаг переполнения: устанавливается в 1 при получении результата вне допустимого диапазона чисел,

PF – флаг паритета: устанавливается в 1, если младшие 8 бит результата операции содержат четное число единиц;

к флагам управления относятся:

IF – флаг разрешения прерывания: когда флаг установлен в 1, процессор распознает маскируемые прерывания, что позволяет микропроцессору реагировать на особые ситуации, возникающие в работе внешних устройств; если значение флага равно нулю, то эти прерывания игнорируются,

DF – флаг направления, применяется в командах обработки последовательности байт в памяти: если флаг равен 0, последовательность обрабатывается с элемента, имеющего наименьший адрес; если флаг установлен в 1, последовательность обрабатывается от старшего адреса к младшему,

TF – флаг трассировки: если значение флага равно 1, то в микропроцессоре после выполнения каждой команды генерируется внутреннее прерывание, позволяющее перейти к соответствующей подпрограмме (используется при отладке программ);

  1. Блок сегментных регистров, состоящий из четырех 16-разрядных регистров, каждый из которых содержит старшие разряды базового (начального) адреса сегмента оперативной памяти, выделяемого программе при ее выполнении: кодового сегмента CS, в котором содержится код программы; сегмента данных DS; сегмента стека SS и дополнительного сегмента данных ES;

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

Знакомство с Turbo Debugger.

Данная работа предназначена для знакомства с общепринятыми приемами отладки программных приложений, а также для закрепления пройденного практического материала по курсу «Архитектура ЭВМ» и более углубленного понимания архитектуры и программной модели процессоров семейства Intel x8086. В качестве средства отладки предлагается изучить утилиту Turbo Debugger из пакета программ Borland Pascal.

Программа Turbo Debugger является мощным средством для отладки приложений DOS Real Mode, DOS Protected Mode, Windows. Turbo Debugger позволяет работать с программами типа COM и EXE. Для примера рассмотрим программу COM.

Главным отличием исполняемых модулей COM от EXE о операционной системе DOS является ограничение размера исполняемого файла. В связи с тем, что формат COM появился гораздо раньше EXE (в самой первой версии DOS), исторически сложилось так, что размер COM файла не может превышать размера одного сегмента памяти, т. е. 64 Кб. Это означает, что загружая такой исполняемый модуль в память операционная система настраивает все сегментные регистры, необходимые для корректного выполнения программы, на один и тот же сегмент. То есть, если программа была загружена по адресу 4600:0000, то прежде чем передать управление по этому адресу (например командой JMP 4600:0000), операционная система присваивает сегментным регистрам DS=ES=SS=CS=4600. Это означает, что в такой программе и данные и стек и коды команд находятся в одном сегменте.

Теперь перейдем к Turbo Debugger. Первый пункт меню File содержит стандартные элементы для выбора файла, смены текущего каталога и т. д.

Окно Turbo Debugger разбито на 5 частей. Первая – сегмент кода. Он расположен в левой верхней части (Рис. 2.)

Рис. 2 Сегмент кода.

В свою очередь окно кодового сегмента разделено на столбцы. Самый левый столбец - адрес текущей команды. Например, на Рис. 2. текущая команда (помечена синей полосой) push ds, расположен по адресу cs:0000. Это означает, что в памяти, самая первая команда располагается в сегменте CS со смещением 0h.

Второй столбец - код команды.

Третий столбец - мнемоника команды. Мнемоническая запись команд была создана как раз для того, чтобы разработчикам приложений не приходилось работать непосредственно с машинными кодами.

Обратите внимание, что следующая команда xor ax,ax, располагается по адресу cs:0001. Это объясняется тем, что предыдущая команда занимает в памяти 1 байт. Следовательно, процессор, выполнив первую команду, вычислит расположение следующей сместившись по сегменту кода на 1 байта.

В левой нижней части окна Turbo Debugger отображен сегмент данных.

Рис.3 Сегмент данных

Окно сегмента данных также разделено на три части. Сегмент данных, отображает участок памяти, начинающимся с адреса ds:0000. Участок памяти еще иначе называют дампом памяти.

Первый столбец - адрес строки байт.

Второй столбец - строка из 8 байт. Turbo Debugger в окне сегмента данных представляет дамп памяти в виде строк по 8 байт. Во втором столбце данные отображаются в виде шестнадцатеричных чисел. Первые четыре байта - CDh, 20h, FFh, 9Fh находятся соответственно по адресам ds:0000, ds:0001, ds:0002 и ds:0003. Следующая строка начинается с адреса ds:0008.

В третьем столбце те же данные отображаются в виде ASCII символов.

Как было сказано ранее, программы COM не может занимать больше одного сегмента памяти и CS=DS=SS=ES. Поэтому вы можете переместиться по сегменту данных до адреса ds:0100 и убедится в том, что по этому адресу начинается наша программа (B4 0F BA 00 B8).

В средней верхней части расположено окно регистров. В его правой части отображается состояние соответствующих регистров. Во время работы программы, если в результате выполнения какой-либо операции, связанной с окном регистров происходит какое-либо действие (например заполнение строки регистра ax значением 5В87 через команду mov ax,5B87). Окно регистров приведено ниже на рисунке 4.

Рис.4 Окно регистров.

Далее под наше рассмотрение попадает область, именуемая как регистр флагов (Рис.5).

Итак, что же это за регистр. Он 16-разрядный (16-битовый) и содержит всю необходимую информацию о состоянии процессора 8086(286) и результатах последних инструкций. Каждый бит у него флаг.

O флаг переполнения OF

D флаг направления DF