Forth
http://www.fforum.winglion.ru/

Nova Дневник разработчика
http://www.fforum.winglion.ru/viewtopic.php?f=58&t=3227
Страница 11 из 14

Автор:  Victor__v [ Вс янв 16, 2022 16:53 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Вроде бы закончил проверку форт-образа.
В основном боролся с косяками, возникшими из-за собственной невнимательности.

Например, в Нове имеется возможность создать дополнительные точки входа в слово. Благодаря этому можно реализовывать "поведение по умолчанию" или же запихнуть в одно определение несколько похожих слов. Короче, просто удобство.
Я вот просто не ожидал, что при определении такого слова забуду :shuffle; проставить соответствующие метки. Как итог в образе вызовы компилировались хрен пойми куда (я знаю куда, но это сути не меняет).

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

Сейчас образ построен так, что переменные находятся в отдельном хипе. Однако из этого правила есть несколько исключений, а именно переменные USER-OFFS <MAIN> TITLE. Они сделаны через CREATE в основном пространстве кода.

Теперь основная задача заключается в том, чтобы свопнуть пространства данных, словарей и словарных имен в образ.
Как это сделать:
1) Использовать функционал из самого образа, заодно и проверка на ошибки в случае чего. Недостатки: может тупо не подойти, я же работаю с виртуальными адресами.
2) Писать своп для ЦК.

Автор:  Victor__v [ Вс янв 16, 2022 16:59 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Вот полуразобранный образ кода форт-системы.

Можно из него вырезать коды для примитивов)

Вложения:
forth.zip [54.92 Кб]
Скачиваний: 515

Автор:  Victor__v [ Ср фев 23, 2022 11:23 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Всё-таки писать своп лень...
Особенно это касается свопа пространства словарных имен.

Думаю, вообще отказаться от этого пространства.
Варианты действий:

А) Только хеш от имени, только хардкор.
Особенности: не надо будет писать слово WORDS
Потенциальная отладка станет еще тем шилом в одном месте.
Словарная структура станет меньше.

Б) Хранить строку прямо в словарной структуре.
Особенности: если не извращаться, длина слова должна быть стабильной.
Замерил. Сейчас в Нове максимальная длина слова, но которую решилась моя фантазия – 22 байта. В теории можно поставить 32 байта для максимума и забить на это. Но закон подлости обязательно подкинет что-то этакое. Вдруг приспичит хранить имена в UTF8?

В) Хранить смещения до строки в NFA (смещение относительно пространства словарных имен).
Особенности: немного усложнится вывод имени слова, т. к. слово не знает к какому словарному пространству оно принадлежит (знает лишь словарь), однако перемещать пространство словарных имен можно будет без корректировки.

Г) Хранить смещения до строки в NFA (смещение относительно пространства словарных структур).
Особенности: поскольку длина структуры плавающая из-за возможности создания доп. точек входа сей момент надо как-то разграничить.

Автор:  Victor__v [ Ср мар 02, 2022 11:12 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Ещё варианты хранения строк.

Д) Хранить строки в хипе.
Особенности: простота реализации, сложность поддержки большая связь с ОС, изолированные словари могут пострадать при свопе. Усложнена реализация условного FORGET (да-да иногда похожее слово таки требуется). И, конечно, же потенциальные утечки памяти.
Всё-таки проще следить за одним слоном, чем за оравой мышей.

Е) Хранить строки в пространстве кода.
Особенности: делаем то, от чего хотели избавиться)


\\\\\\\\\\\\\\\\\\\\\

Сейчас в Нове задействован вариант со смещением относительно пространства словарных имён (вариант В).
Еще одна проблема данного варианта: если кто-то додумается привязать цепочки поиска между словарями из разных пространств (между врем. словарями, например), то слово WORDS будет выводить некорректные имена. На сам механиз поиска это не повлияет, слава хешированию :)

/////////////////////

Замерил, сейчас общий размер пространства словарных имён 2 кб. Поскольку часть имён пересекаются (ALLOT и RALLOT, например), то немного пошаманив можно снизить начальный размер словарного пространства.
В общем, незначительная оптимизация на будущее.

Автор:  Victor__v [ Чт мар 03, 2022 09:33 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Наконец-то перешел к дебаггингу)

Неожиданно споткнулся в самом начале.
слово USER-OFFS сделано через CREATE
Посмотрел вечером код. Он в принципе корректный, почему возникает ошибка непонятно. Будем возиться.


Особенности сборки.
Изначально я планировал создать в фасме EXE, а потом с помощью форта скрепить это все в месте, меняя в образе нужные параметры. Однако винда ругалась на такой фортель и говорила мне, что EXE повреждён) Пришлось офраз форта компилировать через фасм. Хотя бы не ругается. Надо будет потом найти причину, по которой на форте не получилось.

Автор:  Victor__v [ Пт мар 04, 2022 10:25 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Продолжаю дебаггинг своего форта)

Найденные и исправленные ошибки

Вызов GetProcAddress LoadLibraryA

Это часть писалась на фасме и выглядела примерно так
CALL QWORD [401000h]

Однако что-то пошло не так и скомпилировалось
CALL QWORD [800000h]

