Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[11]

IF, инвертирует код условия и компилирует условный переход на нулевой адрес, кладя адрес операнда на стек. После компиляции условного перехода HERE указывает на байт после него, поэтом нужно вычесть размер операнда условного перехода. THEN, затем модифицирует команду условного перехода, изменяя адрес перехода на реальный.

Приведенный вариант THEN, - самый простой вариант для процессоров, использующих условный переход по абсолютному 16-битному адресу. У многих процессоров есть только команда условного перехода по относительному адресу ±127 байт от адреса команды перехода. В этом случае размер операнда равен одному байту, a THEN, должен предварительно вычесть из HERE адрес на стеке.

6.3.12 IF, ELSE, THEN,

Улучшенный вариант IF, THEN, дополняется блоком кода, выполняемом если условие не выполняется:

сс IF, ...... ELSE, ...... THEN,

Ассемблерный код этой конструкции имеет вид:

JP ~сс,ххх

...; код "если"

JP УУУ

ххх: ...; код "иначе"

ELSE, должен модифицировать действия IF, и THEN, следующим образом:

1переход вперед в IF, долен быть модифицирован чтобы выполнялся переход на начало блока ELSE, ("ххх11);

2адрес, положенный на стек THEN, должен быть записан в операнд безусловного перехода в конце блока IF, ("JP ууу").

ELSE, также должен компилировать безусловный переход.

: ELSE (а -- а)

О Т JP,\ безусловный переход

HERE 2 -\ поместить в стек адрес операнда перехода для THEN,

SWAP\ получить адрес перехода IF,

HERE SWAP ! \ заменить его на текущий адрес

Условие перехода Т обозначает TRUE, то есть безусловный переход. При определении ELSE, может быть использован код IF, и THEN, если таже определено условие F FALSE:

: ELSE (а -- a)F IF, SWAP THEN, ;

SWAP адресов в стеке инвертирует последовательность модификации инструкций перехода так, что THEN, модифицирует переход внутри кода ELSE,:

IF,(1) ... IF, (2) THEN,(1) ... THEN,(2)

\ /

внутри ELSE,

версия 26 октября 2005 г.ФОРТ


6.3.13BEGIN, WHILE, REPEAT,

Наиболее сложной ассемблернй структурой является цикл ПОКА, в котором условие проверяется в начале цикла, а не в конце.

BEGIN, <код> сс WHILE, <код цикла> REPEAT,

На практике между BEGIN, и WHILE, может быть вставлен любой код, а не только задание условия.

WHILE, должен скомпилировать условный переход по инверсному условию на код за REPEAT,. Если код условия сс удовлетворяется, этот переход должен игнорироваться и выполняться код цикла.

REPEAT, должен компилировать безусловный переход на BEGIN,.

BEGIN,(1) ... сс IF, (2) ... AGAIN,(1) THEN,(2)

Это может быть сделано с использованием существующих слов:

: WHILE, (а сс -- a a) IF, SWAP ;

: REPEAT, (а а -- )AGAIN, THEN, ;

6.3.14Заголовок ФОРТ-определения

В большинстве приложений машинный код, созданный ФОРТ-ассемблером, помещается в словарь с помощью CODE <имя>, который создает словарную статью с именем <имя> и связывает ее со словарным списком.

Слово CODE получает имя слова из входного потока, создает определение в словаре с этим именем, и настраивает указатель словаря на начало поля кода этого имени.

Стандартный ФОРТ использует слово CODE не только для выделения начала ассемблерного определения в словаре, но и дополнительной инициализации ассемблера (установке переменных типа MODE).

6.3.15Кросс-компиляция

До сих пор мы предполагали что в словарь компилируется машинный код системы, на которой и исполняется.

Для кросс-компиляции обычно выполняется компиляция в отдельную область памяти. Эта область может иметь или не иметь словарной структуры, но она отделена от словаря хост-машины, и скомплированный код не может быть исполнен.

Чаще всего для этого используется набор слов для доступа к целевому пространству памяти по аналогии с обычным долступом к памяти в ФОРТ е. Для этого могут быть использованы обычные слова с префиксом "Т":

TDP указатель компиляции DP целевой системы

THERE аналог HERE для целевой системы (если VALUE-переменная, TDP не нужен) ТС,

Иногда вместо использования префиска "Т"эти слова определяются в отдельном словаре целевого компилятора. Словарная структура ФОРТ а позволяет иметь несколько наборов совпадающих по имени слов с различным действием.

ФОРТверсия 26 октября 2005 г.


6.3.16Компиляция на диск

Целевая компиляция также может выполняться сразу на диск (в файл) без использования буфера памяти целевой системы, но из-за использования прямого побайтного доступа к файлу это может значительно замедлить работу компилятора. Особенно это заметно если не используется кеширование дисковых операций.

6.3.17Безопасная компиляция

Некоторые реализации ФОРТ а используют безопасную компиляцию, которая пытя-ется отловить ошибки типа несбалансированных структур управления типа

IF, ... сс UNTIL,

В этом примере UNTIL, некорректно использует адрес, помещенный на стек IF,.

Обычный метод проверки сбалансированности структур управления - помещение на стек данных или на отдельный стек констант, уникальных для каждого управляющего слова, которые проверяются другими словами:

IF, помещает 1;

THEN, проверяет на 1;

ELSE, проверяет на 1 и оставляет 1;

BEGIN, оставляет 2;

UNTIL, проверяет 2;

AGAIN, проверяет 2;

WHILE, проверяет 2 и оставляет 3;

REPEAT, оставляет 3

DO, оставляет 4;

LOOP, проверяет 4.

Стоимость такой безопасности - увеличение сложности манипуляций со стеком в таких словах как ELSE, и WHILE,. ТАкже программист может захотеть последовательность в которой управляющие структуры are resolved вручную манипулируя стеком. Безопасность делает это более сложным.

6.3.18Метки

Даже в эру структурного программирования некоторые программисты используют метки в ассемблерном коде.

Принципиальная проблема с именоваными метками в ФОРТ-ассемблере - так как метки это ФОРТ-слова, они должны быть скомпилированы в словарь во время незавершенной компиляции другого слова в машинном коде, например:

CODE TEST ... <машиннный код> HERE CONSTANT LABEL1

<машинный код> LABEL1 NZ JP,

Как видно из примера определение метки LABEL1 должно создавать словарную статью внутри серидины CODE. Вот несколько решений 1 метки определяются только вне машинного кода. 2 используются некие предопределенные переменные для временного хранения меток. 3 для меток используется отдельное словарное пространство, например как это сделано по схеме TRANSIENT [?]. 4 для машинного кода используется отдельное пространство словаря. Это наиболее часто используемый метод при мета-компиляции. Большинство мета-компиляторов ФОРТ а поддерживают метки с некоторыми сложностями.

версия 26 октября 2005 г.ФОРТ



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15]