Скачиваний:
17
Добавлен:
01.05.2014
Размер:
88.06 Кб
Скачать

4. Генерация кода

4.1. Распределение памяти

Выделение памяти производится статически. Первоначально в память загружается блок переменных программы и временных переменных, затем строки, затем матрицы. Кроме того, в ходе составления выходного кода (на ассемблере) возникает необходимость в различных вспомогательных переменных и константах, которые грузятся по необходимости.

Стек

Сегмент Стека

Константы (equ)

Сегмент Данных

Переменные

Переменные для хранения промежуточных результатов

Строки

Матрицы

Подпрограммы

Сегмент Кода

Головная программа (main)

4.2. Оптимизация

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

При генерации кода вспомогательные процедуры добавляются в код не всегда, а только по необходимости (например, процедура вывода на экран числа вставляется в код, если только в промежуточном коде встречается триада WRT).

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

4.3. Перевод промежуточного языка в Assembler

Триада

Assembler

BRL

L

Jmp L

BF

L

R

Mov AX, R

CMP AX, 0

jne _lbl

jmp L

__lbl:

EQ

op1

op2

Mov AX, op1

Mov op2, AX

EQA

op1

op2

Mov BX, op2

Mov AX, op1

Mov [BX], AX

ADD

op1

op2

Mov AX, op2

Add AX, op1

SUB

op1

op2

Mov AX, op2

Sub AX, op1

MUL

op1

op2

Mov AX, op2

iMul AX, op1

DIV

op1

op2

Mov AX, op2

Cwd

iDiv op1

MOD

op1

op2

Mov AX, op2

Cwd

iDiv op1

Mov AX, DX

NEG

op1

Mov AX, op1

NEG AX

NOT

op1

Mov AX, op1

Not AX

And AX, 01h

AND

A

B

mov AX, op2

cmp AX, 0

je __lbl1

mov AX, op1

cmp AX, 0

je __lbl1

mov AX, 1

jmp __lbl2

__lbl1:

mov AX, 0

__lbl2 :

OR

op1

op2

mov AX, op2

cmp AX, 0

jne __lbl1

mov AX, op1

cmp AX, 0

jne __lbl1

mov AX, 0

jmp __lbl2

__lbl1:

mov AX, 1

__lbl2 :

REL

b

(REL in [<,>,>=,<=,=,<>])

mov AX, op2

cmp AX, op1

jXX __lbl1

mov AX, 0

jmp __lbl2

__lbl1:

mov AX, 1

__lbl22 :

(jXX in [jg,jl,jge,jle,je,jne])

5. Список литературы

  1. Ахо, Альфред, В., Сети, Рави, Ульман, Джеффри, Д. Компиляторы: принципы, технологии и инструменты.:Пер. с англ. – М.:Издательский дом «Вильямс», 2001. - 768 с.:ил.

  1. Опалева Э.А., Самойленко В.П. Языки программирования и методы трансляции. – СПб.:БВХ-Петербург, 2005. – 480 с.:ил.

  1. Юров В. Assembler – СПб: Издаельство “Питер”, 2000. – 624 с.:ил.

35

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