Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб фев 16, 2019 18:10

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Еще один способ работы с параметрами на стеке
Автор Сообщение
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Жаль для Новы не подойдёт :(
Можно ещё для винды сделать стек областей в сегменте FS: (GS: если разрядность 64).
Сообщение Добавлено: Чт дек 27, 2018 09:29
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Oчередной вариант ориентирован на максимальное быстродействие.

Адрес начала стекового кадра данных сохраняем не в стеке возвратов, а в регистре ESI, т.к. он редко используется.
Перед переходом к слову, код которого портит ESI, сохраняем ESI в стеке возвратов PUSH ESI , и после возврата из кода такого
слова восстанавливам ESI из стека возвратов POP ESI.
Для ускорения присвоение данных между ячейками выбранного стекового кадра делаем через регистр EDX.

Код:
\ Собственно реализация
\ положить адрес выбранного самого нижнего параметра на стеке в регистр ESI
M: a>s \ n -- выбранное число параметров на стеке
   1- 4 * S=A S+P DROP ;
M: rs  RS=S ; \  положить ESI на стек возвратов
M: sr  S=RS ; \  снять со стека возвратов и положить в ESI

\ положить выбранный параметр на вершину стека или в EDX
M: 1>  DUP       A=@S ;    M: <1       D=@S ;
M: 2>  DUP $  -4 A=@S ;    M: <2 $  -4 D=@S ;
M: 3>  DUP $  -8 A=@S ;    M: <3 $  -8 D=@S ;
M: 4>  DUP $  -C A=@S ;    M: <4 $  -C D=@S ;
M: 5>  DUP $ -10 A=@S ;    M: <5 $ -10 D=@S ;
M: 6>  DUP $ -14 A=@S ;    M: <6 $ -14 D=@S ;
M: 7>  DUP $ -18 A=@S ;    M: <7 $ -18 D=@S ;
M: 8>  DUP $ -1C A=@S ;    M: <8 $ -1C D=@S ;
M: 9>  DUP $ -20 A=@S ;    M: <9 $ -20 D=@S ;
M: a>  DUP $ -24 A=@S ;    M: <a $ -24 D=@S ;
M: b>  DUP $ -28 A=@S ;    M: <b $ -28 D=@S ;
M: c>  DUP $ -2C A=@S ;    M: <c $ -2C D=@S ;
M: d>  DUP $ -30 A=@S ;    M: <d $ -30 D=@S ;
M: e>  DUP $ -34 A=@S ;    M: <e $ -34 D=@S ;
M: f>  DUP $ -38 A=@S ;    M: <f $ -38 D=@S ;

\ положить параметр с вершины стека или из EDX в выбранную ячейку стека
M: >1        @S=A DROP ;   M: 1<       @S=D ;
M: >2  $  -4 @S=A DROP ;   M: 2< $  -4 @S=D ;
M: >3  $  -8 @S=A DROP ;   M: 3< $  -8 @S=D ;
M: >4  $  -C @S=A DROP ;   M: 4< $  -C @S=D ;
M: >5  $ -10 @S=A DROP ;   M: 5< $ -10 @S=D ;
M: >6  $ -14 @S=A DROP ;   M: 6< $ -14 @S=D ;
M: >7  $ -18 @S=A DROP ;   M: 7< $ -18 @S=D ;
M: >8  $ -1C @S=A DROP ;   M: 8< $ -1C @S=D ;
M: >9  $ -20 @S=A DROP ;   M: 9< $ -20 @S=D ;
M: >a  $ -24 @S=A DROP ;   M: a< $ -24 @S=D ;
M: >b  $ -28 @S=A DROP ;   M: b< $ -28 @S=D ;
M: >c  $ -2C @S=A DROP ;   M: c< $ -2C @S=D ;
M: >d  $ -30 @S=A DROP ;   M: d< $ -30 @S=D ;
M: >e  $ -34 @S=A DROP ;   M: e< $ -34 @S=D ;
M: >f  $ -38 @S=A DROP ;   M: f< $ -38 @S=D ;

\ сохранить несколько верхних параметров стека в регистрах
: !2 B=@P ;
: !3 B=@P $ 4 C=@P ;
: !4 B=@P $ 4 C=@P $ 8 D=@P ;

\ удалить несколько верхних параметров со стека
: x1 $ 04 Pa ;
: x2 $ 08 Pa ;
: x3 $ 0C Pa ;
: x4 $ 10 Pa ;
: x5 $ 14 Pa ;
: x6 $ 18 Pa ;
: x7 $ 1C Pa ;
: x8 $ 20 Pa ;
: x9 $ 24 Pa ;
: xa $ 28 Pa ;
: xb $ 2C Pa ;
: xc $ 30 Pa ;
: xd $ 34 Pa ;
: xe $ 38 Pa ;

\ положить сохраненные в регистрах параметры на вершину стека
: @2 @P=B ;
: @3 @P=B $ 4 @P=C ;
: @4 @P=B $ 4 @P=C $ 8 @P=D ;


Код:
\ Примеры с измерением быстродействия
\ конкатенация строк в хипе
: S+ { a1 u1 a2 u2 \ a u }
  u1 u2 + DUP ALLOCATE THROW TO a TO u a1 a u1 MOVE a2 a u1 + u2 MOVE a u ;
: T_S+  1000 0 DO S" 123" S" abc" S+  2DROP LOOP ;

: s+ /`4[24+d(h)162362+4(VV)65:d_6'd ;
: T_s+  1000 0 DO S" 123" S" abc" s+  2DROP LOOP ;

DMETER T_S+
DMETER T_s+

\ мажоритар из 5 параметров на стеке
: MAJ5 { a b c d e }
a b = a c = AND    a b = a d = AND OR
a b = a e = AND OR a c = a d = AND OR
a c = a e = AND OR a d = a e = AND OR
b c = b d = AND OR b c = b e = AND OR
b d = b e = AND OR c d = c e = AND OR
;
: T_MAJ5  10000 0 DO 1 2 2 1 2 MAJ5 DROP LOOP ;

: maj5 /`5
/[12=13=&12=14=&|
/12=15=&|13=14=&|
/13=15=&|14=15=&|
/23=24=&|23=25=&|
/24=25=&|34=35=&|_5
;
: T_maj5  10000 0 DO 1 2 2 1 2 maj5 DROP LOOP ;

DMETER T_MAJ5
DMETER T_maj5

\ числа Фибоначчи
: FIBO 1 1 { n a b }
  n 0 DO b a b + TO b TO a LOOP b ;
: T_FIBO 100 0 DO 45 1 DO I FIBO DROP LOOP LOOP ;

: fibo 1 1 /`3[10$2'3"2+L_2 ;
: T_fibo 100 0 DO 45 1 DO I fibo DROP LOOP LOOP ;

DMETER T_FIBO
DMETER T_fibo


лог
Код:
154  MKCEK
106  MKCEK

204  MKCEK
193  MKCEK

222  MKCEK
181  MKCEK
Ok


PS.
1. Быстродействие по сравнению с SPF выше.
2. Коррекция слов, использующих стек возвратов при использовании таких локальных переменных не нужна.
Сообщение Добавлено: Ср дек 26, 2018 22:19
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Еще один вариант. Похож на используемый в SPF, но без пересылки параметров на стек возвратов.
На стек возвратов пересылаются только адреса выбранных областей на стеке параметров. Используется
факт асимметрии числа входных параметров и числа выходных параметров( входных гораздо больше чем выходных).
Код:
\ копия кода R@ для его последующей модификации при использовании внутри циклов со счетчиком

:NONAME $ -4 Pa @P=A $ 4 A=@X ;  CONSTANT r@  \ адрес копии кода R@

\ переопределение кода циклов со счетчиком
M: Do     DO    16 r@ 9 + C! ;
M: ?Do    ?DO   16 r@ 9 + C! ;
M: Loop   LOOP   4 r@ 9 + C! ;
M: +Loop  +LOOP  4 r@ 9 + C! ;

\ положить адрес зафиксированной области параметров на стеке параметров на стек возврата
M: a>r  4 * SP@ + >R ;

\ положить выбранный параметр из зафиксированной области параметров на стеке на вершину стека параметров
M: 1>  r@ EXECUTE       @ ;
M: 2>  r@ EXECUTE   4 - @ ;
M: 3>  r@ EXECUTE   8 - @ ;
M: 4>  r@ EXECUTE  12 - @ ;
M: 5>  r@ EXECUTE  16 - @ ;
M: 6>  r@ EXECUTE  20 - @ ;
M: 7>  r@ EXECUTE  24 - @ ;
M: 8>  r@ EXECUTE  28 - @ ;
M: 9>  r@ EXECUTE  32 - @ ;

\ положить параметр с вершины стека в выбранную ячейку зафиксированной области параметров на стеке
M: >1  r@ EXECUTE       ! ;
M: >2  r@ EXECUTE   4 - ! ;
M: >3  r@ EXECUTE   8 - ! ;
M: >4  r@ EXECUTE  12 - ! ;
M: >5  r@ EXECUTE  16 - ! ;
M: >6  r@ EXECUTE  20 - ! ;
M: >7  r@ EXECUTE  24 - ! ;
M: >8  r@ EXECUTE  28 - ! ;
M: >9  r@ EXECUTE  32 - ! ;

M: rx RDROP ;

\ сохранить несколько верхних параметров стека в регистрах
: !5 B=@P $ 4 C=@P $ 8 D=@P $ C S=@P ;
: !4 B=@P $ 4 C=@P $ 8 D=@P ;
: !3 B=@P $ 4 C=@P ;
: !2 B=@P ;

\ удалить несколько верхних параметров со стека
: x1 $ 04 Pa ;
: x2 $ 08 Pa ;
: x3 $ 0C Pa ;
: x4 $ 10 Pa ;
: x5 $ 14 Pa ;
: x6 $ 18 Pa ;
: x7 $ 1C Pa ;
: x8 $ 20 Pa ;
: x9 $ 24 Pa ;

\ положить сохраненные в регистрах параметры на вершину стека
: @5 @P=B $ 4 @P=C $ 8 @P=D $ C @P=S ;
: @4 @P=B $ 4 @P=C $ 8 @P=D ;
: @3 @P=B $ 4 @P=C ;
: @2 @P=B ;

\ Пример
: fibo \ n -- fn
  1 1
  3 a>r 1> 0
  ?Do 3> 3> 2> + >3 >2 Loop
  rx x2 ;

10 fibo

log
Код:
Ok ( 144 )

\ тоже на стенофорт
Код:
: fibo \ n -- fn
  1 1 /`3[10$332+:3:2L]_2 ;

PS.
Используется модификация кода путем изменения в нем одного байта.
При этом код для циклов со счетчиком работает и как раньше и по новому ( в отличие от SPF)
Сообщение Добавлено: Вс дек 16, 2018 22:50
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D

Это скорее не совсем извращения, а неординарный подход к проблеме.
Мне вот вспомнился процессор Z80 с двумя регистровыми парами, где нельзя сразу знать, какая именно активна...
Сообщение Добавлено: Ср апр 25, 2018 21:29
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Небольшое усовершенствование механизма качалки.
Иногда нужно дополнить набор параметров на исходном стеке небольшим количеством дополнительных параметров,
получаемых из исходных параметров на этом стеке.
Код:
: ~s   s1beg DUP S0 @ <> 60 AND + AddrSt ! ; \ после ~s параметры добавляются на тот же стек откуда они берутся
И тогда, например:
Код:
\ конкатенация строк в хипе
\        1  2  3  4    5 2+4
: s+ \ a1 u1 a2 u2 -- a u
  ~s 2> 4> + ALLOCATE THROW \ к существующим параметрам a1 u1 a2 u2 на исходном стеке добавляется
                                                \  адрес результирующей строки в хипе
  ~  1> 5> 2>      MOVE
     3> 5> 2> + 4> MOVE
     5> 2> 4> +
;
\ или стенографическая форма
\         1  2  3  4    5 2+4
: s+ \ a1 u1 a2 u2 -- a u
  /]24+h[152V352+4V524+ ; \ символ ']' это слово ~s
: tst
  S" 12 " S" AB " s+ S" cdef" s+   ;
tst TYPE

ПС. Интересный момент - полностью отсутствуют присвоения, все становится похожим на функциональный язык.
Не привожу примеры где параметры именуются произвольно - там все по-старому.
Сообщение Добавлено: Ср апр 25, 2018 16:55
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях"

Ну вот и нашелся ценитель мастерства :))
Сообщение Добавлено: Сб апр 14, 2018 18:23
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D
Сообщение Добавлено: Пт апр 13, 2018 22:03
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
А ничего так, что S0 это USER-переменная?

Ну так и задумано в SPF для поддержки многозадачности, а я не выключаю эту поддержку, закидывая значения адресов
оснований стеков 1 и 2 также в USER-переменную ( AddrSt ).
Victor__v писал(а):
А при вложенности качалка будет переключаться. Правильно понял?

Смысл качалки в чем? В том, что на исходном стеке лежат параметры, например так 1 2 3, где 1 - самый нижний параметр,
а 3 - самый верхний. Теперь мы начинаем выкладывать параметры с 1-го стека на второй в нужном нам порядке для обработки
этих выложенных на 2-ой стек параметров соответствующими процедурами-словами( второй стек перед этим очищается).
После обработки на 2-м стеке могут остаться новые параметры, которые в свою очередь могут быть выложены на 1-й стек,
также предварительно очищенный и т.д. Как такового вложения здесь не наблюдается.
В этом варианте нет нужды в словах типа SWAP OVER ROT >R R> и им подобным. Стеки рассматриваются как пары массив1-стек2,
а затем как стек1-массив2. На каком стеке мы остановимся не имеет значения, поэтому тут не вводится новый инструментальный контекст.
Сообщение Добавлено: Пт апр 13, 2018 20:44
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Код:
S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg

А ничего так, что S0 это USER-переменная?

А при вложенности качалка будет переключаться. Правильно понял?
Сообщение Добавлено: Пт апр 13, 2018 20:10
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Вспомнил еще одну свою-же старую идею варианта работы с параметрами на стеке - вариант, похоже наиболее для меня подходящий.
Код:
\ два стека параметров с одним указателем - "качалка"
             |<--60 байтов -->|
