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


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




[9]

следует обратить внимание на то, что при использовании целевого компилятора для кросс-разработки слово С, должно быть переопределено так, чтобы оно компилировало байт в образ памяти целевой системы.

Для ассемблерных опкодов часто задаются имена ФОРТ-слов имеющие в конце символ как это сделано выше. Это делается из-за того что многие ФОРТ-слова (например AND, XOR, OR) конфликтуют с мнемониками ассемблера. Простейшее решение - слегка изменить мнемоники (символ ","в ФОРТ е обозначает что что-то компилируется (добавляется) в словарь).

6.3.4 Класс наследуемых опкодов

Большинство процессором имеют много инструкций подобных NOP, которые не требуют операндов. Все они могут быть определены в ФОРТ е через двоеточие, но это значительно увеличивает объем исходного кода. Намного более эффективным является использование механизма определяющих слов для того, чтобы задать для всех таких слов общее поведение. В терминах ООП это значит создание экземпляров единственног класса.Это далется с использованием слов CREATE и DOES>. В приведенном примере параметр (разный для каждого созданного слова) обычный опкод, который должен быть скомпилирован для каждой инструкции.

: cmdOops

С,( byte -- )

D0ES>( -- addr )

CO( addr -- byte)

C,( byte -- )

\определение имени класса команды без опреандов

\этот код выполняется при создании слов

\сохранить байт для нового определяющего слова

\этот код определяющего слова (общее действие)

\получить сохраненный при создании слова опкод

\скомпилировать опкод

Примеры использования определяющего слова cmdOops:

0x12 cmdOops NOP, ОхЗА cmdOops АВХ, 0x3D cmdOops MUL,

Обратив особое внимание на то, что этот пример дан для обычного ФОРТ -ассемблера, а не кросс-ассемблера, то есть генерируемый код компилируется в основной словарь ФОРТ-системы. При кросс-компиляции (использовании целевого компилятора) нужно сделать несколько финтов ушами - например нужно использовать разные варианты слова С, в блоках CREATE и DOES> слова cmdOops, которые должны компилировать опкод соответственно в словарь ФОРТ-системы и в область памяти целевой системы.

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

6.3.5 Обработка операндов инструкций

Большинство команд ассемблера требуют один или более операндов. Для этих команд ассемблер должен быть способен разбирать текст из входного потока и интерпретировать его как операнды. Для постфиксного ФОРТ-ассемблера используется более простой способ, использующий готовый механизм интерпретации ФОРТ-системы.

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


Итак ФОРТ будет использоваться для разбора операндов. Числа обрабатываются как обычно (в любой системе счисления), для EQU выражений могут использоваться обуч-ные константы ФОРТ CONSTANT. Так как операнды определяют формат ассемблируемой команды, они должны быть обработаны до команды ассемблера. Результаты разбора операндов обычно оставляются на стеке данных и используются командами ассемблера для определения формата команды и используемого оп-кода. Для ФОРТ-ассемблера используется уникальный21 постфиксный формат команд: операнды, за которыми следует команда ассемблера.

Для примера рассмотрим инструкцию ORCC процессора 6809, которая использует простой числовой параметр:

: ORCC, OxlA С, С, ; \ пример использования: 0x34 0RCC,

Выполнение этой команды состоит из двух этапов:

1.компилируется опкод инструкции ORCC OxlA;

2.компилируется параметр инструкции 0x34, взятый со словаря.

Эта команда предполагает что на стеке уже лежит числовой параметр, полученный в результате разбора операндов, которые в нашем случае имеют вид простого hex числа 0x34 в исходном коде.

Достоинство такого ассемблера - доступна вся мощь ФОРТ а, которая может быть использована для формирования операндов, например:

ONSTANT CY-FLAG\ используем константы ФОРТа для задания операндов

0x02 CONSTANT 0V-FLAG 0x04 CONSTANT Z-FLAG

CY-FLAG Z-FLAG + ORCC, \ команда ORCC проверит флаги CY и Z

Из примера видно что расширение разбора операндов для определяющих слов ассемблера достаточн просто.

6.3.6 Обработка режимов адресации

Для современных процессоров для одной команды используется несколько форматов и различные оп-коды в зависимости от режима адресации. ФОРТ-ассемблеры решают эту проблему несколькими способами в зависимости от типа процессора. Все эти способы используют методологию ФОРТ а: операторы определения режима адресации являются ФОРТ-словами. Когда эти слова исполняются, они изменяют формат ассемблируемой инструкции. 1 помещение дополнительных параметров на стек.

Это наиболее удобно если всегда должен указываться режим адресации. Слова режима адресации оставляют на стеке некоторые константы, которые обрабатываются словами ассемблера. Иногда эти значения могут быть "магическим числом", добавляемым к опкоду для изменения режима адресации команды. Кодга это неприменимо, используется выбор формата команды в блоке CASE. В общем случае скомпилированные инструкции могут иметь разнуб длину в зависимости от режима адресации.

2 установка флагов или значений в фиксированных переменных.

Это наиболее удобно если режим адресации опционален. Не зная что был указан режим адресации, вы не можете знать что значение на стеке "магическое число" или просто

21 ну не совсем уникальный - GNU assembler тоже постфиксный


значение операнда. Решение этой пролемы: режим адресации указывать помещая соответствующую ему константу в определенную переменную (часто называемую MODE). После выполнения каждой команды ассемблера эта переменная инийиализируется значением по умолчанию. Если используется команда ассемблера, у которой может быть несколько режимов адресации, то она определяет содержимое этой переменной. 3 модификация значений параметров непосредственно на стеке.

Это иногда возможно для реализации слов указывающих режим адресации, которые работают модифицируя значения операндов. Этот метод используется редко.

Все эти три метода я использовал с некоторыми расширениями для реализации ассемблера 6809.

Для большинства процессоров имена регистров задаются обычными константами ФОРТ а, и оставляют на стеке свои значения. Для некоторых процессоров также удобно иметь имена регистров, определяющие режим "регистровой адресации". Это легко сделать определяя имена регистров как определяющие слова, которые создают слова, устанавливающие режим адресации (а стеке или в переменной MODE).

Некоторые процессоры позволяют использовать несколько режимов адресации в одной инструкции. Если чисто режимов адресации фиксировано, они могут оставляться на стеке. Если чисто переменное, необходимо знать сколько их был указано, и нужно использовать несколько переменных MODEra. Для процессора Super8 я должен был отслеживать не только сколько режимов адресации указано, но и сколько операндов. Я сделал это сохраняя позицию стека отдельно для каждого режима адресации.

Рассмотрим инструкцию 6809 ADD. Для упрощения игнорируем индексированные режимы адресации, и реализуем только три режима: непосредственный (immediate), прямой (direct) и расширенный (extended):

исходный кодассемблируется как

immediate <число> # ADD, 8В пп direct<адрес> О ADD, 9В пп

extended <адрес> ADD,ВВ аа аа

Так как режим extended не имеет оператора режима адресации, режим адресации оказывается уже определенным. Слова ФОРТ а и О устанавливают режим адресации. Рассмотрим систему команд 6809. Если опкод immediate является основным значением, то опкод в direct режиме равен базовому +0x10, в indexed режиме +0x20 и в extended режиме +0x30. Это справедливо для почти всех инструкций, использующих эти режимы адресации. Исключение составляют те опкод, для которых опкоды в режиме direct имяют форму 0x0?.

Такие особенности системы команд нужно использовать. Это общее правило при написании ассемблеров: найдите или сделайте сами таблицу опкодов, и найдите закономерности - особенно те, которые применимы для режимов адресации или других модификаторов инструкций (таких как коды условий).

В нашем случае нужно использовать следующие значения переменной MODE:

VARIABLE MODE #0x00 MODE

О 0x10 MODE

RESET 0x30 MODE ! ; \ значение по умолчанию

Значение по умолчанию 0x30 (extended режим) устанавливается словом RESET. Это слово будет использоваться после того как будет ассемблирована каждая инструкция.

Теперь может быть написана команда ассемблера ADD,. Давайте посмотрим ее старую версию и напишем определяющие слова для создания команд ассемблера.

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



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