Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Построение ассемблерного кода по дереву вывода
В качестве языка ассемблера возьмем язык ассемблера процессоров типа Intel 80x86. При этом будем считать, что операнды могут быть помещены в 16-разрядные регистры процессора и в коде результирующей объектной программы могут использоваться регистры AX (аккумулятор) и DX (регистр данных), а также стек для хранения промежуточных результатов. Тогда четырем формам текущего узла дерева будут соответствовать следующие фрагменты кода на языке ассемблера (табл. 5):
Таблица 5. Преобразование типовых узлов дерева вывода в код на языке ассемблера
Рассмотрим пример дерева вывода для выражения A := B*C + D - B*10 на рис. 5 и соответствующий ему фрагмент кода на языке ассемблера, построенный по описанным выше правилам (обратите внимание, что для операции присваивания используется отдельный код, не подпадающий под общие правила): Шаг1: Code(U2) mov A,ax ;операция присваивания Шаг 2: Code(U3) push ax Code(U5) mov dx,ax pop ax sub ax,dx mov A,ax ;операция присваивания Шаг 3: Code(U4) add ax,D push ax Code(U5) mov dx,ax pop ax sub ax,dx mov A,ax ;операция присваивания Шаг 4: mov ax,B mul ax,C add ax,D push ax Code(U5) mov dx,ax pop ax sub ax,dx mov A,ax ;операция присваивания Шаг 5: mov ax,B mul ax,C add ax,D push ax mov ax,B mul ax,10 mov dx,ax pop ax sub ax,dx mov A,ax ;операция присваивания
Полученный объектный код на языке ассемблера, очевидно, может быть оптимизирован, однако для его обработки требуются специальные (ориентированные именно на данный язык ассемблера) методы и структуры, учитывающие взаимосвязь операций. Кроме того, ориентация на определенный язык ассемблера сводит на нет универсальность метода. Так в приведенном примере используется команда mul, которая в ранних версиях процессоров фирмы Intel имеет ограничения на типы операндов, а следовательно, в универсальном компиляторе не может быть использована так, как в данном примере. Это потребует, чтобы генерация кода для узлов дерева шла в зависимости не только от операндов, но и от типа операции (даже в приведенном примере такую зависимость пришлось установить для операции присваивания). Обычно такие проблемы решаются таким образом, что вместо команд непосредственно языка ассемблера используются команды некоторого близкого к нему промежуточного псевдокода. Большинство этих команд один в один отображаются затем в команды языка ассемблера, другие же однозначно преобразуются в фиксированную последовательность команд. |
Последнее изменение этой страницы: 2019-05-07; Просмотров: 383; Нарушение авторского права страницы