Системное программное обеспечение: Основы трансляции. Карпушин А.Н - 51 стр.

UptoLike

53
Здесь операции обозначены соответствующим знаком (при этом присвое-
ние также является операцией), а знак ^ означает ссылку операнда одной триа-
ды на результат другой.
Команды ассемблера удобны тем, что при их использовании внутреннее
представление программы полностью соответствует объектному коду и слож-
ные преобразования не требуются. Однако использование команд ассемблера
требует дополнительных структур для отображения их взаимосвязи. Кроме то-
го, внутреннее представление программы получается зависимым от результи-
рующего кода, а это значит, что при ориентации компилятора на другой ре-
зультирующий код потребуется перестраивать как само внутреннее представ-
ление программы, так и методы его обработки в алгоритмах оптимизации.
Для построения внутреннего представления объектного кода по дереву
вывода может использоваться простейшая рекурсивная процедура. Эта проце-
дура прежде всего должна определить тип узла дереваон соответствует типу
операции, символ которой находится в листе дерева для текущего узла. Этот
лист является средним листом узла дерева для бинарных операций и крайним
левым листомдля унарных операций. После определения типа процедура
строит код для узла дерева в соответствии с типом операции. Если все узлы
следующего уровня для текущего узла есть листья дерева, то в код включаются
операнды, соответствующие этим листьям, и получившийся код становится ре-
зультатом выполнения процедуры. Иначе процедура должна рекурсивно вы-
звать сама себя для генерации кода нижележащих узлов дерева и результат вы-
полнения включить в свой порожденный код.
Поэтому для построения внутреннего представления объектного кода по
дереву вывода в первую очередь необходимо разработать формы представления
объектного кода для четырех случаев, соответствующих видам текущего узла
дерева вывода:
1. оба нижележащих узла деревалистья (терминальные символы);
2. только левый нижележащий узел является листом дерева;
3. только правый нижележащий узел является листом дерева;
4. оба нижележащих узла не являются листьями дерева.
Построение ассемблерного кода по дереву вывода
В качестве языка ассемблера возьмем язык ассемблера процессоров типа
Intel 80x86. Будем считать, что операнды могут быть помещены в 16-разрядные
регистры процессора и в коде результирующей объектной программы могут
использоваться регистры AX (аккумулятор) и DX (регистр данных), а также
стек для хранения промежуточных результатов. Тогда 4-м видам текущего узла
дерева будут соответствовать следующие фрагменты кода на языке ассемблера: