- •Пояснительная записка к курсовой работе (вар16)
- •2008 Оглавление
- •Задание
- •Описание синтаксиса языка в форме Бэкуса-Наура Teрминальные символы:
- •Программа
- •Оператор ввода
- •Оператор вывода
- •Оператор безусловного перехода
- •Оператор условного перехода
- •Оператор Цикла
- •Арифметические выражения
- •Переменная
- •Оператор присваивания
- •Объявления переменных, констант и типов
- •Операции входного языка и их приоритет
- •Перечисление лексем
- •Синтаксический анализ и перевод во внутреннюю форму
- •Кс-грамматика входного языка
- •Основная грамматика
- •Подграмматика составного оператора
- •Подграмматика оператора
- •Подграмматика оператора_вывода
- •Подграмматика для операторов
- •Подграмматика объявлений
- •Подграмматика объявления констант
- •Подграмматика арифметических выражений
- •Подграмматика переменной
- •Описание промежуточного языка.
- •Спецификация тетрад
- •Описание перевода (постфиксная s – атрибутная транслирующая грамматика) каждой конструкции входного языка
- •Основная грамматика
- •Подграмматика для операторов
- •Подграмматика объявления констант
- •Связь между дмп-процессорами и подграмматиками
- •Пример перехода от основной грамматики к подграмматике составного оператора Управляющая таблица основной грамматики
- •Управляющая таблица подграмматики составного оператора
- •S– атрибутный дмп процессор
- •Пример атрибутного перевода для арифметических выражений
- •Управляющая таблица подграмматики оператора
- •Управляющая таблица подграмматики оператора вывода
- •Реализация компилятора
- •Генерация ассемблерного кода
Генерация ассемблерного кода
Генерация ассемблерного кода происходит после генерации последовательности атомов.
Ассемблерный код строится по следующему шаблону:
include macro.inc
.model SMALL
.stack 100h
data segment
ticonst label word
[dw xxxx]
...
tfconst label dword
[dd xxxx.xx]
...
tvar db [max_addr] dup(?)
data ends
text segment 'code'
assume cs:text, ds:data, es:data
p386
p387
main proc far
push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
mov es, ax
call openIO
[последовательности тетрад в формате макровызова]
call closeIO
ret
main endp
text ends
end main
Сегмент данных имеет следующие метки:
ticonst– адрес начала таблицы целых констант
tfconst– адрес начала таблицы вещественных констант
tvar– адрес области переменных
[max_addr]– переменная содержит количество байт в области переменных
Процедуры (описаны в файле macro.inc):
openIO– инициализация ввода/вывода
closeIO– закрытие ввода / вывода
Каждой тетраде промежуточного языка соответствует макрокоманда.
Пример
fmatr M1[6, 6], M2[2, 2];
float k;
int i, j;
const int sz = 6;
void main()
{
for (i = 0; i < sz; i = i + 1)
for (j = 0; j < sz; j = j + 1)
scan (M1[i, j]);
k = 0;
k = det(M1);
print (k);
}
include macro.inc
.model SMALL
.stack 100h
data segment
ticonst label word
dw 6
dw 2
dw 0
dw 1
dw 24
dw 4
tfconst label dword
tvar db 172 dup(?)
data ends
text segment 'code'
assume cs:text, ds:data, es:data
p386
p387
main proc far
push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
mov es, ax
call openIO
seti tvar+164, ticonst+4
@m1: li tvar+164, ticonst+0, tvar+168
jmpf tvar+168, @m20
jmp @m7
@m4: addi tvar+164, ticonst+6, tvar+168
seti tvar+164, tvar+168
jmp @m1
@m7: seti tvar+166, ticonst+4
@m8: li tvar+166, ticonst+0, tvar+168
jmpf tvar+168, @m19
jmp @m14
@m11: addi tvar+166, ticonst+6, tvar+168
seti tvar+166, tvar+168
jmp @m8
@m14: muli tvar+164, ticonst+8, tvar+168
muli tvar+166, ticonst+10, tvar+170
addi tvar+168, tvar+170, tvar+168
scanf tvar+0, 168
jmp @m11
@m19: jmp @m4
@m20: ftype ticonst+4, tvar+168
setf tvar+160, tvar+168
det tvar+0, 6, 6, tvar+168, 0, 0
setf tvar+160, tvar+168
printf tvar+160
@m25:
call closeIO
ret
main endp
text ends
end main
