Курсовая работа. / РЯП_Ксю / Other / Bosk_tjp / report / !_Rep_4_ген_код
.doc4. Генерация кода
4.1. Распределение памяти
Выделение памяти производится статически. Первоначально в память загружается блок переменных программы и временных переменных, затем строки, затем матрицы. Кроме того, в ходе составления выходного кода (на ассемблере) возникает необходимость в различных вспомогательных переменных и константах, которые грузятся по необходимости.
-
Стек
Сегмент Стека
Константы (equ)
Сегмент Данных
Переменные
Переменные для хранения промежуточных результатов
Строки
Матрицы
Подпрограммы
Сегмент Кода
Головная программа (main)
4.2. Оптимизация
Для обеспечения оптимизации выходного кода произведены следующие действия.
При генерации кода вспомогательные процедуры добавляются в код не всегда, а только по необходимости (например, процедура вывода на экран числа вставляется в код, если только в промежуточном коде встречается триада WRT).
Т.к. результат выполнения некоторой триады может понадобиться другим триадам, то он должен сохраняться во временной переменной. Количество триад, результат которых должен сохраняться, велико, и стратегия выделения отдельной ячейки памяти под каждый временный результат является малоэффективной. В проектируемом трансляторе реализован другой подход. Определяется максимальное число ячеек, которое в любой момент времени необходимо для хранения актуальных в данный момент промежуточных результатов. Т.о. на протяжении выполнения программы временные переменные будут использоваться для сохранения нескольких промежуточных результатов, и общее число временных переменных будет невелико.
4.3. Перевод промежуточного языка в Assembler
Триада |
Assembler |
|||
|
Jmp L
|
|||
|
Mov AX, R CMP AX, 0 jne _lbl jmp L __lbl: |
|||
|
Mov AX, op1 Mov op2, AX |
|||
|
Mov BX, op2 Mov AX, op1 Mov [BX], AX |
|||
|
Mov AX, op2 Add AX, op1 |
|||
|
Mov AX, op2 Sub AX, op1 |
|||
|
Mov AX, op2 iMul AX, op1
|
|||
|
Mov AX, op2 Cwd iDiv op1 |
|||
|
Mov AX, op2 Cwd iDiv op1 Mov AX, DX |
|||
|
Mov AX, op1 NEG AX |
|||
|
Mov AX, op1 Not AX And AX, 01h |
|||
|
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 : |
|||
|
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 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. Список литературы
-
Ахо, Альфред, В., Сети, Рави, Ульман, Джеффри, Д. Компиляторы: принципы, технологии и инструменты.:Пер. с англ. – М.:Издательский дом «Вильямс», 2001. - 768 с.:ил.
-
Опалева Э.А., Самойленко В.П. Языки программирования и методы трансляции. – СПб.:БВХ-Петербург, 2005. – 480 с.:ил.
-
Юров В. Assembler – СПб: Издаельство “Питер”, 2000. – 624 с.:ил.