\ ------|----|---------|------|
\       sp1  s1beg     sp0    s0beg

S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg
USER AddrSt  s0beg AddrSt !
: ~  \ переключатель стеков
  S0 @ s0beg =
  IF   s1beg DUP s0beg
  ELSE s0beg DUP s1beg THEN
  AddrSt ! S0 ! SP!
;
: ~0 \ исходное сосстояние качалки
  s0beg DUP S0 ! SP! ;

: [1 AddrSt @  4 - @ ;
: [2 AddrSt @  8 - @ ;
: [3 AddrSt @ 12 - @ ;
: [4 AddrSt @ 16 - @ ;
: [5 AddrSt @ 20 - @ ;
: [6 AddrSt @ 24 - @ ;
: [7 AddrSt @ 28 - @ ;
: [8 AddrSt @ 32 - @ ;
: [9 AddrSt @ 36 - @ ;

: SumSq \ 1 2 -- 11* 22* +
~ [1 [1 * [2 [2 * + ;
\ тоже в стенографической форме
: SumSq \ 1 2 -- 11* 22* +
/[11*22*+ ; \ здесь символ '['  это переключатель стеков - слово ~

1 2 SumSq .

Пс. В принципе вариант безопасный - не надо помнить какой из 2-х стеков текущий(выходной), а какой входной.
По сравнению с предыдущим вариантом нет пересылки параметров единым массивом.
Сообщение Добавлено: Чт апр 12, 2018 23:00
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
mOleg писал(а):
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)

А обосновать можете?
Обычно, как раз наоборот считается.


юзверь должен использоваться для конечной задачи, которую решает форт.
А, к примеру, механизм лок. переменных, явно вспомогателен.
Если же новый стек активно используется в многопоточном приложении, то пусть будет.
Но ежели это что-то вспомогательное, стреляющее отсюда и до обеда, (лок. переменные) то смысл это в пользовательскую память засовывать?
Сообщение Добавлено: Ср янв 31, 2018 14:02
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
_KROL писал(а):
Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю?

похоже на то.
У тебя есть главный процесс, внутри него можно запустить еще несколько потоков, у которых будет общая память, за исключением как раз пользовательской области. Т.е. если у тебя крутится два потока, то изменение одной глобальной переменной будет влиять на другой.

Чем тебя пользовательская область памяти смущает мне не ясно, тем более, что стек каждого потока тоже в ней находится.
Сообщение Добавлено: Ср янв 31, 2018 14:00
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)
Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю?
Хоть несколько стеков объявлю, главное не то, что они в USER-области, а чтобы нормально взаимодействовали между собой (не перекрывая друг друга).
Сообщение Добавлено: Ср янв 31, 2018 11:53
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)

А обосновать можете?
Обычно, как раз наоборот считается.
Сообщение Добавлено: Ср янв 31, 2018 11:23
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
chess писал(а):
Зато не требуется переопределение ниже указанных слов для возможности использовать
локальные переменные внутри цикла DO LOOP и независимо от изменения
содержимого стека возвратов словами >R R> , ну и других слов создаваемых самостоятельно,
использующих стек возвратов
DO
?DO
LOOP
+LOOP
>R
R>
RDROP
2>R
2R>

Ну памяти-то в ПК предостаточно (например, кэш 3 уровня у меня для каждого из 8-ми поддерживаемых аппаратно потоков, аж 8 Мб).


Я смягчил это в своём форте введением механизма предкомпиляции.
К тому же в этом (доопределении) нет ничего сложного.
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)
Сообщение Добавлено: Ср янв 31, 2018 09:06

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


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