Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СП_курсовой.docx
Скачиваний:
2
Добавлен:
14.07.2019
Размер:
231.71 Кб
Скачать

3 Разработка отладчика

3.1 Разработка дизассемблера машинных кодов

Входными данными для отладчика является набор байт, соответствующий командам и их аргументам, который был получен транслятором и помещен в бинарный файл (*.bin). Отладчик должен считать все байты из этого файла, разместить их в ОЗУ и выполнить их. Отладчик помогает программисту проверить программу и исправить ошибки, если таковые присутствуют. Для этого отладчик должен иметь интерфейс, позволяющий прослеживать изменение всех частей программы.

Дизассемблирование выполняется за два шага (анализ двух тетрад). Алгоритм дизассемблера наглядно представлен в виде схемы на рисунке 3.1. Если распознанная команда - двухбайтная, следующий байт из машинного кода переписывается на выход дизассемблера напрямую. Процедура повторяется до тех пор, пока не будет прочитана вся память МК.

Рис 3.1 – Схема работы дизассемблера

3.2 Описание структуры отладчика

Программа разрабатывалась в среде Borland Builder на языке C++.

Основные две функции отладчика - это выполнение байт-кода и его дизассемблирование. При загрузке бинарного файла происходит последовательное считывание байт и копирование их в память программ, представляющую собой массив однобайтовых ячеек, состоящий из 4096 элементов. Память данных – массив из 64 байт. Регистры являются частью памяти данных: нулевой банк регистров занимает адреса 00-07h, первый – 18h-1Fh. Стек – набор 2-хбайтных ячеек, занимающих адреса 08h-16h памяти данных. Внешние порты также представлены ячейками размером в один байт. Флаги представляют собой один байт, биты которого соответствуют флагам процессора.

3.3 Выполнение команд

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

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

3.3 Описание интерфейса программы

Главное окно программы представлено на рисунке 3.1.

Рисунок 3.1 - Главное окно программы

Главное окно программы отладчика содержит панель выполнения команд, где указывается текущая команда. Пользователь также имеет возможность установить точку останова программы. В этом случае команда для выполнения следующей команды будет ожидать нажатие клавиши «Старт». Для обычного выполнения команд необходимо нажать клавишу «Старт». Клавиша «Шаг» инициализирует выполнение единичной команды. Клавиша «Стоп» приостанавливает выполнение команд в обычном режиме до нажатия клавиши «Старт». Кнопка «Сброс» служит для обнуления счетчика команд и установки указателя текущей команды на первую.

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

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

Имеется возможность вручную устанавливать значения флагов, регистров и портов процессора.