Проектирование компилятора
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
Цель работы
Изучить и понять принцип работы транслятора. Исследовать формат данных объектного файла для шестнадцатиразрядной системы DOS для последующего преобразования его в файл программы.
Расчет варианта задания производится по формуле:
компилятор программа ассемблер алгоритм
где NG - последние две цифры учебной группы; NS - номер студента в списке; KV - количество вариантов в соответствующей группе команд.
Получили следующие команды: NEG, JE, ADC, SHL, INC.
Задание: Для заданного набора команд разработать, отладить и протестировать программу - компилятор.
1. Разработка контрольного примера
.asm является программой для нахождения разницы между двумя большими числами (32 разряда). Использует все заданные команды, JE, NEG, SHL, INC и кроме того команды MOV, INT.segment; сегмент данныхdw 1001h; a1, a2, b1, b2 - исходные данныеdw 10h; с1, с2 - результат
b1 dw 0abcdhdw 20h
c1 dw 0dw 0dw 4c00h; 4ch - ф-ция выхода, 00h - код возврата
datas endssegment:cs:codes, ds:datasax, datasds, axax, a1;
movdx, a2; загрузить данные вbx, b1; регистрыcx, b2;ax;m1;dx; инверсия первого числа
m1:neg dx;di, c1; 0 -> бит CF
shldi, 1;ax, bx; сложить младшие частиdx, cx; сложить старшие части и бит CFm2c1, ax; сохранить:movc2, dx; результатax, vix; завершение
int21h; программыendsstart
Находится разница между двумя 32-разрядными операндами. Второй операнд инвертируется и складывается с первым. Операнды и результат располагаются в памяти. Базовый набор команд дополнен командами: MOV и INT, директивой - DW.
Данный контрольный пример без ошибок компилируется и линкуется стандартными компиляторами и линковщиками.
2. Описание используемых директив и команд ассемблера
: Сложение с переносом
Операция: Обычно используется при сложении многословных величин для учета бита переполнения в последующих фазах операции. Если флаг CF установлен в 1, то команда ADC сначала прибавляет 1 к операнду 1. Команда всегда прибавляет операнд 2 к операнду 1, аналогично команде ADD.
Флаги: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
Объектный код (три формата): Регистр плюс регистр или память:|000100dw|modregr/m|.: Прерывание
Операция: Прерывает выполнение программы и передает управление по одному из 256 адресов (векторов прерывания). Команда INT выполняет следующее: 1) уменьшает значение SP на 2 и заносит в стек флаговый регистр, сбрасывает флаги IF и TF; 2) уменьшает значение SP на 2 и заносит регистр CS в стек, старшее слово из вектора прерывания помещает в регистр CS; 3) уменьшает значение SP на 2 и заносит регистр IP в стек, младшее слово из вектора прерывания помещает в регистр IP.
Флаги: Команда воздействует на флаги IF и TF.
Объектный код: |1100110v|-type-| (если v = 0, то type = 3).const: Прерывание
Операция: Прерывает выполнение программы и передаёт управление по одному из 256 адресов (векторов прерывания).
Объектный код: |11001101|-type-|./JZ: Переход по равно или по нулю
Операция: Используется после проверки знаковых или беззнаковых данных для передачи управления по другому адресу. Если флаг ZF равен единице (нулевое состояние), то команда прибавляет к регистру IP значение операнда (относительное смещение) и выполняет таким образом переход.
Флаги: Не меняются.
Объектный код: |01110100|-disp-|: Пересылка данных
Операция: Пересылает один байт или одно слово между регистрами или между регистром и памятью, а также передает непосредственное значение в регистр или в память. Команда MOV не может передавать данные между двумя адресами памяти (для этой цели служит команда MOVS). Существует семь типов команды MOV.
Флаги: Не меняются.
Объектный код (семь форматов):
Регистр/память в/из регистр:
|100010dw|modregr/m|
Непосредственное значение в регистр:
|1011wreg|-data-|data если w=1|
Память в регистр AX (AL):
|1010000w|addr-low|addr-high|
Регистр AX (AL) в память:
|1010001w|addr-low|addr-high|
Регистр/память в сегментный регистр:
|10001110|mod0sgr/m| (sg - сегментный регистр): Изменение знака числа
Операция: Меняет двоичное значение из положительного в отрицательное и из отрицательного в положительное. Команда NEG вычисляет двоичное дополнение от указанного операнда: вычитает операнд из нуля и прибавляет единицу. Операндом может быть байт или слово в регистре или в памяти.
Флаги: Команда воздействует на флаги AF, CF, OF, PF, SF и ZF.
Объектный код: |1111011w|mod011r/m|: Сдвиг влево или вправо
Операция: Выполняет сдвиг битов влево.
Флаги: Команда воздействует на флаги CF, OF, PF, SF и ZF (флаг AF не определен).
Объектный код: SAL/SHL: |110100cw|mod100r/m|.
3. Алгоритмы и таблицы компилятора
Компилятор, разрабатываемый в данной курсовой, является двух-проходным. Он использует следующие системные таблицы.- таблица мнемокодов. Содержит следующие поля: name - мнемокод. SYMTAB - таблица символических имён. Содержит следующие поля: name - символическое имя; sgm - сегмент, в котором оно объявлено; dsp - смещение в сегменте. SEGTAB - таблица сегментов. Содержит следующие поля: name - имя сегмента; len - длина сегмента в байтах.
Кроме выше перечисленных таблиц, используются два временных файла предназначенных для хранения объектного код двух сегментов. Также используется таблица modif используемых ссылок (записи модификаторы).
На первом проходе происходит заполнение таблицы символических имён и таблицы используемых сегментов. Кроме того, определяются форматы команд, без чего невозможно заполнение системных таблиц. Мнемокоды обрабатываются следующим образом. Вся строка разбивается на поля. Если в строке имеется символическое имя, то оно заносится в таблицу. Далее определяется поле с мнемокодом.