mOleg писал(а):
что дает эта работа, что можно сделать.
Само по себе внедрение Форта существенный этап освоения.
Я использовал своего рода корпоративную многозадачность.
ForthStep - процедура переключения имеет вмд
Код:
.globl ForthStep
ForthStep:
xchgl %eax,seax
xchgl %ebp,sebp
xchgl %esp,sesp
xchgl %edi,sedi
ret
Со стороны Форта она запускается в SLDKEY? которую вызывают KEY? KEY .
Со стороны QEMU запускается в sdl_refresh в msys\1.0\home\QEMU\sdl.c
Это обработчик событий для виртуальной машины.
Там-же работает драйвер клавиатуры для Форта - if(kbhit())KeyPut(getch());
Для вызова сишных функций из форта на этапе сборки системы,
ее имя нужно прописать в Файле: msys\1.0\home\QEMU\src\global.f
в виде переопределения ABORT. Т.к. исполнять ее нельзя и чтобы
исключить инлайн подстановку при компиляции.
В рантайме системы, сишные функции могут быть доступны по средствам
файла qemu.map. Если у функции есть параметры, перед вызовом нужно
положить параметры на стек возвратов в соответствии с сишной дисциплиной,
затем очистить стек возвратов.
Напирмер:
Вызаыв
void target_disas(FILE *out, target_ulong code, target_ulong size, int flags)
из msys\1.0\home\QEMU\disas.c
Имеет вид:
: REST ( addr len -- )
>R >R
stdout
DUP \ чтобы не испортить EAX
>R disas
DROP \ парамр не возвращается , восстанавливаем EAX
3RDROP ;
Где
: stdout ['] _imp___iob @ 0x20 + ;
_imp___iob взят из msys\1.0\mingw\include\stdio.h
в определении stdout .
Переменная _imp___iob в форте представлена как функция
т.к. в qemu.map процедуы и переменные представлены одинаково.
Т.о. тело QEMU для встроенного Форта - библиотека подпрограмм.
Три этом, доступны все данные в рантайме системы.