Forth http://fforum.winglion.ru/ |
|
SPF/Linux http://fforum.winglion.ru/viewtopic.php?f=18&t=800 |
Страница 7 из 10 |
Автор: | Mihail [ Пт авг 16, 2013 21:31 ] |
Заголовок сообщения: | Re: SPF/Linux |
VoidVolker писал(а): getmyip на вход ничего не принимает Еще я к ACCEPT добавил S , а 6 на 7 не исправил.Код: fdef("SACCEPT",7,0,SACCEPT) mov %eax,%edi jmp c_accept fdef("C_SERV",6,0,C_SERV) mov %eax,%edi jmp c_serv fdef("MYIP",4,0,MYIP) call DUP jmp getmyip VoidVolker писал(а): Как/чем его пересобрать? $ make Так и собираю. make clean на всякий случай делаю. |
Автор: | VoidVolker [ Пт авг 16, 2013 22:35 ] |
Заголовок сообщения: | Re: SPF/Linux |
Mihail писал(а): Код: fdef("MYIP",4,0,MYIP) call DUP jmp getmyip А DUP для получения результата функции на вершине стека, правильно? Т.е. в регистре eax. Mihail писал(а): VoidVolker писал(а): Как/чем его пересобрать? $ make Так и собираю. make clean на всякий случай делаю. Ага, вот оно как - а у меня без clean не пересобирается почему-то. Таки пересобралось =) Отлично, сокеты стартуют. Теперь многопоточность - под линуксом это fork и clone. Это тоже все надо подключать как си библиотеку? |
Автор: | Mihail [ Сб авг 17, 2013 11:01 ] |
Заголовок сообщения: | Re: SPF/Linux |
VoidVolker писал(а): А DUP для получения результата функции на вершине стека, правильно? Т.е. в регистре eax. Правильно. При использовании TOS для выделения элемента на стеке, перемещение указателя не достаточно . Нежно еще скопировать TOS. VoidVolker писал(а): Это тоже все надо подключать как си библиотеку? Проще всего, взять пример не Си и вызвать его из Форта. |
Автор: | VoidVolker [ Сб авг 17, 2013 12:06 ] |
Заголовок сообщения: | Re: SPF/Linux |
Mihail писал(а): Проще всего, взять пример на Си и вызвать его из Форта. Да, примерно так я и хочу сделать. Вот тут кстати нашел форк для gForth: https://github.com/ayrnieu/forth-garden ... th/fork.fs Как видно - там си-либы вызываются прямо в форт-коде. |
Автор: | Hishnik [ Сб авг 17, 2013 16:03 ] |
Заголовок сообщения: | Re: SPF/Linux |
mgw писал(а): Получается, что 32 разрядов не хватает для точности расчетов, правильно я понял? Почти так. Дело обычно не в самой точности как таковой (32 разряда - это довольно много), а в динамическом диапазоне. Допустим, нам надо обеспечить ошибку в 1%. Мгновенно прикинув в уме, мы можем решить, что хватит и одного байта (и даже 7 бит), потому что достаточно записывать числа от 0 до 100. Но это неправильный подход, потому что так мы обеспечим ошибку в 1% только при максимальном значении измеряемого параметра. А если наши числа будут болтаться в диапазоне 2-3? Тогда отклонение в единицу даст 50 или 33% ошибки. Но если мы добавим разрядов справа, превратив 2-3 в 200-300, то максимальное значении 100 превратится уже в 10 000. В цифровой обработке сигналов итоговая разрядность определяется не только разрядностью АЦП (для скоростных АЦП она обычно не превышает 12-14) и разрядностью коэффициентов фильтров, но и количеством коэффициентов. 12 бит, умноженные на 16, дадут уже 28-разрядный результат. Если мы возьмем 16 коэффициентов, это добавляет еще 4 бита к возможному значению. Получается 32 разряда в наихудшем случае, когда амплитуда обрабатываемого сигнала максимальна. Здесь есть не такое уж большое пространство для маневра (например, не все коэффициенты равны максимальному числу), но уже вот этот пример с отнюдь не предельными характеристиками не особо влезает в 32 бита. mgw писал(а): Пример задачи на ФОРТЕ, в которой не хватает памяти, просто интересно. Синтез фильтров высоких порядков, разнообразные задачи численного моделирования методом конечных элементов. |
Автор: | VoidVolker [ Вс авг 18, 2013 10:49 ] |
Заголовок сообщения: | Re: SPF/Linux |
Mihail Makefile Код: CC=gcc LIBS = -ldl -m64 all: spf64 spf64: main.o amain.o sopen.o clibs.o $(CC) -o spf64 amain.o main.o sopen.o clibs.o $(LIBS) -Wl,-Map,messy.map objdump -h -S -C -r spf64 > spf64.lss main.o: main.c $(CC) -c -g -m64 -mtune=i686 main.c objdump -x -S main.o > main.lss sopen.o: spf/sopen.c $(CC) -c -g -m64 -mtune=i686 spf/sopen.c clibs.o: clibs.c $(CC) -c -g -m64 -mtune=i686 clibs.c amain.o: spf/amain.S spf/img.s $(CC) -c -g -m64 -mtune=i686 spf/amain.S spf/img.s: spf/src/linux/*.f spf/src/compiler/*.f spf/src/*.f spf/_mak/djgpp/gdis.f spf/bbuild.sh clean: -rm -f spf64 -rm -f *.o Баг в длине строки в amain.S: Код: fdef("_SLITERAL-CODE",0xA ,0 ,_SLITERALsubCODE) А должно быть: Код: fdef("_SLITERAL-CODE",14 ,0 ,_SLITERALsubCODE) Еще: Код: fdef("VALUE-CODE",0xE , 0, VALUEsubCODE) fdef("'TYPE",7 ,0,ticTYPE ) fdef("REPOSITION-FILE",9,0 ,REPOSITIONsubFILE) fdef("'(ABORT'')",7,0,ticcABORTdticcend) fdef("_QUSER-VALUE-CODE",0x10 ,0 ,_QUSERsubVALUEsubCODE) Код: fdef("VALUE-CODE",10 , 0, VALUEsubCODE) fdef("'TYPE",5 ,0,ticTYPE ) fdef("REPOSITION-FILE",15,0 ,REPOSITIONsubFILE) fdef("'(ABORT'')",10,0,ticcABORTdticcend) fdef("_QUSER-VALUE-CODE",17 ,0 ,_QUSERsubVALUEsubCODE) И как сохранить форт-программу в бинарник? Как передать более одного параметра со стека в си-функцию? Почему отключено USER-VALUE? Не работает? Что с кодировками? В некоторых файлах часть комментариев нормально отображается, а часть - квадратиками. main.c:261: Код: s_open(8880,"localhost"); Зачем? Почему-то во время выхода через BYE оно выдает "connect err". amain.s:914 Код: fdef("CLOSE-FILE",10,0 ,CLOSEsubFILE) mov %eax,%edi call read retq Так вот почему оно ошибку выдает при попытке закрыть что-то ) |
Автор: | VoidVolker [ Вс авг 18, 2013 21:12 ] |
Заголовок сообщения: | Re: SPF/Linux |
Поймал какой-то странный глюк второй раз уже: Код: $ make ... spf/bbuild.sh rm: невозможно удалить «img.ss»: Нет такого файла или каталога mv: не удалось выполнить stat для «img.s»: Нет такого файла или каталога spf/bbuild.sh: 4: spf/bbuild.sh: ./spforig: not found Хотя тот же spforig на месте, копирование из бэкапа этих файлов не дает ровным счетом никакого эффекта. Этот глюк возникает при изменении любого файла из каталога spf/src - даже если содержимое не менялось, т.е. просто при сохранении файла. Специально проверял - исходный и сохраненный файл совпадают байт-в-байт. Это как так? Попробовал просто изменить дату файла - результат такой же. |
Автор: | VoidVolker [ Пн авг 19, 2013 09:16 ] |
Заголовок сообщения: | Re: SPF/Linux |
Добавил fork() - работает. Как отключить новый дочерний процесс от консоли - чтобы он не принимал данные с консоли? А при попытке его остановить из спф-а приводят к непрерывному цикличному выводу Ok в консоли. |
Автор: | Mihail [ Пн авг 19, 2013 12:24 ] |
Заголовок сообщения: | Re: SPF/Linux |
VoidVolker писал(а): Добавил fork() - работает. Как отключить новый дочерний процесс от консоли - чтобы он не принимал данные с консоли? Для PFE был пример сокет сервера с fork-ом. Что-то ненайти. fork по сути 2-й запуск той-же программы. Т.ч. по моему, он не особо и нужен. В fpauk.6 есть пример использования pthread на Си. Можно использовать для LinuxSPF64. Только для нового потока, в r14d нудно записать его базу для юзоровских переменных. |
Автор: | VoidVolker [ Пн авг 19, 2013 12:40 ] |
Заголовок сообщения: | Re: SPF/Linux |
А остальные вопросы? Mihail писал(а): Для PFE был пример сокет сервера с fork-ом. Это-то у меня уже давно есть. Mihail писал(а): fork по сути 2-й запуск той-же программы. Т.ч. по моему, он не особо и нужен. Как это не нужен?! Нужен конечно - сегодня все процессоры многоядерные. А в сокет-сервере в любом случае нужна многопоточность и параллельная обработка запросов. Тем более в линуксе два основных способа создания потоков - fork и clone. Mihail писал(а): Только для нового потока, в r14d нудно записать его базу для юзоровских переменных. А откуда взять её? Можно пример? Не работает ZTYPE: Код: CREATE n 0x3132333435363738 , 0 , n ZTYPE А как в сишной функции вызвать форт процедуру? Для clone(). |
Автор: | Mihail [ Пн авг 19, 2013 13:54 ] |
Заголовок сообщения: | Re: SPF/Linux |
VoidVolker писал(а): А в сокет-сервере в любом случае нужна многопоточность и параллельная обработка запросов. Да. Решать эту проблему вызовом нового приложения не удобно из за необходимости передавать ему параметры. VoidVolker писал(а): Mihail писал(а): Только для нового потока, в r14d нудно записать его базу для юзоровских переменных. А откуда взять её? Можно пример? Можно выделить на вершине кодофайла Код: CREATE NEW-UP USER-HERE ALLOT Можно аллокировать Код: USER-HERE ALLOCATE THROW VALUE NEW-UP Потом не плохо было-бы проинициализировать значениями главного потока. Код: R0 CONCTANT OPERATOR OPERATOR NEW-UP USER-HERE MOVE VoidVolker писал(а): Код: s_open(8880,"localhost"); Зачем? Почему-то во время выхода через BYE оно выдает "connect err". a Это я смотрел, как s_open передаются параметры. |
Автор: | VoidVolker [ Пн авг 19, 2013 14:24 ] |
Заголовок сообщения: | Re: SPF/Linux |
Mihail писал(а): Да. Решать эту проблему вызовом нового приложения не удобно из за необходимости передавать ему параметры. Ну а как иначе передать ему номер сокета для приема входящих данных? И вообще - форк, это не запуск нового приложения, а частичное копирование уже запущенного процесса. Для запуска приложений используется execve(). Это в винде есть процессы и потоки, а в линуксе - и процесс и поток по сути одно и то же. После вызова fork() управление возвращается одновременно и родителю и потомку, но с разными параметрами на стеке - родитель получает ноль, а потомок - свой ID. Я вот хочу еще clone сделать - но ему нужно передавать функцию стартовую. Не хватает 2OVER, D=. Ошибка в amain.S:276 Код: fdef("w!",2,0,Wsave)
|
Автор: | Mihail [ Пн авг 19, 2013 16:23 ] |
Заголовок сообщения: | Re: SPF/Linux |
VoidVolker писал(а): Не хватает 2OVER, D= В http://fpauk.narod.ru/gfwords.html можно взять. |
Автор: | VoidVolker [ Пн авг 19, 2013 17:20 ] |
Заголовок сообщения: | Re: SPF/Linux |
Mihail писал(а): В http://fpauk.narod.ru/gfwords.html можно взять. Что-то там нет ассемблерного определения 2OVER. Так что на счет остальных вопросов? См. ЛС. VoidVolker писал(а): И как сохранить форт-программу в бинарник?
Как передать более одного параметра со стека в си-функцию? Почему отключено USER-VALUE? Не работает? Как отключить новый дочерний процесс от консоли - чтобы он не принимал данные с консоли? А при попытке его остановить из спф-а приводят к непрерывному цикличному выводу Ok в консоли. Как в сишной функции вызвать форт процедуру? Для clone(). Что с кодировками? В некоторых файлах часть комментариев нормально отображается, а часть - квадратиками. Код: $ make ... spf/bbuild.sh rm: невозможно удалить «img.ss»: Нет такого файла или каталога mv: не удалось выполнить stat для «img.s»: Нет такого файла или каталога spf/bbuild.sh: 4: spf/bbuild.sh: ./spforig: not found Этот глюк возникает при изменении любого файла из каталога spf/src - даже если содержимое не менялось, т.е. просто при сохранении файла. Еще бы сделать вывод нормального сообщения об ошибке - номер строки в файле и позиция. Нету USER-VECT. |
Автор: | VoidVolker [ Пн авг 19, 2013 21:13 ] |
Заголовок сообщения: | Re: SPF/Linux |
Mihail писал(а): в r14d нудно записать А как? Можно пример? |
Страница 7 из 10 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |