Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KursPr.DOC
Скачиваний:
0
Добавлен:
15.09.2019
Размер:
322.56 Кб
Скачать

3 Описание реализации программного продукта

3.1 Общие сведения

Разработанный язык ассемблер предоставляет программисту полный набор команд для написания программ для заданного процессора. Он позволяет делать внешние метки и внешние переменные.

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

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

3.2. Функциональное назначение

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

3.3 Входные данные

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

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

Он игнорирует регистр символов в программе. Таким образом идентификаторы, например, LabeL и label или MOV и mov считаются одинаковыми.

Каждая строка файла содержит одну команду и имеет следующий формат:

<команда> <Param1>, <Param2>

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

<название метки/переменной>: [<размер в байтах>].

Если <размер в байтах> задан, то эта строка считается переменной, которой отводится заданное в команде количество байт памяти, если же <размер в байтах> не задан, то эта строка идентифицируется как обыкновенная метка, используемая для команд перехода.

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

Два и более пробелов подряд в командах игнорируются и урезаются транслятором до одного.

В программах могут использоваться вводимые программистом идентификаторы для описания меток и переменных. Идентификаторы могут состоять из букв и цифр. Цифры используются для задания численных констант. Любая отдельная комбинация цифр будет принята транслятором за числовую константу, записанную в десятичной форме.

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

3.4 Выходные данные

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

Объектный файл имеет следующую структуру:

<2 байта> общее кол-во меток

<256 байт> название метки_1

<2 байта> смещение метки_1 от начала файла, если метка_1 определена

-1, если метка_1 не определена

<256 байт> название метки_2

<2 байта> смещение метки_2 от начала файла, если метка_2 определена

-1, если метка_2 не определена

<…>

<256 байт> название метки_N

<2 байта> смещение метки_N от начала файла если метка_N определена

-1, если метка_N не определена

<2 байта> общее кол-во команд

<3 байта> команда_1

<3 байта> команда_2

<…>

<3 байта> команда_N

<2 байта> общее количество байт занимаемой памяти

3.5 Описание структур данных

В процессе компиляции кросс-ассемблер используют следующие структуры данных.

CString Command[3]; // Структура для хранения команды

Int AddressesList[FFFFh]; // Структура для хранения адресов меток

Int CommandsList[FFFFh]; // Структура для хранения последовательности команд

Для хранения списка меток использована стандартная в Wisual C++ структура CString.

3.6 Описание процедур и функций

В программном продукте реализованы и используются следующие процедуры и функции:

CString IntToStr(int I); // Переводит число в строку

int StrToInt(CString S); // Переводит строку в число

BOOL IsNumber(CString S); // Проверяет, является ли параметр число

BOOL IsAddress(CString S); // Проверяет, является ли параметр адресом

BOOL IsRegister(CString S); // Проверяет, является ли параметр регистром

BOOL IsLabel(CString S); // Проверяет, является ли параметр меткой

int AddToTable(CString S); // Добавляет при необходимости метку в таблицу меток и возвращает ее номер в таблице

void Parse(CString S); // Разбивает строку ассемблерного файла на команду и ее параметры

Command *Command(CString S1, CString S2, CString S3); // Разбирает переданную команду и возвращает ее в полном формате команды

void SaveToFile(CString FileName); // В трансляторе – сохраняет результат работы в объектный файл, в линковщике – сохраняет результат работы в исполняемый файл

void LoadFromFile(CString FileName); // Загружает объектный файл для линковки

void Link(); // Связывает объектные файлы, пересчитывая при этом адреса меток/переменных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]