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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Ср янв 31, 2018 14:00 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4997
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 20 раз.
Поблагодарили: 58 раз.
_KROL писал(а):
Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю?

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

Чем тебя пользовательская область памяти смущает мне не ясно, тем более, что стек каждого потока тоже в ней находится.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Ср янв 31, 2018 14:02 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 904
Благодарил (а): 1 раз.
Поблагодарили: 8 раз.
mOleg писал(а):
Victor__v писал(а):
А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение)

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


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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Чт апр 12, 2018 23:00 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Вспомнил еще одну свою-же старую идею варианта работы с параметрами на стеке - вариант, похоже наиболее для меня подходящий.
Код:
\ два стека параметров с одним указателем - "качалка"
             |<--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-х стеков текущий(выходной), а какой входной.
По сравнению с предыдущим вариантом нет пересылки параметров единым массивом.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Пт апр 13, 2018 20:10 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 904
Благодарил (а): 1 раз.
Поблагодарили: 8 раз.
Код:
S0 @      CONSTANT s0beg
S0 @ 60 - CONSTANT s1beg

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

А при вложенности качалка будет переключаться. Правильно понял?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Пт апр 13, 2018 20:44 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
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. На каком стеке мы остановимся не имеет значения, поэтому тут не вводится новый инструментальный контекст.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Пт апр 13, 2018 22:03 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 646
Благодарил (а): 6 раз.
Поблагодарили: 25 раз.
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Сб апр 14, 2018 18:23 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях"

Ну вот и нашелся ценитель мастерства :))

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Ср апр 25, 2018 16:55 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Небольшое усовершенствование механизма качалки.
Иногда нужно дополнить набор параметров на исходном стеке небольшим количеством дополнительных параметров,
получаемых из исходных параметров на этом стеке.
Код:
: ~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

ПС. Интересный момент - полностью отсутствуют присвоения, все становится похожим на функциональный язык.
Не привожу примеры где параметры именуются произвольно - там все по-старому.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Ср апр 25, 2018 21:29 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 359
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
diver писал(а):
Блин...вся тема - из серии - "а месье знает толк в извращениях" :D

Это скорее не совсем извращения, а неординарный подход к проблеме.
Мне вот вспомнился процессор Z80 с двумя регистровыми парами, где нельзя сразу знать, какая именно активна...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Вс дек 16, 2018 22:50 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Еще один вариант. Похож на используемый в 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)

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Ср дек 26, 2018 22:19 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
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. Коррекция слов, использующих стек возвратов при использовании таких локальных переменных не нужна.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Чт дек 27, 2018 09:29 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 904
Благодарил (а): 1 раз.
Поблагодарили: 8 раз.
Жаль для Новы не подойдёт :(
Можно ещё для винды сделать стек областей в сегменте FS: (GS: если разрядность 64).

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Пт мар 15, 2019 21:08 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Victor__v писал(а):
Жаль для Новы не подойдёт

Непонятно почему. Ничего нового для этого не требуется.

Добавил в поддержку использования модели стека с двумя указателями немного автоматики.
К примеру, всё таже конкатенация строк в хипе, теперь может быть выражена так:
Код:
\ номер-> 1  2  3  4
: S+   ( a1 u1 a2 u2 -- a u )
  /4[24+dh162V362+4V65]2 ;

Исходно на стеке 4 параметра. Для получения места под результирующую строку
получаем длину этой строки сложив длины исходных строк u1 u2 + ( 24+ ), затем дублируем
ее на стеке ( d это DUP ) для ALLOCATE THROW ( это h ).
После этого на стеке шесть параметров a1 u1 a2 u2 u a , где
u (пятый параметр) - длина результирующей строки,
a (шестой параметр) - адрес начала строки в дин. памяти.
Затем пересылаем с помощью MOVE (это V) сначала первую строку a1 u1,
затем вторую строку a2 u2, предварительно размещая на стеке необходимые для
MOVE параметры. Теперь на стеке остались 6 параметров a1 u1 a2 u2 u a.
Кладем на стек параметры 6 и 5 ( a u ). На стеке 8 параметров.
Сохраняем 2 верхних параметра в регистрах и удаляем оставшиеся 6 параметров,
затем кладем на стек 2 сохраненых параметра( ]2 ). На стеке теперь два параметра ( a u ),
что и требуется.
Автоматика здесь в том, что число удаляемых параметров не задается
программистом, а определяется по максимальному номеру параметра в определении.
В данном случае это 6.

PS.
1. Такой алгоритм передачи параметров между словами допускает полное исключение
слов типа SWAP, ROT, OVER, >R, R> и т.п., что упрощает программирование
без уменьшения эффективности кода программ.
2. Кроме того не возникает необходимость присвоений, как при введении
локальных переменных, что также упрощает программирование.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Вс мар 31, 2019 19:43 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Можно работать со стеком и на уровне инструкций процессора
Код:
0 VALUE gst
: NOTFOUND { a u \ s1 s2 c>pr }
a    C@ DUP TO s1 48  58 WITHIN
a 1+ C@ DUP TO s2 97 101 WITHIN
s2 112 = OR s2 115 = OR AND DUP TO c>pr
s1 97 101 WITHIN s2 48 58 WITHIN s2 97 101 WITHIN OR AND OR
u 2 = AND 0=
IF a u NOTFOUND EXIT THEN
c>pr
IF   s2 115 =
     IF   s1 48 - TO gst
     ELSE gst 1- s1 48 - - 4 * s2
          CASE 97 OF 0x458B ENDOF
               98 OF 0x5D8B ENDOF
               99 OF 0x4D8B ENDOF
              100 OF 0x558B ENDOF
              112 OF 0x6D8D ENDOF
          ENDCASE W, C,
     THEN
ELSE s2 97 101 WITHIN s2 97 101 WITHIN AND
     IF   s1 97 - 10 * s2 97 - +
          CASE 01 OF 0xD88B ENDOF
               02 OF 0xC88B ENDOF
               03 OF 0xD08B ENDOF
               10 OF 0xC38B ENDOF
               12 OF 0xCB8B ENDOF
               13 OF 0xD38B ENDOF
               20 OF 0xC18B ENDOF
               21 OF 0xD98B ENDOF
               23 OF 0xD18B ENDOF
               30 OF 0xC28B ENDOF
               31 OF 0xDA8B ENDOF
               32 OF 0xCA8B ENDOF
          ENDCASE W,
     ELSE gst 1- s2 48 - - 4 * s1
          CASE 97 OF 0x4589 ENDOF
               98 OF 0x5D89 ENDOF
               99 OF 0x4D89 ENDOF
              100 OF 0x5589 ENDOF
          ENDCASE W, C,
     THEN
THEN
;
\ Cинтаксис, cформированный вышеопределенным NOTFOUND:
\ регистры: a - eax, b - ebx, c - ecx, d - edx, p - ebp
\ ячейки стека: 1 2 3 .. n ( ячейка n находится в регистре eax ), nmax = 9
\ направление передачи --> ( с1 - из регистра с в ячейку 1, 4b - из ячейки 4 в регистр b, ab - из регистра a в регистр b )
\ установка указателя на ячейку ( 4p - установка указателя p на ячейку 4 )
\ установка кол-ва параметров на стеке( 6s - стек рассматриваем как 1 2 3 4 5 6, яч-ка 6 в регистре a )

\ Пример
: 2rot  \ 1 2 3 4 5 6 --> 3 4 5 6 1 2
  6s 4b a4 2a b2 1b 3c c1 5c c3 b5 ;

SEE 2rot

1 2 3 4 5 6   2rot

LOG
Код:
CODE 2rot
5F9D8B 8B5D04           MOV     EBX , 4 [EBP]
5F9D8E 894504           MOV     4 [EBP] , EAX
5F9D91 8B450C           MOV     EAX , C [EBP]
5F9D94 895D0C           MOV     C [EBP] , EBX
5F9D97 8B5D10           MOV     EBX , 10 [EBP]
5F9D9A 8B4D08           MOV     ECX , 8 [EBP]
5F9D9D 894D10           MOV     10 [EBP] , ECX
5F9DA0 8B4D00           MOV     ECX , 0 [EBP]
5F9DA3 894D08           MOV     8 [EBP] , ECX
5F9DA6 895D00           MOV     0 [EBP] , EBX
5F9DA9 C3               RET     NEAR
END-CODE
( 31 bytes, 11 instructions )

Ok ( [6].. 4 5 6 1 2 )

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Ср апр 03, 2019 22:13 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2129
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Более логичный, и как следствие, более простой и оптимальный вариант.
Сохраняем выходные параметры в нужном порядке и в нужном количестве
в самом начале исходного стекового кадра стека параметров,
а затем укорачиваем стековый кадр до ячеек с сохраненными выходными параметрами.
Пример тот же.
Код:
: s+ /4[24+dh162V362+4V5:26:1]2 ;

\ было 6 параметров на стеке, сохранили 5-й параметр в ячейке 2, 6-й в ячейке 1,
\ а затем укоротили стек до 2-х ячеек. Синтаксис тот же, семантика другая.

LOG
Код:
SEE s+

S" 123" S" abc" s+

CODE s+
5F9E67 8BF5             MOV     ESI , EBP
5F9E69 83C608           ADD     ESI , # 8
5F9E6C 8945FC           MOV     FC [EBP] , EAX
5F9E6F 8B46FC           MOV     EAX , FC [ESI]
5F9E72 0346F4           ADD     EAX , F4 [ESI]
5F9E75 8D6DFC           LEA     EBP , FC [EBP]
5F9E78 8945FC           MOV     FC [EBP] , EAX
5F9E7B 8D6DFC           LEA     EBP , FC [EBP]
5F9E7E E870B0FFFF       CALL    5F4EF3  ( hAlloc )
5F9E83 8945FC           MOV     FC [EBP] , EAX
5F9E86 8B4600           MOV     EAX , 0 [ESI]
5F9E89 8945F8           MOV     F8 [EBP] , EAX
5F9E8C 8B46EC           MOV     EAX , EC [ESI]
5F9E8F 8945F4           MOV     F4 [EBP] , EAX
5F9E92 8B46FC           MOV     EAX , FC [ESI]
5F9E95 8D6DF4           LEA     EBP , F4 [EBP]
5F9E98 E81EB4FFFF       CALL    5F52BB  ( Move )
5F9E9D 8945FC           MOV     FC [EBP] , EAX
5F9EA0 8B46F8           MOV     EAX , F8 [ESI]
5F9EA3 8945F8           MOV     F8 [EBP] , EAX  \ Press <enter> | q | any
5F9EA6 8B46EC           MOV     EAX , EC [ESI]
5F9EA9 0346FC           ADD     EAX , FC [ESI]
5F9EAC 8D6DF8           LEA     EBP , F8 [EBP]
5F9EAF 8945FC           MOV     FC [EBP] , EAX
5F9EB2 8B46F4           MOV     EAX , F4 [ESI]
5F9EB5 8D6DFC           LEA     EBP , FC [EBP]
5F9EB8 E8FEB3FFFF       CALL    5F52BB  ( Move )
5F9EBD 8B56F0           MOV     EDX , F0 [ESI]
5F9EC0 8956FC           MOV     FC [ESI] , EDX
5F9EC3 894600           MOV     0 [ESI] , EAX
5F9EC6 8D6D10           LEA     EBP , 10 [EBP]
5F9EC9 8B45FC           MOV     EAX , FC [EBP]
5F9ECC C3               RET     NEAR
END-CODE
( 102 bytes, 33 instructions )

Ok ( 7564484 6 )
TYPE
123abc Ok

Ссылка на модифицированный spf4, который поддерживает подобную
модель стека https://cloud.mail.ru/public/2fvr/4Q6VibKVi

_________________
С уважением, chess


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

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


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

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


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

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