Начать с ASM TRIT.
Есть прекрасная книга для программистов "Языки программирования и методы трансляции" [1].
В этой книге автор опубликовал исходные тексты ассемблера, который можно быстро переписать для троичных типов данных.
Я написал автору книги Сергею Залмановичу и получил разрешение использовать исходный код копилятора "О" и ассемблера в проектах.
Исходные коды ассемблера можно забрать здесь: https://github.com/askfind/computer_lan ... MTABLE.PAS
Предлагаю предложить мнемокод будущего ассемблера ASM TRITМодульная структура ассемблера будет во многом повторять
конструкцию компилятора «О». Предусматриваются драйвер
исходного текста ( AsmText ), модуль для работы с таблицей имен
( AsmTable ), лексический анализатор ( AsmScan ). Это вспомога-
тельные модули. За собственно ассемблирование будет отвечать
AsmUnit , объединяющий функции распознавателя и генератора
кода. Модуль виртуальной машины используется, разумеется,
без всяких изменений. Отвечающий за реакцию на ошибки, мо-
дуль OError также применен неизменным.
Пример исходного кода ассемблера:
Code: Select all
IN ; X
IN ; X, Y
Loop: OVER ; X, Y, X
OVER ; X, Y, X, Y
Quit
IFEQ ; X, Y
OVER ; X, Y, X
OVER ; X, Y, X, Y
NoSwap
IFLT ; X, Y
SWAP ; Y, X
NoSwap:
OVER ; Min(X, Y), Max(X, Y), Min(X, Y)
SUB ;
Loop
GOTO ; X, Y
Quit: DROP ; X
0 ; X, 0
OUT
OUTLN
STOP
Code: Select all
procedure InitScan;
begin
cmd := 0;
EnterCode(cmStop, 'STOP' );
EnterCode(cmOut, 'OUT' );
EnterCode(cmOutLn, 'OUTLN' );
EnterCode(cmIn, 'IN' );
EnterCode(cmAdd, 'ADD' );
EnterCode(cmSub, 'SUB' );
EnterCode(cmMult, 'MULT' );
EnterCode(cmDIV, 'DIV' );
EnterCode(cmMOD, 'MOD' );
EnterCode(cmNeg, 'NEG' );
EnterCode(cmDup, 'DUP' );
EnterCode(cmDrop, 'DROP' );
EnterCode(cmSwap, 'SWAP' );
EnterCode(cmOver, 'OVER' );
EnterCode(cmLoad, 'LOAD' );
EnterCode(cmSave, 'SAVE' );
EnterCode(cmGoto, 'GOTO' );
EnterCode(cmIfEQ, 'IFEQ' );
EnterCode(cmIfNE, 'IFNE' );
EnterCode(cmIfLE, 'IFLE' );
EnterCode(cmIfLT, 'IFLT' );
EnterCode(cmIfGE, 'IFGE' );
EnterCode(cmIfGT, 'IFGT' );
{
EnterCode(cmEnter, 'ENTER' );
EnterCode(cmCall, 'CALL' );
EnterCode(cmRet, 'RET' );
EnterCode(cmSetBP, 'SETBP' );
EnterCode(cmGetBP, 'GETBP' );
EnterCode(cmLLoad, 'LLOAD' );
EnterCode(cmLStore, 'LSTORE' );
EnterCode(cmSP, 'SP' );
}
end;