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 Дневник разработчика |
Вроде бы закончил проверку форт-образа. В основном боролся с косяками, возникшими из-за собственной невнимательности. Например, в Нове имеется возможность создать дополнительные точки входа в слово. Благодаря этому можно реализовывать "поведение по умолчанию" или же запихнуть в одно определение несколько похожих слов. Короче, просто удобство. Я вот просто не ожидал, что при определении такого слова забуду проставить соответствующие метки. Как итог в образе вызовы компилировались хрен пойми куда (я знаю куда, но это сути не меняет). Так что потом взять на заметку прописать для этого механизма дополнительные средства контроля на всякий пожарный. Сейчас образ построен так, что переменные находятся в отдельном хипе. Однако из этого правила есть несколько исключений, а именно переменные USER-OFFS <MAIN> TITLE. Они сделаны через CREATE в основном пространстве кода. Теперь основная задача заключается в том, чтобы свопнуть пространства данных, словарей и словарных имен в образ. Как это сделать: 1) Использовать функционал из самого образа, заодно и проверка на ошибки в случае чего. Недостатки: может тупо не подойти, я же работаю с виртуальными адресами. 2) Писать своп для ЦК. |
Автор: | Victor__v [ Вс янв 16, 2022 16:59 ] | ||
Заголовок сообщения: | Re: Nova Дневник разработчика | ||
Вот полуразобранный образ кода форт-системы. Можно из него вырезать коды для примитивов)
|
Автор: | 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/ |