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


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




[8]

На стек кладется адрес вершины кодофайла. С помощью этого слова можно определить, какой объем памяти требуется для любого фрагмента Вашей программы - надо сравнить значения "НЕЫЕ"до компиляции и после нее.

ALLOT... п --> ...

Резервируются п байтов свободной памяти: адрес вершины кодофайла увеличивается на п (а при п<0 уменьшается).

Занятие двух байтов в кодофайле и запись туда п.

!... aaddr --> ...

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

@... addr--> ... а

Слово "@"(читается "взять") кладет в стек значение, хранящееся по адресу, лежащему на стеке. Сам адрес из стека при этом убирается.

+!... a addr --> ...

К числу, расположенному по адресу addr, прибавляется значение а. Результат сохраняется там же.

5.3 Интерпретация, компиляция и исполнение 6 Создание компиляторов и форт-систем

6.1Создание собственных компиляторов

6.2Целевая компиляция

Значение термина компиляция в Форте отличается от его традиционного применения. Обычно под компиляцией подразумевается обработка текстовых файлов с текстами программ и генерация машинного или байт-кода. В Форте компиляцией называется добавление байтов в словарь в процессе определения новых слов и структур данных. Компилятором в Форте являются слова С, и , , которые добавляют на вершину словаря соответственно байт или cell (машинное слово). Остальные компилирующие слова Форта работают через эти слова.

Штатный компилятор ФОРТа способен только добавлять код к коду ФОРТ-системы. Более интересная для разработчиков техника19 - целевая компиляция. Она используется в случаях когда необходимо генерировать машинный код для другой архитектуры (кросс-компиляция) или для той же самой, но не включать в код ФОРТ-систему, то есть создавать объектный код с нуля. При этом объем генерируемого кода можно значительно сократить, не включая в него никакой дополнительной информации (словарей). Механизм работы целевого компилятора (ЦК) полностью аналогичен обычному, отличие заключается в том что формируемый код компилируется не в память ФОРТ-системы, а в специально выделенный буфер целевого компилятора. Текущую позицию компиляции в этом буфере указывает value-перемененная THERE, аналогичная HERE в ФОРТ-системе.

19к сожалению, она плохо описана в русскоязычной литературе


0x10000 CONSTANT Msz \ размер буфера ЦК (максимальный размер целевого кода)

CREATE М Msz ALLOT \ буфер ЦК

О VALUE THERE\ указатель ЦК

Определяем основные слова ЦК. При этом нужно учитывать порядок байт в машинном слове. Например, в архитектуре 80x86 первым в памяти находится младший байт, у MCS-51 и AVR старший. В примере показаны слова для 80x86 и FVM, для MCS-51 нужно будет дополнительно выполнять переупорядочение байтов. Для упрощения понимания кода мы не будем переопределять стандартные слова С, и , , а будем использовать для слов ЦК нестандартные имена.

b, ( byte -- ) THERE М + С! THERE 1 + ТО THERE ; \ скомпилировать байт

w, ( word -- ) THERE М + W! THERE 2 + ТО THERE ; \ скомпилировать слово

d, ( dword -- ) THERE М + ! THERE 4 + ТО THERE ; \ скомпилировать 32-битное ело!

Для сохранения наработанного кода в двоичный файл используем слово save" (также неплохо было бы определить слово пех"для сохранения в формате Intel HEX для загрузки в симуляторы и целевые системы)

: save" \ program.bin"

[CHAR] " WORD COUNT W/0 CREATE-FILE DROP

M THERE ROT WRITE-FILE DROP

\ открыть файл

\ записать код в файл

\ выход с автоматическим закрытием файла

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

Простейшим примером использования ЦК является ЦК для FVM. Его простота определяется тем, что FVM имеет всего два вида команд с простым форматом: опкод имеет фиксированный размер в один байт, команды безоперандные или с одним операндом фиксированного размера байт или 16-битное слово. В других архитектурах формат команды намного сложнее из-за использования битовых полей, в которых кодируются операнды и режимы адресации. Основную сложность в ЦК для FVM создают слова для формирования словарной структуры и особенно слова, компилирующие управляющие структуры. Если у вас возникают вопросы, напишите мне чтобы я более подробно описал структуру кода управляющих структур и механизм работы слов, компилирюущих этот код.

6.3 Как написать свой (кросс-)ассемблер

© Brad Rodriguez

20для определения макросов доступны все функции форт-системы

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


6.3.1Введение

В предыдущем выпуске журнала я описал как "загрузить" себя на новый процессор используя простой отладочный монитор. Но как вы сможете писать код для этого нового процессора, если вы не можете найти ассемблер или он вас не устраивает ? Напишите свой !

ФОРТ - идеальный язык для этого. Для TSM320 например я написал кросс-ассемблер всего за два часа, включая длинный обеденный перерыв. Обычно это занимает около двух дней, но для одного из процессоров (Zilog Super8) потребовалось пять дней. Но когда у вас больше времен чем денег, это не важно.

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

В части 2 я покажу как писать ассемблер для специфичного процессора Motorola 6809. Этот ассемблер прост но не тривиален, занимает 15 страниц исходного кода. Кроме всего прочего, этот пример покажет как реализовывать инструкции с множественными режимами адресации. Изучив этот пример, вы сможете понять как использовать особенности вашего процессора.

6.3.2Зачем использовать ФОРТ ?

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

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

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

В общем так как ассемблер полностью реализуется через слова ФОРТ а, определения ФОРТ а аналогичны макро-определениям.

6.3.3Простейший пример: ассемблирование NOP

Для понимания того как ФОРТ транслирует мнемоники в машинный код, рассмотрим простейший случай: инструкцию NOP (0x12 для 6809, 0x90 для 80x86).

Обычный ассемблер при нахождении строки "МОР"должен добавить соответствующий байт в выходной файл и увеличить указатель на 1. Операнды и комментарии игнорируются. Я также пока буду игнорировать метки.

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

: NOP, 0x12 С, ;

Обратите внимание что в этом примере используется возможность SP-FORTH воспринимать числа с префиксом Ох (шестнадцатеричные числа) независимо от текущей системы счисления, заданной в переменной BASE. Если ваша ФОРТ-система не имеет такой возможности, для удобства в начале кода ассемблера можно использовать слово HEX. Также

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



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