Я не знаю почему.

Переписал вызов этих слов иначе
MOV RAX, 401000h
CALL QWORD [RAX]

Вот на это дебаггер не ругался и то хорошо.

Исправил ошибку в слове VOCS-ITER:

Также немножко пришлось перестроить слово инициализации. Я не учёл, что инициализация вызовов API требует подготовленного контекста словарей. Но это мелочи.

Автор:  Victor__v [ Вс мар 06, 2022 20:35 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

На данный момент полностью исключил из старта переинициализацию внешних функций (изначальная инициализация осталась).
Слово не очень простое. Я буду отлаживать его потом вживую. В отладчике хрен поймёшь из-за чего вылеты.

По поводу простой инициализации. За неё отвечает слово (init-API).
С ним пришлось помучиться. Было несколько огрехов.
Но вот я столкнулся с непредвиденным поведением процессора (или отладчика, хз).

Суть:
MOV RDX, [RBX+CELL] ; ЗАСОВЫВАЕМ В RDX АДРЕС ИМЕНИ АПИ-ФУНКЦИИ.
Вот только к обычному адресу там присоединяется непонятный байт 0xCC.
Нормальный адрес 0x00 00 00 00 00 40 20 00
Что выходит 0xCC 00 00 00 00 40 20 00

Поскольку я не заморачивался оптимизацией, то предполагаю, что это из-за невыровненных адресов. А так хз.
Кто-то сталкивался с подобным?

В общем, пока решил обойти эту проблему:
Цитата:

LEA RDX,[CELL+RBX] ; Тут какая-то херня. При простом мове он записывает в один из байтов CCh хз почему
MOV RDX, [RDX] ; так что так

Автор:  Victor__v [ Пн мар 07, 2022 13:34 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Ещё один косяк винды.
В 32-битной версии
LoadLibraryA одинаково жрал строки "KERNEL32" и "KERNEL32.DLL"

в 64-битной жрет только KERNEL32.DLL
на "KERNEL32" даёт просто вылет.

Ладно там свои косяки исправлять, но бороться вот с этим вот?

Автор:  Sotnik [ Пн мар 07, 2022 14:52 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Victor__v писал(а):
Ещё один косяк винды.
Ладно там свои косяки исправлять, но бороться вот с этим вот?
Грабельки от майрософт. Удачи тебе! :)

Автор:  Victor__v [ Вт мар 08, 2022 13:32 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Кажется винда тут особо не виновата.
Судя по дампу, код из DLL берет себе дофига памяти на стеке, а его, блин, хватает. Отсюда вылеты, наверно.

Поскольку начало exe компилируется fasm'ом я применил там директиву stack, чтобы памяти было побольше, но судя по отладчику, это почему-то не работает.

А так вообще прикольно, что вызов API-функций вылетает в произвольных местах.

Автор:  Sotnik [ Вт мар 08, 2022 20:55 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Victor__v писал(а):
А так вообще прикольно, что вызов API-функций вылетает в произвольных местах.
Еррата какая есть на это дело?

Автор:  Victor__v [ Ср мар 09, 2022 17:26 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Sotnik писал(а):
Victor__v писал(а):
А так вообще прикольно, что вызов API-функций вылетает в произвольных местах.
Еррата какая есть на это дело?

Access violation

Код вылета, ЕМНИП:
MOVAPS XMM0, [RSP+50h]

Автор:  Sotnik [ Ср мар 09, 2022 18:19 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Victor__v писал(а):
вылетает в произвольных местах.
Это же не только у тебя, значит кто-то по этим грабелькам ходил.

Автор:  Victor__v [ Чт мар 10, 2022 18:20 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

Сегодня для себя внезапно узнал, что в 64-битном интеле возможна адресация относительно RIP
Блин, закончу с отладкой форта перепишу часть кода с переменными.

При этом с RIP, если верить фасму, есть приколы

MOV RAX, RIP нельзя
LEA RAX, [RIP] можно

Автор:  Victor__v [ Чт мар 10, 2022 23:44 ]
Заголовок сообщения:  Re: Nova Дневник разработчика

В общем, надо было просто немного подумать.

Вот что пишет винда на своём сайте:

Цитата:
Большинство структур выровнены в соответствии с естественным выравниванием. Основные исключения — это указатель стека и память malloc или alloca, которые выравниваются до 16 байт


Блин, у меня вылет как раз чаще был в этом месте. Пришлось переписать обёртки. Теперь они ВСЕ выравниваются на 16 байт.

Вот почему я должен уделять время внутренним особенностям винды? Им что в падлу самим было выровнять участок перед операцией MOVAPS?

В общем на фасме обошёлся двумя макросами перед вызовами:

macro SKIP {
MOV RSI, RSP
SUB RSP, 15
SAR RSP, 4
SAL RSP, 4
SUB RSP, 32
}

macro OFF { MOV RSP, RSI }

Поскольку эти фрагменты теперь вызываются постоянно, то буду рад, если вы приведёте более быстрый код выравнивания, если вообще что-то есть быстрее сдвигов.

Надеюсь, с виндой проблем больше не будет. Мне ещё свои косяки исправлять.

Страница 11 из 14 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/