Скачиваний:
10
Добавлен:
01.05.2014
Размер:
159.74 Кб
Скачать
      1. Пример:

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>

Мы будем использовать стек языка ассемблера для моделирования стека исполнения ПОЛИЗ. Прежде всего, определим, какого рода элементы будут находиться в этом стеке.

Если рассмотреть стек исполнения ПОЛИЗ, не рассматривая пока его моделирование в языке ассемблера, то в нем могут находиться элементы следующих типов:

  1. Элемент-переменная – соответствует указателю на блок памяти, соответствующий какой-либо переменной, имеющей некоторый определенный тип;

  2. Элемент-константа – соответствует константе определенного типа, имеющей определенное значение;

  3. Элемент-метка – соответствует метке, которая характеризуется своим именем.

Мы будем считать, что элементы, соответствующие командам в ПОЛИЗ не попадают в стек исполнения ПОЛИЗ. Когда на входной ленте встречается команда – она может произвести некоторые операции с элементами стека и каким-то определенным образом изменить его.

Каждая команда в ПОЛИЗ обладает контрактом – то есть она требует, чтобы элементы стека до ее исполнения удовлетворяли ее предусловию и гарантирует, что, после ее исполнения, элементы стека будут удовлетворять ее постусловию.

Мы будем производить трансляцию в язык ассемблера следующим образом. Прежде всего, программа будет соответствовать следующему шаблону:

Шаблон программы

;

; 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.

Сгенерированный перевод команд ПОЛИЗ в язык ассемблера.

Явное указание точки входа программы.

Соседние файлы в папке Бяша