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

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

Обзор темы - Еще один способ работы с параметрами на стеке
Автор Сообщение
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Более логичный, и как следствие, более простой и оптимальный вариант.
Сохраняем выходные параметры в нужном порядке и в нужном количестве
в самом начале исходного стекового кадра стека параметров,
а затем укорачиваем стековый кадр до ячеек с сохраненными выходными параметрами.
Пример тот же.
Код:
: 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
Сообщение Добавлено: Ср апр 03, 2019 22:13
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Можно работать со стеком и на уровне инструкций процессора
Код:
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 )
Сообщение Добавлено: Вс мар 31, 2019 19:43
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
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. Кроме того не возникает необходимость присвоений, как при введении
локальных переменных, что также упрощает программирование.
Сообщение Добавлено: Пт мар 15, 2019 21:08
  Заголовок сообщения:  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

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


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