Forth http://www.fforum.winglion.ru/ |
|
Nova Дневник разработчика http://www.fforum.winglion.ru/viewtopic.php?f=58&t=3227 |
Страница 12 из 15 |
Автор: | Victor__v [ Пн мар 21, 2022 10:17 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Форт-система дошла до стадии, когда её можно отлаживать, выводя средствами форта что-то не печать. Форт внезапно проявил отладкоустойчивость) Выводил на печать числа. Функция WriteFile ,внезапно, дала код ошибки. Ещё имеющийся косяк – я как-то неправильно написал примитив для деления чисел. |
Автор: | chess [ Пн мар 21, 2022 14:40 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): Ещё имеющийся косяк – я как-то неправильно написал примитив для деления чисел. Может это поможет( все что касается деления - взято из Win64FasmForth Михаила Максимова ) Код: CODE FM/MOD
40A3A7 48 89 C1 mov rcx,rax 40A3AA 48 8B 55 00 mov rdx,$00[rbp] 40A3AE 48 89 D3 mov rbx,rdx 40A3B1 48 8B 45 08 mov rax,$08[rbp] 40A3B5 48 F7 F9 idiv rax,rcx 40A3B8 48 85 D2 test rdx,rdx 40A3BB 74 0B jz $40A3C8 40A3BD 48 31 CB xor rbx,rcx 40A3C0 79 06 jNs $40A3C8 40A3C2 48 FF C8 dec rax 40A3C5 48 01 CA add rdx,rcx 40A3C8 48 8D 6D 08 lea rbp,$08[rbp] 40A3CC 48 89 55 00 mov $00[rbp],rdx 40A3D0 C3 ret END-CODE ( 42 bytes 14 instructions ) CODE */MOD 40A36E 48 89 C1 mov rcx,rax 40A371 48 8B 45 00 mov rax,$00[rbp] 40A375 48 F7 6D 08 imul rax,$08[rbp] 40A379 48 F7 F9 idiv rax,rcx 40A37C 48 89 55 08 mov $08[rbp],rdx 40A380 48 8D 6D 08 lea rbp,$08[rbp] 40A384 C3 ret END-CODE ( 23 bytes 7 instructions ) CODE UM/MOD 40A337 48 89 C1 mov rcx,rax 40A33A 48 8B 55 00 mov rdx,$00[rbp] 40A33E 48 8B 45 08 mov rax,$08[rbp] 40A342 48 F7 F1 div rax,rcx 40A345 48 8D 6D 08 lea rbp,$08[rbp] 40A349 48 89 55 00 mov $00[rbp],rdx 40A34D C3 ret END-CODE ( 23 bytes 7 instructions ) CODE /MOD 40A305 48 89 C1 mov rcx,rax 40A308 48 8B 45 00 mov rax,$00[rbp] 40A30C 48 99 cwd 40A30E 48 F7 F9 idiv rax,rcx 40A311 48 89 55 00 mov $00[rbp],rdx 40A315 C3 ret END-CODE ( 17 bytes 6 instructions ) CODE MOD 40A2D4 48 89 C1 mov rcx,rax 40A2D7 48 8B 45 00 mov rax,$00[rbp] 40A2DB 48 99 cwd 40A2DD 48 F7 F9 idiv rax,rcx 40A2E0 48 8D 6D 08 lea rbp,$08[rbp] 40A2E4 48 89 D0 mov rax,rdx 40A2E7 C3 ret END-CODE ( 20 bytes 7 instructions ) CODE / 40A2A2 48 89 C1 mov rcx,rax 40A2A5 48 8B 45 00 mov rax,$00[rbp] 40A2A9 48 99 cwd 40A2AB 48 F7 F9 idiv rax,rcx 40A2AE 48 8D 6D 08 lea rbp,$08[rbp] 40A2B2 C3 ret END-CODE ( 17 bytes 6 instructions ) CODE U/ 40A1FB 48 89 C1 mov rcx,rax 40A1FE 48 8B 45 00 mov rax,$00[rbp] 40A202 48 31 D2 xor rdx,rdx 40A205 48 8D 6D 08 lea rbp,$08[rbp] 40A209 48 F7 F1 div rax,rcx 40A20C C3 ret END-CODE ( 18 bytes 6 instructions ) |
Автор: | Victor__v [ Чт апр 28, 2022 22:25 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
chess, скажем так, этот дизассемблер немного censored Правильно не cwd, а cqo Стоило исправить, как сразу же дошёл до режима интерпретации. Правда он сейчас ни транслирует ничего кроме пробела) |
Автор: | chess [ Пт апр 29, 2022 00:45 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Обращайте внимание не на название, а на значение байтов инструкции. |
Автор: | chess [ Пт апр 29, 2022 10:39 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): chess, скажем так, этот дизассемблер немного censored Правильно не cwd, а cqo Этот дизассемблер от Bernd Paysan я немного поправил для удобства пользования, но корректность мнемоник не проверял. Неточность по cwd ~ cqo исправил: Код: SEE /
CODE / 40A2A2 48 89 C1 mov rcx,rax 40A2A5 48 8B 45 00 mov rax,$00[rbp] 40A2A9 48 99 cqo 40A2AB 48 F7 F9 idiv rax,rcx 40A2AE 48 8D 6D 08 lea rbp,$08[rbp] 40A2B2 C3 ret END-CODE ( 17 bytes, 6 instructions ) |
Автор: | Victor__v [ Сб апр 30, 2022 23:00 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Понял почему у меня функции WriteFile и ReadFile работали в зависимости от фаз Луны. Я умудрился прошляпить тот момент, что кода параметров больше 4, то стек надо выравнивать с учётом доп. параметров. Не прошло и года, как говорится. Заодно и ошибки помельче пофиксил. Опять что ли уйти в сумрак? Код: HEADERS '(Ncall)'
POP RBX ; RBX указывает на структуру, где хранятся служебные данные MOV RCX, RAX ; засовываем первые 4 параметра MOV RDX, [RBP] ; MOV r8, [RBP+CELL] ; MOV r9, [2*CELL+RBP] ; LEA RBP, [3*CELL+RBP] MOV RAX, [3*CELL+RBX] ; тут у нас хранится оставшееся кол-во параметров MOV RSI, RSP ; сохраняем нормальную точку стека возвратов LEA r10, [RAX*8] ; сколько памяти надо выделить на стеке оставшимся параметрам. SUB RSP, r10 ; выделяем эту память SUB RSP, 15 ; выравнивание на 16 SAR RSP, 4 ; SAL RSP, 4 ; ADD RSP, r10 ; можно было сделать перемещение вида память->регистр->память, но мне было лень ncall: PUSH QWORD [RBP] LEA RBP, [RBP+CELL] DEC RAX JNZ ncall SUB RSP, 32 ; винда настолько плоха, что не может сама выделить себе 4 ячейки стека, делаем это вместо неё CALL QWORD [RBX] ; тут хранится либо код инициализации АПИ либо сам вызов MOV RSP, RSI ; нормализируем всю эту стековую вакханалию к нормальному состоянию RET |
Автор: | Victor__v [ Вт май 03, 2022 19:12 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Текущий статус: Выловил часть мелких багов. Теперь форт-система уверенно компилирует и интерпретирует данные. Однако за отладку механизма пространств еще не брался. Возникли непонятные сложности (опять) c API. На этот раз почему-то нельзя открывать/создавать файлы. Выскакивает ошибка 87 (неправильный параметр). Буду копать. Все остальное тут: https://vk.com/wall-114247189_218 |
Автор: | Victor__v [ Вс май 08, 2022 14:25 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Вести с полей. Своп и инициализация пространств работают штатно. Ещё поправил несколько мелких багов. По ходу придётся делать в словарном пространстве в LFA вместо адресов смещения, из-за чего придётся немного усложнить перебор слов или ещё как-то изващаться. |
Автор: | Victor__v [ Пн май 09, 2022 21:33 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Проблемы с пространством, где хранятся словарные структуры. Переписать указатели внутри при ресайзе кучи несложно, проблемы начинаются дальше. 1) Актуализация словарей. Если они принадлежат пространству, то меняем указатели в стеке словарей и переменной CURRENT Это несложно. 2) А что делать со словарями, чьи LFA были сохранены, например, в константы, какие-то массивы и пр? И, ЧСХ, подобные примеры у меня есть в коде. Поэтому, чтобы не извращаться и не извращать потенциальным пользователям мозг, я сделал выделение памяти под словарные пространства статичным. Сейчас выделяю 50 кб на это. Для сравнения почти 400 словарных структур словаря FORTH занимают чуть больше 17 кб. Возможно, стоит ужать размеры некоторых полей. Например, навряд ли смещение до имени слова будет занимать несколько триллиардов) а длина слов. структуры превысит 65000 байтов. Конечно, ужимать словарную структуру ради экономии памяти особенно 64-битах кажется тем еще извращением и навряд ли оно того стоит. Не говоря уж о том, что если в скомпилированной программе все эти структурки будут нафиг не нужны, то их можно спокойно выкинуть. Также проверял форт на баги. В качестве теста пробовал скомпилировать и проверить свою либу по локальным переменным. После нескольких часов причёсывания ошибки в форте были локализованы и устранены. Протестю форт ещё на паре либ и можно будет уже Новой делиться с общественностью) |
Автор: | mOleg [ Вт май 10, 2022 13:29 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): А что делать со словарями, чьи LFA были сохранены, например, в константы, какие-то массивы и пр? только одно, реализовывать ассоциативную память(пардон, называется как-то иначе, забыл правильное название, когда все адреса находятся в специальном массиве, хранящем реальные адреса, и вся работа ведется через этот массив, т.е. индексы а не реальные адреса) и не работать никогда с реальными адресами (конечно, будет медленнее). |
Автор: | Victor__v [ Вт май 10, 2022 13:41 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
mOleg писал(а): Victor__v писал(а): А что делать со словарями, чьи LFA были сохранены, например, в константы, какие-то массивы и пр? только одно, реализовывать ассоциативную память(пардон, называется как-то иначе, забыл правильное название, когда все адреса находятся в специальном массиве, хранящем реальные адреса, и вся работа ведется через этот массив, т.е. индексы а не реальные адреса) и не работать никогда с реальными адресами (конечно, будет медленнее). Я думал над этим. Можно, как вариант, хранить не LFA, а указатели на код словарей, но просто перолопачивать надо будет много исходников и либ. Поэтому решил сделать статику и не париться. |
Автор: | Victor__v [ Пн май 16, 2022 17:21 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
По прежнему фиксю косяки и пр. несуразицы. Например, исправил слова для деления беззнаковых чисел. Вопрос к нашему сообществу, посоветуйте какуе-нибудь Апи-функции, на которой можно калбеки протестить? |
Автор: | Victor__v [ Пт июн 03, 2022 17:15 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): По прежнему фиксю косяки и пр. несуразицы. Например, исправил слова для деления беззнаковых чисел. Вопрос к нашему сообществу, посоветуйте какуе-нибудь Апи-функции, на которой можно калбеки протестить? Лес рук) Сейчас все же думаю над корректностью словарей при изменении размеров пространства под словарного пространства. Всё-таки хочется, чтобы при изменении адреса словарного пространства LFA словаря оставался прежним. До чего я додумался: В пространстве будет чисто техническая запись (её не видно в поиске), которая ссылается на словарную структуру в пространстве кода. |
Автор: | Victor__v [ Ср сен 28, 2022 17:01 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Все лень покопаться в тестовой версии и сделать её нормальной. Только и делаю, что компилирую псевдофорт-код в уме, дабы все было красивенько по функциональчику. Как оно работает сейчас: Есть 4 пространства Код Данные (в которых нельзя хранить переменные, ибо чревато при определенных условиях) Словарных структур (в котором хрен знает как лучше хранить эти самые словарные структуры) Пространство имен словарных структур. До чего додумался: Есть 3 пространства Код Данные, где хранятся только строки и массивы Словарных структур При этом пространство словарных структур. будет работать так: 1-й уровень (программно не доступен, хе-хе, пользователю) -- Это массив указателей, собственно, на словарные структуры. 2-й уровень -- это эти самые словарные структуры. При этом ими можно манипулировать словами , ALLOT DW, и пр. Примерная реализация : (newWORD) WORD-STRUCT ALLOCATE THROW TO LAST-LFA WORD-STRUCT LAST-LFA L>lenFA ! CURRENT @ L>wordFA @ >R R@ mpos @ R@ mlen @ = IF R@ mlen @ 40 CELLS R@ mstart RESIZE THROW R@ mstart ! 40 R@ mlen +! THEN LAST-LFA R@ mpos @ CELLS R@ mstart @ + ! R> mpos 1+! ; : HERE .... LAST-LFA DUP L>lenFA @ + ; : DW, ... CELL LAST-LFA L>lenFA @ + LAST-LFA RESIZE THROW TO LAST-LFA HERE DW! CELL LAST-LFA L>lenFA +! ; В качестве LFA (ссылки на пред. слово в поиске) будет не реальный адрес, а индекс в массиве словарных структур. Адресация массива будет вестись от 1, а не от 0. Таким образом, можно в любой момент "переключиться" на работу с каждым отдельным словом, например, чтобы "дополнить информацию". Недостаток такого решения: нельзя будет напрямую связать поиск между словарями из разных пространств. Придется городить дополнительный огород. Идентификатором словаря в свою очередь будет отдельная структура из двух элементов (1-й указатель на управляющую структуру пространства, 2-й индекс слова в массиве). Также, поскольку тут и так уже все понасовано по кучам, имя слова будет храниться в хипе отдельно. |
Автор: | Victor__v [ Вт окт 18, 2022 18:10 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Продолжаю записывать свои измышлизмы, попутно пытаясь запустить проапгрейженный 64-битный форт собственного производства) Оптимизация готового образа с помощью псевдокода Сначала превращаем форт-код в псевдокод. Аля 10 CELLS CELL+ В NUM 10 WORD CELLS WORD CELL+ Потом перефигачиваем все это во что-то более приличное (например, в число 88 ) условный код обработчика: OPT: NUM+CELLS NUM-ANY WORD CELLS :>> p1 get-val CELLS p1 set-val p2 delete ; Более злобное использование словарного пространства. Сейчас там помимо структуры хранятся всякие доп. данные. Например, сведения для компиляции/исполнения TO и FROM, длине инлайн-слова, дополнительные точки входа в слово и пр. Есть и идея сделать словарное пространство каждого слово более динамическим в этом плане. Например, если в поле флагов есть флаг инлайна, то в словарной структуре ищется метка #INLINE и идущие за ними значения для компиляции инлайна. И таким образом со всеми другими интересными случаями. Плюсы: >> расширяемость и простота, а также наглядность даже в отладке. Минусы данного подхода: >> Прежде всего это дополнительные затраты поиск данных во время компиляции, а я не люблю доп. затраты во время компиляции. >> Закон Мёрфи, етить. Нельзя дать гарантию, что при поиске внутри словарной структуры не произойдёт коллизия. >>> Обход: после конца обязательной части слов. структуры идет значение флага (4 байта) и длинна поля под соответствующие данные (4 байта). Поиск и будет быстрее search и так проще. >> Непонятно что делать с полем флагов. По сути оно уже становится ненужным. Максимум чуть ускорит компиляцию, сразу показав, например, что такой-то фигни тут нет. >> Реализация POSTPONE. Просто дать указатель на словарную структуры не выйдет, поскольку там динамическая память. Текущий вариант со значением поля флагов и указателем на код гораздо проще. |
Страница 12 из 15 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |