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


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




[12]

6.3.19 Табличный ассемблер

Большинство ФОРТ-ассемблеров могут отрабатывать режимы адресации и инструкции используя структуры типа CASE. Их можно назвать процедурными ассемблерами.

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

Я не буду описывать такие процессоры - табличные ассемблеры писать намного слож-

6.3.20Префиксные ассемблеры

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

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

Так каждое слово ассемблера модифицируется так что оно

1сохраняет свой код или адрес кода, компилирующего команду;

2выполняет компилирующий команду код для предыдущего слова ассемблера.

... JP operand ADD operands

JP сохраняет указатель на свой код в какой-либо переменной. Далее обрабатываются операнды. ADD берет информацию, запомненную JP и выполняет действие JP, которое использует операнды на стеке. Когда код JP завершается, ADD сохраняет свой адрес, и процесс продолжается.

Особо должны отрабатываться первые и последние команды в ассемблерном блоке. Если используются переменные режима, то их сохранение и восстановление станоится кошмаром.

6.3.21Вывод

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

6.4 Постфиксный форт-ассемблер для MCS-51

Реализация собственной форт-системы

Реализация ООП

Детальное описание mini-OOF

© Bernd Paysan

пример такого ассемблера приведен в следующем разделе


Объектно-ориентированные (00) системы с поздним связыванием обычно используют метод VTABLE: первая переменная24 в каждом объекте25 является указателем на описание класса в виде таблицы указателей на функции26. Эта VTABLE может также содержать некоторую другую информацию, например статические переменные.

число переменных число методов xt метода

Во-первых, определим методы:

: method ( m v -- m+1 v ) CREATE

OVER , SWAP CELL+ SWAP

DOES> ( ... о --- )

<& OVER @ + @ EXECUTE

При декларации метода со стека берется общее число методов и переменных класса, method создает один метод и увеличивает на 1 число методов. Для исполнения метода берется объект, из него получается указатель на VTABLE, добавляется смещение, и выполняется xt27 метода, который находится по полученному адресу. Каждый метод определяет объект, для которого он вызывается, по адресу на стеке - указателю this. Метод должен работать с объектом самостоятельно и удалять this со стека перед выходом из метода.

Теперь мы должны определить переменные класса

: var ( m v size -- m v+1 ) CREATE

OVER , + D0ES> ( о -- addr ) @ +

так ка, как и method, слово создается с текущим смещением. Переменные могут иметь различные размеры28, так что все что мы делаем - берем размер и добавляем его к смещению. Если ваша машина имеет требования по выравниванию29, перед переменной добавляем требуемые выравнивающие байты словами ALIGNED или FALIGNED, также корректирующими смещение переменной. Именно по этой причине смещение находится на вершине стека.

Для начала определения объекта нам нужно задать начальное состояние30 и выполнить некоторые дополнительные действия:

CREATE object 1 CELLS , 2 CELLS ,

vtable-ptr

переменная

переменная

: class ( class -- class methods vers ) DUP 20

" поле

25экзмемпляре класса

26методы класса

27execution token, обычно адрес поля кода CFA слова

28целые, числа с плавающей точкой одинарной и двойной точности, символы и т.п.

29например на границу машинного слова

30пустой объект

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


Для наследования при декларации нового наследуемого31 класса должна быть скопирована VTABLE родительского объекта. Это копирование дает все методы родительского объекта, которые далее могут быть переопределены.

: end-class ( class methods vars -- ) CREATE

HERE >R \ (1)

( vars ) , ( methods ) , DUP , ( methods ) 2 CELLS ?D0

[] NOOP , 1 CELLS +L00P \ (2)

CELL+ DUP CELL+ R> ( here ) ROT @ 2 CELLS /STRING MOVE

(1)создает VTABLE, инициализированную NOOPaMH;

(2)реализует механизм наследования - из родительской VTABLE копируются xt методов .

У нас все еще нет способа определения новых методов, поэтому определим слово

: defines ( xt class -- ) >B0DY @ + !

Для выделения памяти под новый объект нам также нужно слово

: new ( class -- о )

HERE OVER <& ALLOT SWAP OVER !

Многда дочерние классы требуют доступа к методам родительского класса. Существует два способа сделать это в этом варианте реализации OOF: вы можете

1.использовать именованные слова;

2.использовать их xt из VTABLE родительского класса.

: :: ( class "name" -- )

>B0DY @ + @ COMPILE,

Пример Ничто не может быть лучше чем хороший пример, так что вот он. Для начала определим текстовый объект (налее называемый button), который хранит текст и позицию:

object class

cell var text

veil var len

cell var x

cell var у

method init

method draw end-class button

дочернего



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