Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8_Vsi_razom.doc
Скачиваний:
4
Добавлен:
10.09.2019
Размер:
347.65 Кб
Скачать

38. Генерація коду. Скп на мову Асамблер.

Побудуємо алгоритм генерації коду, що на вході отримує дерево оптимізації й створює для цього дерево код для побудови внутрішньої лінійної ділянки результуючої програми. По дереву операцій можна використати найпростішу процедуру вхідного дерева редукції. Процедура має визначати тип вузла дерева, що відповідає типу операції. На базі цього типу будується код вузла. Якщо всі вузли нижчого рівня для поточного вузла є листками, то в код включають операнди, які відповідають листкам, ото отриманий код є результатом виконання процедури, інакше процедура має викликати сама себе для генерації нижче розміщених вузлів дерева й результат включити в свій створений код. Фактично відбувається конкатенація ланцюгів-команд. Таким чином, щоб операція для нижче розміщених вузлів виконувалась до

В дереві можливі 4 випадки, які відповідають типу поточного вузла:

  1. Два листи-операнди.

  2. Тільки лівий нижній вузол є листком-опрандом, а правий є операцією.

  3. Тільки правий лист є операндом.

  4. Два нижче розміщених вузлів(листків) є операціями.

Представлення проміжного коду:

Будемо рахувати, що операнди можуть розміщуватися в 16-розрядних регістрах процесору типу 80х86, при чому позначимо, що реєстр АХ є акумулятором, ДХ – регістр даних, є стек, де зберігаються проміжні дані.

Для того, щоб ми могли будувати проміжний код, введемо функцію Code, яка реалізує перехід вузла дерева. Вхідними є дані про вузол дерева операцій, вихідними – послідовність команд Asembler.

Приведем в таблиці результуючий код для кожного типу вузла.

act

oper1 oper2

mov AX, oper1

act AX, oper2

act – відповідна операція у вузлі.

oper1 i oper2 – операнди.

mov – операція пересилки даних із змінної в реєстр.

act

oper1 вузол2

code (вузол2)

mov DX,AX

mov AX, oper1

act AX,DX

вузол2 – не є листком і не є операндом

code – позначає той код, що породжуватиметься процедурою для вузла нижчого рівня.

act

вузол2 oper2

code (вузол2)

act AX, oper2

act

вузол2 вузол3

code (вузол2)

Push AX

code (вузол3)

mov DX,AX

pop AX

act AX,DX

Push – команда збереження

Pop – команда витягнення результатів у/з систем.

Команди:

  • Додавання – add

  • Віднімання – sub

  • Множення – mul

  • Ділення – div

У командах множення і ділення в якості першого операнду передбачають регістр АХ, який команді можна не вказувати. Крім того, потрібно розглянути випадки для операції присвоєння:

:=

oper1 oper2

mov AX, oper2

mov oper1, AX

:=

oper1 вузол2

code (вузол2)

mov oper1, AX

Розглянемо в якості прикладу переклад виразу: А:=В+С+Д-В+10

Розглянемо послідовність побудови проміжного коду за допомогою рекурсії:

  1. code (U2)

mov A, AX

  1. code (U5)

push AX

code (U5)

mov DX, AX

pop AX

sub AX, DX

mov A, AX

  1. code(U4)

add AX, D

push AX

code (U5)

mov DX, AX

pop AX

sub AX, DX

mov A, AX

  1. mov AX, B

mul C

add AX, D

push AX

code (U5)

mov DX, AX

pop AX

sub AX, DX

mov A, AX

  1. mov AX,B

mul C

add AX,D

push AX

mov AX, B

mul 10

mov DX,AX

pop AX

sub AX, DX

mov A, AX

Генерація тріад.

Для перетворення вузлів дерева тріад використовують функцію code, вхідні вихідні дані ті самі. Тріади пов’язані між собою, тому для встановлення взаємозв’язку функції генерації коду повинні враховувати також поточний номер наступної тріади. Вузли ті самі.

act

oper1 oper2

  1. act( oper1,oper2)

act

oper1 вузол2

i)code(вузол2, i) – створє послідовність тріад з і для вузла2

i+j) act(oper1, ^(i+j-1))

i+j, і – номер тріади

^ – посилання на тріаду з даним номером

J – послідовність тріад, яка створ. для вузла2

act

вузол2 oper2

i)code(вузол2, i)

i+j) act(^(i+j+1), oper2)

act

вузол2 вузол3

i)code(вузол2, i)

i+j)code(вузол3, i+j)

i+j+k) act(^(i+j-1),^(i+j+k-1), oper2)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]