Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Генерация команд сравнения и перехода

 

При анализе таких конструкций языка программирования, как if–then–else и while, в ОПС записываются операции сравнения, а также операции условного и безусловного перехода. При генерации команд, реализующих эти конструкции, необходимы также, кроме рассмотренных ранее команд процессора, команды сравнения и перехода.

 

Пример 23. Расширим список команд процессора. Команда сравнения

C <признак> <операнд>

сравнивает содержимое регистра сумматора с содержимым ячейки памяти, адрес которой записан в операнде. Признак, как и в других командах, может указывать на косвенную адресацию. Результат выполнения этой команды записывается в специальный регистр – регистр состояний, который анализируется командами условного перехода. Команд условного перехода всего шесть, имеется также одна команда безусловного перехода. Команды выполняют переход на команду, номер которой записан в операнде, в зависимости от результата сравнения, выполненного предыдущей командой:

код операции действие команды

J> переход по условию больше

J≥ переход по условию больше или равно

J< переход по условию меньше

J≤ переход по условию меньше или равно

J= переход по условию равно

J≠ переход по условию не равно

J безусловный переход

Правила генерации команд, реализующих операции сравнения рассмотрим на примере операции «меньше» (<). Обозначим два верхних операнда в магазине как a и b. В переменной k находится ссылка на элемент магазина, содержащий 0. В командах используется дополнительная временная переменная t1, константы 0 и 1, адреса которых будут записываться как «0» и «1», и признак косвенной адресации, обозначаемый p, который может быть равен 0 или 1.

Если b = 0, то генерируются команды:

C p a

Load 0 «1»

J< 0 M:

Load 0 «0»

M: «следующая команда»

Если a = 0, то генерируются команды:

C p b

Load 0 «1»

J≥ 0 M:

Load 0 «0»

M: «следующая команда»

Если a ≠ 0, b ≠ 0,k = 0, то генерируются команды:

Load p a

C p b

Load 0 «1»

J≥ 0 M:

Load 0 «0»

M: «следующая команда»

Во всех случаях после генерации команд в магазин записывается 0, а в переменную k – ссылка на него.

Если a ≠ 0, b ≠ 0,k ≠ 0, то генерируются команды:

St p t1

Load p a

C p b

Load 0 «1»

J≥ 0 M:

Load 0 «0»

M: «следующая команда»

После генерации команд по ссылке k в магазин записывается t1, затем в магазин записывается 0, а в переменную k – ссылка на него.

После выполнения всех сгенерированных команд в регистре сумматора будет записано 1 или 0, что соответствует значению «истина» или «ложь» соответственно.

Если требуется сгенерировать команды, реализующие другие операции сравнения, то в рассмотренных образцах требуется заменить команду J< или J≥ другой командой условного перехода.

Конец примера.

 

Перед генерацией команд, реализующих операции условного и безусловного перехода ОПС, необходимо сформировать таблицу соответствия меток (адресов) ОПС и адресов генерируемых команд. Эта таблица должна состоять из двух столбцов: 1) метки ОПС; 2) адреса генерируемых команд. Вначале, после генерации ОПС, ее необходимо просмотреть и записать в первый столбец все встретившиеся в ОПС метки. Затем метки необходимо упорядочить по возрастанию и удалить повторения.

Второй столбец таблицы формируется в процессе генерации команд следующим образом. При просмотре очередного элемента ОПС его номер сравнивается с очередной меткой в первом столбце таблицы, и если обнаружится совпадение, то во второй столбец записывается номер очередной генерируемой команды. Таким образом, вся таблица будет полностью заполнена после окончания генерации команд.

При генерации команд операнды, являющиеся адресами команд, должны временно заполняться метками ОПС, при этом номера таких команд должны записываться в отдельный список. Наконец, на последней стадии необходим просмотр этого списка, и в каждой команде из списка операнд (метка ОПС) должен с помощью таблицы соответствия заменяться адресом соответствующей команды.

 

Пример 24. Рассмотрим правила генерации команд, реализующих операции ОПС безусловного перехода и перехода по условию «ложь».

Операция безусловного перехода требует одного операнда – метки перехода, которая при работе интерпретатора вначале попадает в магазин. При этом требуется сгенерировать всего одну команду:

J 0 M:

где M: – метка перехода.

Операция перехода по условию «ложь» требует двух операндов – логического значения и метки перехода. Если обозначить эти операнды в магазине как a и M: соответственно, то правила генерации команд будут следующими. В переменной k находится ссылка на элемент магазина, содержащий 0, t1 – дополнительная временная переменная.

Если a = 0, то генерируются команды:

С 0 «1»

J≠ 0 M:

Если a ≠ 0, k = 0, то генерируются команды:

Load p a

С 0 «1»

J≠ 0 M:

Во всех случаях после генерации команд в магазин ничего не записывается, k := 0.

Если a ≠ 0, k ≠ 0, то генерируются команды:

St p t1

Load p a

С 0 «1»

J≠ 0 M:

После генерации команд по ссылке k в магазин записывается t1, k := 0.

 

Рассмотрим пример генерации команд. Пусть задана ОПС:

a b < M1 <jf> a b := M2 <j> b a :=

↑ ↑

M1 M2

что соответствует оператору:

if a < b then a := b else b := a

Шаги работы генератора команд будут такими (пропущены действия по записи в магазин операндов):

Операция < , k = 0, в магазине:
a b

генерируемые команды: Load 0 a

C 0 b

Load 0 «1»

J≥ 0 M:

Load 0 «0»

M: «следующая команда»

k := 1

Операция <jf> , k = 1, в магазине:
M1

генерируемые команды: С 0 «1»

J≠ 0 M1:

k := 0

Операция := , k = 0, в магазине:
a b

генерируемые команды: Load 0 b

St 0 a

k := 0

Операция <j> , k = 0, в магазине:
M2

генерируемые команды: J 0 M2:

k := 0

Операция := , k = 0, в магазине:
b a

генерируемые команды: M1: Load 0 a

St 0 b

M2: «следующая команда»

k := 0, магазин пуст.

В результате получится такая программа:

Load 0 a

C 0 b

Load 0 «1»

J≥ 0 M:

Load 0 «0»

M: С 0 «1»

J≠ 0 M1:

Load 0 b

St 0 a

J 0 M2:

M1: Load 0 a

St 0 b

M2: «следующая команда»

Конец примера.

 


<== предыдущая страница | следующая страница ==>
Генерация команд с индексными выражениями | Тема 1. Задачи теории автоматов. Понятие абстрактного автомата. Конечные автоматы. Основные модели автоматов

Дата добавления: 2015-07-26; просмотров: 122; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.004 сек.