Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс май 29, 2022 00:36

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 177 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12  След.
Автор Сообщение
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вс янв 16, 2022 16:53 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Вроде бы закончил проверку форт-образа.
В основном боролся с косяками, возникшими из-за собственной невнимательности.

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

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

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вс янв 16, 2022 16:59 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Вот полуразобранный образ кода форт-системы.

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


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

_________________
Цель: сделать 64-битную Нову под Винду
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Ср фев 23, 2022 11:23 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Всё-таки писать своп лень...
Особенно это касается свопа пространства словарных имен.

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

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

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

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Ср мар 02, 2022 11:12 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Ещё варианты хранения строк.

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

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


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

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

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Чт мар 03, 2022 09:33 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Наконец-то перешел к дебаггингу)

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


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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пт мар 04, 2022 10:25 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Продолжаю дебаггинг своего форта)

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

Вызов GetProcAddress LoadLibraryA

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

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

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

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

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

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вс мар 06, 2022 20:35 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
На данный момент полностью исключил из старта переинициализацию внешних функций (изначальная инициализация осталась).
Слово не очень простое. Я буду отлаживать его потом вживую. В отладчике хрен поймёшь из-за чего вылеты.

По поводу простой инициализации. За неё отвечает слово (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] ; так что так

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пн мар 07, 2022 13:34 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Ещё один косяк винды.
В 32-битной версии
LoadLibraryA одинаково жрал строки "KERNEL32" и "KERNEL32.DLL"

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пн мар 07, 2022 14:52 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 350
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 36 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
Ещё один косяк винды.
Ладно там свои косяки исправлять, но бороться вот с этим вот?
Грабельки от майрософт. Удачи тебе! :)

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт мар 08, 2022 13:32 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Кажется винда тут особо не виновата.
Судя по дампу, код из DLL берет себе дофига памяти на стеке, а его, блин, хватает. Отсюда вылеты, наверно.

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт мар 08, 2022 20:55 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 350
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 36 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
А так вообще прикольно, что вызов API-функций вылетает в произвольных местах.
Еррата какая есть на это дело?

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Ср мар 09, 2022 17:26 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Sotnik писал(а):
Victor__v писал(а):
А так вообще прикольно, что вызов API-функций вылетает в произвольных местах.
Еррата какая есть на это дело?

Access violation

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Ср мар 09, 2022 18:19 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 350
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 36 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
вылетает в произвольных местах.
Это же не только у тебя, значит кто-то по этим грабелькам ходил.

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Чт мар 10, 2022 18:20 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
Сегодня для себя внезапно узнал, что в 64-битном интеле возможна адресация относительно RIP
Блин, закончу с отладкой форта перепишу часть кода с переменными.

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Чт мар 10, 2022 23:44 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1206
Благодарил (а): 3 раз.
Поблагодарили: 15 раз.
В общем, надо было просто немного подумать.

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

Цитата:
Большинство структур выровнены в соответствии с естественным выравниванием. Основные исключения — это указатель стека и память 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 }

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

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

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 177 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB