Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / doc92 / курсовик.doc
Скачиваний:
39
Добавлен:
03.08.2013
Размер:
360.45 Кб
Скачать

3 Описание метода решения

Транслятору необходимо:

- выявить ошибки в исходной программе;

- распределить память;

- перевести на машинный язык команды мнемокода и константы;

- сформировать объектный код программы;

- сформировать протокол трансляции (листинг).

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

В ходе трансляции ассемблер использует ряд таблиц:

  • таблица форматов команд – содержит мнемоники команд, их коды, тип операндов и размер кода;

  • таблица регистров – содержит имена регистров и их коды;

  • таблица адресации – содержит тип адресации и их коды;

  • таблица адресации – содержит используемые директивы;

  • таблица ошибок – содержит возможные ошибки и их коды;

  • таблица символических имен( ТСИ ) – содержит переменные и метки, используемые в программе, и их адреса;

  • таблица кода – в данную таблицу записываются строки, которое успешно прошли первый проход – проверку синтаксиса и вычисление адресов меток и переменных.

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

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

Структурная схема алгоритма работы транслятора представленна на рис3.1.

Рисунок 3.1 – Функциональная схема работы

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

Для хранения данных в процессе работы транслятора использованы следующие основные структуры данных:

  1. TFK – таблица форматов команд, состоит из следующих полей:

    1. Мнемокод – содержит мнемоника команды;

    2. Код – содержит воичный код команды;

    3. Байт W – содержит значения байта W команды;

    4. Доп.байт – содержит дополнительные байты, в которых могут хранится поле регистров, поле mod, поле данных и поле адреса;

    5. Тип – содержит тип операндов;

    6. Размер – содержит размер кода команды.

  2. TR – таблица регистров, состоит из следующих полей:

    1. Имя – содержит имя регистра;

    2. Код – содержит код регистра;

    3. Размер – содержит размер регистра.

  3. TA - таблица адресации, состоит из следующих полей:

    1. Тип – содержит тип адресации в памяти;

    2. Код – содержит код данного типа адресации.

  4. errors – массив возможных ошибок.

  5. Code – таблица кода, содержит следующие поля:

    1. Метка – содержит метку команды;

    2. Мнемокод – содержит мнемокод команды;

    3. Директива – содержит имя директивы;

    4. Операнд 1 – содержит 1 операнд операции;

    5. Операнд 2 – содержит 2 операнд операции;

    6. Данные – содержит данные для директив DB и DW

    7. Длина – содержит длину кода команды;

    8. Тип – содержит тип операндов.

5 Описание алгоритма

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

Во втором проходе производится перевод команд языка ассемблера в машинный код, формируется объектый код и файл-листинг.

Общий алгоритм программы можно разделить на несколько частей:

  1. Загрузка очередной строки;

  2. Проверки синтаксиса команды\директивы;

  3. Перевод в машинный код;

  4. Формирование листинга и объектного кода.

Алгоритм загрузки очередной строки:

  1. Считывания очередной строки из исходного файла;

  2. Если строка содержит директиву END – прекратить дальнешую обработку строк;

  3. Запуск проверки синтаксиса;

  4. Если все строки считаны – запуск перевода в машинный код.

Алгоритм проверки синтаксиса команд\директив:

  1. Разделение строки на поля по пробелу в качестве разделителя, сохранение их в массиве полей fields;

  2. Если директива END – значения операнда сохранит в качестве точки входа, если эта метка есть в ТСИ;

  3. Если первое поле метка и её нет в ТСИ – добавить в ТСИ;

  4. Если первое поле переменная и её нет в ТСИ - добавить в ТСИ;

  5. Если очередное поле (первое, если метки\переменной не было и второе в другом случае) – мнемоника, то:

    1. Если первый операнд – регистр (есть в таблице регистров):

      1. Если второй операнд содержит директиву OFFSET – тип операндов Р,НО8 или Р,НО16 – взависимости от размера регистра первого операнда;

      2. Если второй операнд – “1”– тип операндов Р8 или Р16;

      3. Если второй операнд – регистр – тип операндов Р,Р8 или Р,Р16;

      4. Если второй операнд – память – тип операндов Р,О8 или Р,О16;

      5. Если второй операнд – непосредственный операнд – тип операндов Р,НО8 или Р,НО16;

    2. Если второй операнд – память:

      1. Если второй операнд – регистр – тип операндов О,Р8 или О,Р16;

    3. Если первый операнд – ссылка – тип операндов Л;

    4. Если первый операнд – непосредственный операнд – тип операндов НО;

  6. Если очередное поле (первое, если метки\переменной не было и второе в другом случае) – директива, то:

    1. Если директива DB или DW – проверить все операнды на корректность;

    2. Если директива SEGMENT – проверить наличие метки и отсутсвие её в ТСИ;

    3. Если директива ORG – проверить операнд, присвоить СЧАК( счетчику адреса команды) – значение операнда;

  7. Если первой директивой была не SEGMENT – ошибка;

  8. Вычисление размера команды;

  9. Увеличение СЧАК;

  10. Добавление полей в таблицу кода.

Алгоритм перевода в машинный код:

  1. Если есть ошибки в коде – формирование листинга, завершение обработки строк;

  2. Загрузка очередной строки из таблицы кода;

  3. Если команда:

    1. Загрузка полей регистров, перевод их в двоичный код;

    2. Загрузка полей данных, перевод их в двоичный код;

    3. Вычисление полей mod и кода адресации;

    4. Вычисление кода команды с помошью таблицы форматов;

    5. Если в операнда присутствуют метки или переменные – замена их на адрес, использую ТСИ;

    6. Вычисление кода команды, перевод в шестнадцатеричный код;

  4. Если директивы определения данных – перевод данных в шестнадцатеричный код;

  5. Формирование карты T;

  6. Если строки в таблице кода еще есть – п.2;

  7. Формирование карты E;

  8. Формирование листинга;

Соседние файлы в папке doc92