Я написал интерпретатор Форта на Ассемблере (базовый набор), но существует ли стандартный способ определить слово Форт с помощью инструкций Ассемблера или непосредственно машинного кода?
Пример
Я хочу определить «+» (дополнение) с помощью Ассемблера («::» отдельные инструкции ассемблера), вот так
: + ASMSTART pop hl :: pop de :: add hl de :: push hl ASMEND ;
или напрямую указать коды операций (в данном случае для Z80), что проще:
: + OPSTART E1 D1 19 E5 OPMEND ;
где ASMSTART-ASMEND и OPSTART-OPMEND — встроенные слова, созданные для этой цели.
В настоящее время «+» встроен в код интерпретатора, как и другие арифметические, логические и битовые операции.
Слова, определенные в машинном коде, иногда называют «примитивами» или «определениями кода». Очевидно, что в принципе невозможно стандартизировать способ определения поведения такого слова.
И хотя стандарт определяет код слова для создания нового примитива, поведение этого примитива определяется способом, определяемым реализацией.
Типичное использование:
code foo ( x1 -- x2 )
\ assembler code
\ syntax/language is defined by the Forth system
\ ...
end-code
Как говорит Рувим, обычно для этой цели используются CODE
и END-CODE
, аналогично :
и ;
.
Кроме того, распространенным способом реализации ассемблера на Форте является использование отдельного словаря или списка слов с именем вроде ASSEMBLER
, содержащего слова, соответствующие мнемонике ассемблера. Это прекрасно подходит для ассемблера синтаксиса RPN. Так, например, HL
можно определить в этом словаре как константу, а POP
как слово, которое собирает инструкцию pop, используя значение из вершины стека для определения операнда регистра. Тогда ваше определение +
могло бы выглядеть примерно так:
ASSEMBLER ALSO
CODE + ( x y -- sum )
HL POP
DE POP
DE HL ADD
HL PUSH
END-CODE
Что касается ASSEMBLER ALSO
— обычно CODE
сам добавляет ASSEMBLER
в порядок поиска, а END-CODE
восстанавливает порядок поиска. Поэтому нет необходимости делать это явно.
Не совсем. Каждый Форт делает это так, как ему хочется.