- •1 Постановка задачи
- •2 Форматы команд
- •3 Описание метода решения
- •4 Описание структур данных
- •5 Описание алгоритма
- •6 Описание программы
- •6.1 Назначение программы
- •6.2 Требования к программному и техническому обеспечению Программа разработана на языке Java.
- •6.6. Загрузка программы
- •7 Тестирование программы
- •Заключение
- •Литература
3 Описание метода решения
Транслятору необходимо:
- выявить ошибки в исходной программе;
- распределить память;
- перевести на машинный язык команды мнемокода и константы;
- сформировать объектный код программы;
- сформировать протокол трансляции (листинг).
При первом просмотре выявляются имена переменных и распределяется память; а при втором - генерируются коды команд, оформляется объектный код и листинг.
В ходе трансляции ассемблер использует ряд таблиц:
таблица форматов команд – содержит мнемоники команд, их коды, тип операндов и размер кода;
таблица регистров – содержит имена регистров и их коды;
таблица адресации – содержит тип адресации и их коды;
таблица адресации – содержит используемые директивы;
таблица ошибок – содержит возможные ошибки и их коды;
таблица символических имен( ТСИ ) – содержит переменные и метки, используемые в программе, и их адреса;
таблица кода – в данную таблицу записываются строки, которое успешно прошли первый проход – проверку синтаксиса и вычисление адресов меток и переменных.
Результатом работы транслятора с языка Ассемблер являются листинг и объектный код. Причем, если объектный код формируется только при отсутствии ошибок в тексте исходной программы, то листинг формируется в любом случае.
Листинг содержит не только исходный текст, но и, в случае отсутствия ошибок, машинный код команды в шестнадцатеричном формате. Если же в исходном тексте команды есть ошибки, то объектный код команды не может быть сформирован, а листинг содержит подробную информацию об ошибках.
Структурная схема алгоритма работы транслятора представленна на рис3.1.
Рисунок 3.1 – Функциональная схема работы
4 Описание структур данных
Для хранения данных в процессе работы транслятора использованы следующие основные структуры данных:
TFK – таблица форматов команд, состоит из следующих полей:
Мнемокод – содержит мнемоника команды;
Код – содержит воичный код команды;
Байт W – содержит значения байта W команды;
Доп.байт – содержит дополнительные байты, в которых могут хранится поле регистров, поле mod, поле данных и поле адреса;
Тип – содержит тип операндов;
Размер – содержит размер кода команды.
TR – таблица регистров, состоит из следующих полей:
Имя – содержит имя регистра;
Код – содержит код регистра;
Размер – содержит размер регистра.
TA - таблица адресации, состоит из следующих полей:
Тип – содержит тип адресации в памяти;
Код – содержит код данного типа адресации.
errors – массив возможных ошибок.
Code – таблица кода, содержит следующие поля:
Метка – содержит метку команды;
Мнемокод – содержит мнемокод команды;
Директива – содержит имя директивы;
Операнд 1 – содержит 1 операнд операции;
Операнд 2 – содержит 2 операнд операции;
Данные – содержит данные для директив DB и DW
Длина – содержит длину кода команды;
Тип – содержит тип операндов.
5 Описание алгоритма
В данной курсовой работе реализован двухпроходной транслятор программы на языке ассемблер. В первом проходе проверяется правильность синтаксиса, строится таблицы переменных и меток, используемых в программе, вычисляются размеры команд и всего кода.
Во втором проходе производится перевод команд языка ассемблера в машинный код, формируется объектый код и файл-листинг.
Общий алгоритм программы можно разделить на несколько частей:
Загрузка очередной строки;
Проверки синтаксиса команды\директивы;
Перевод в машинный код;
Формирование листинга и объектного кода.
Алгоритм загрузки очередной строки:
Считывания очередной строки из исходного файла;
Если строка содержит директиву END – прекратить дальнешую обработку строк;
Запуск проверки синтаксиса;
Если все строки считаны – запуск перевода в машинный код.
Алгоритм проверки синтаксиса команд\директив:
Разделение строки на поля по пробелу в качестве разделителя, сохранение их в массиве полей fields;
Если директива END – значения операнда сохранит в качестве точки входа, если эта метка есть в ТСИ;
Если первое поле метка и её нет в ТСИ – добавить в ТСИ;
Если первое поле переменная и её нет в ТСИ - добавить в ТСИ;
Если очередное поле (первое, если метки\переменной не было и второе в другом случае) – мнемоника, то:
Если первый операнд – регистр (есть в таблице регистров):
Если второй операнд содержит директиву OFFSET – тип операндов Р,НО8 или Р,НО16 – взависимости от размера регистра первого операнда;
Если второй операнд – “1”– тип операндов Р8 или Р16;
Если второй операнд – регистр – тип операндов Р,Р8 или Р,Р16;
Если второй операнд – память – тип операндов Р,О8 или Р,О16;
Если второй операнд – непосредственный операнд – тип операндов Р,НО8 или Р,НО16;
Если второй операнд – память:
Если второй операнд – регистр – тип операндов О,Р8 или О,Р16;
Если первый операнд – ссылка – тип операндов Л;
Если первый операнд – непосредственный операнд – тип операндов НО;
Если очередное поле (первое, если метки\переменной не было и второе в другом случае) – директива, то:
Если директива DB или DW – проверить все операнды на корректность;
Если директива SEGMENT – проверить наличие метки и отсутсвие её в ТСИ;
Если директива ORG – проверить операнд, присвоить СЧАК( счетчику адреса команды) – значение операнда;
Если первой директивой была не SEGMENT – ошибка;
Вычисление размера команды;
Увеличение СЧАК;
Добавление полей в таблицу кода.
Алгоритм перевода в машинный код:
Если есть ошибки в коде – формирование листинга, завершение обработки строк;
Загрузка очередной строки из таблицы кода;
Если команда:
Загрузка полей регистров, перевод их в двоичный код;
Загрузка полей данных, перевод их в двоичный код;
Вычисление полей mod и кода адресации;
Вычисление кода команды с помошью таблицы форматов;
Если в операнда присутствуют метки или переменные – замена их на адрес, использую ТСИ;
Вычисление кода команды, перевод в шестнадцатеричный код;
Если директивы определения данных – перевод данных в шестнадцатеричный код;
Формирование карты T;
Если строки в таблице кода еще есть – п.2;
Формирование карты E;
Формирование листинга;