Page 54 - 4761
P. 54

Процедура генерації коду по дереву операцій, перш за все, повинна визначати тип
                  вузла дерева – він відповідає типу операції, символ якої знаходиться в листку дерева для
                  поточного  вузла.  Цей  вузол  є  середнім  листом  вузла  дерева  для  бінарних  операцій  і
                  крайнім лівим листом для упорних операцій. Після визначення типу процедура будує код
                  для вузла дерева у відповідності рівня з типом операцій. Якщо всі вузли наступного рівня
                  для поточного вузла є листами дерева, то в код включаються операнди, які відповідають
                  цим листкам, і отриманий код є результатом виконання процедури.
                         Тому  для  побудови  внутрішнього  представлення  програми  об’єктного  коду  по
                  дереву виводу треба в першу чергу розробити форми представлення об’єктного коду для
                  4-х випадків, які відповідають видам робочого вузла дерева виводу:
                         1)     два нижче лежачих вузли дерева – листя помічене операндами;
                         2)     тільки лівий нижчележачий є листом дерева;
                         3)     тільки правий  нижчележачий є листом дерева;
                         4)     обидва вузли не є листками дерева.

                         Приклади схем СК-перекладу дерева операцій на мові асемблер
                         Розглянемо  функцію,  яка  реалізує  перевід  вузла  дерева  в  послідовність  команд
                  асемблера,  яку  назвемо  code.  Вхідними  даними  функції  повинна  бути  інформація  про
                  вузол дерева операцій. Вихідними даними є послідовність команд мови асемблер.

                         Таблиця 5.1 – Перетворення вузлів дерева виводу в код на мові асемблер для
                  арифметичних операцій

                         Вид вузла дерева                      Результуючий код              Примітка
                                                               mov ax, oper1         act     -         команда
                                                               act ax, oper2         відповідної операції
                                                                                     опер1, опер2 – операнди
                                                                                     (листки дерева)

                                                               code(вузол2)          Вузол2 – нижчележачий
                                                               mov dx, ax            вузол (не лист) дерева.
                                                               mov ax, oper1         Code  (вузол2)  –  код,
                                                               act ax, dx            який             породжує

                                                                                     процедура              для
                                                                                     нижчележачого вузла
                                                               code(вузол2)          Code  (вузол2)  –  код,
                                                               act ax, oper2         який             породжує
                                                                                     процедура              для
                                                                                     нижчележачого вузла

                                                               code(вузол2)          push  і  pop  –  команди
                                                               push ax               збереження результатів в
                                                               code(вузол3)          стеку     і     отримання
                                                               mov dx,ax             результатів зі стеку
                                                               pop ax
                                                               act ax,dx

                         Кожний допустимій арифметичній операції буде відповідати своя команда на мові
                  асемблер. Наприклад,  +, -, *, /       – відповідно –  add, sub, mul, div.
                         Код для операції присвоєння відрізняється від арифметичних.





                                                                52
   49   50   51   52   53   54   55   56   57   58   59