- •Преобразование полиз в язык ассемблера
- •Введение
- •Входные данные
- •Модель исполнения полиз
- •Пример:
- •Особенности работы с данными в стеке исполнения
- •Описание перевода элементов полиз в язык ассемблера
- •Пример работы с данными в стеке исполнения
- •Описание перевода операций по работе с метками
- •Описание перевода операций по работе с памятью
- •Исходный код
- •Результат трансляции
- •Результат выполнения
Пример:
var
i1 : integer;
ia1 : array[1..2] of integer;
ra1 : array[1..3, 1..2] of rational;
range1 : 10..100;
Для него будет создан такой сегмент данных:
;
; Generated data segment.
;
_data segment
__variable_ia1 db 8 dup (0) ; Generated variable 'ia1'
__variable_ra2 dd 12 dup (0, 1) ; Generated variable 'ra1'
__variable_i1 dd 01h dup (0) ; Generated variable 'i1'
__variable_range1 dd 01h dup (0) ; Generated variable 'range1'
_data ends
Перевод в ассемблер команд ПОЛИЗ
Перевод команд из ПОЛИЗ в ассемблер осуществляется последовательным образом, то есть команда из ПОЛИЗ транслируется в набор команд на языке ассемблера, причем если две команды в ПОЛИЗ следуют одна за другой, то их интерпретации в языке ассемблера будут таким же образом следовать друг за другом.
Пояснение:
ПОЛИЗ |
Язык ассемблера |
<Команда 1> <Команда 2> |
<Интерпретация команды 1> <Интерпретация команды 2> |
Мы будем использовать стек языка ассемблера для моделирования стека исполнения ПОЛИЗ. Прежде всего, определим, какого рода элементы будут находиться в этом стеке.
Если рассмотреть стек исполнения ПОЛИЗ, не рассматривая пока его моделирование в языке ассемблера, то в нем могут находиться элементы следующих типов:
Элемент-переменная – соответствует указателю на блок памяти, соответствующий какой-либо переменной, имеющей некоторый определенный тип;
Элемент-константа – соответствует константе определенного типа, имеющей определенное значение;
Элемент-метка – соответствует метке, которая характеризуется своим именем.
Мы будем считать, что элементы, соответствующие командам в ПОЛИЗ не попадают в стек исполнения ПОЛИЗ. Когда на входной ленте встречается команда – она может произвести некоторые операции с элементами стека и каким-то определенным образом изменить его.
Каждая команда в ПОЛИЗ обладает контрактом – то есть она требует, чтобы элементы стека до ее исполнения удовлетворяли ее предусловию и гарантирует, что, после ее исполнения, элементы стека будут удовлетворять ее постусловию.
Мы будем производить трансляцию в язык ассемблера следующим образом. Прежде всего, программа будет соответствовать следующему шаблону:
Шаблон программы
; ; Generated header of assembly. ; .386 .model flat, stdcall option casemap : none
include CompileLib.asm
; ; Generated data segment. ; _data segment ... _data ends
; ; Generated code segment. ; _text segment
_main proc near push ebp mov ebp, esp pusha
...
popa mov esp, ebp pop ebp ret 0 _main endp
_text ends
; ; Generated footer of assembly ; end _main
|
Определяет модель используемых инструкций языка ассемблер (i386), модель памяти (flat) и модель вызовов (stdcall). |
Подключает используемую библиотеку (CompileLib). Мы используем свою собственную библотеку, написанную на языке ассемблера, которая предоставляет набор шаблонов и функций для перевода команд ПОЛИЗ в язык ассемблера. | |
Сгенерированный сегмент данных. | |
Сгенерированный сегмент кода. | |
Функция соответствующая точке входа в модели вызовов stdcall. | |
Сгенерированный перевод команд ПОЛИЗ в язык ассемблера. | |
Явное указание точки входа программы.
|