Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт дек 14, 2017 14:19

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Еще один способ работы с параметрами на стеке
СообщениеДобавлено: Вс сен 17, 2017 22:10 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2095
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Код:
\                    |  inp n  | par |  исходный стек
\ | out | free (К-n) |  inp n  | par |  промежуточный стек - par - незатрагиваемые пар-ры
\                        | out | par |  конечный стек

: stack ( n -- )  CREATE HERE , CELLS ALLOT ;
  256 stack locst

\ переложить со стека параметров на стек
: >cs ( x -- | cs: -- x) locst CELL OVER +! @ ! ;

\ скопировать со стека на стек параметров
: cs@ ( cs: x -- x | -- x) locst @ @ ;

\ убрать верхний со стека
: cs-drop ( cs: x --) locst DUP DUP @ = INVERT IF CELL NEGATE SWAP +! THEN ;

\ переложить со стека на стек параметров
: cs> ( cs: x -- | -- x) cs@ cs-drop ;

: bs ( N -- )  >R DEPTH CELLS >R S0 @ >cs S0 @ R> - R> CELLS + DUP >cs 15 CELLS - SP! SP@ S0 !  ;
: p ( n -- An ) CELLS NEGATE cs@ +  ;
: es DEPTH CELLS >R cs@ 15 CELLS - R@ - cs@ R@ - R@ MOVE cs> cs> S0 ! R> - SP! ;

: 1>  1 p @ ;   : >1  1 p ! ;
: 2>  2 p @ ;   : >2  2 p ! ;
: 3>  3 p @ ;   : >3  3 p ! ;
: 4>  4 p @ ;   : >4  4 p ! ;
: 5>  5 p @ ;   : >5  5 p ! ;
: 6>  6 p @ ;   : >6  6 p ! ;
: 7>  7 p @ ;   : >7  7 p ! ;
: 8>  8 p @ ;   : >8  8 p ! ;
: 9>  9 p @ ;   : >9  9 p ! ;
: a> 10 p @ ;   : >a 10 p ! ;
: b> 11 p @ ;   : >b 11 p ! ;
: c> 12 p @ ;   : >c 12 p ! ;
: d> 13 p @ ;   : >d 13 p ! ;
: e> 14 p @ ;   : >e 14 p ! ;
: f> 15 p @ ;   : >f 15 p ! ;

: Pr1
  3 bs
    1> 2> * 1> 3> * 2> 3> *
       3 bs 1> 2> + 1> 3> +
         es
         10
       2 bs 2> 1> +
         es 11
    es ;
1 2 3 4 Pr1

LOG
Код:
Ok ( 1 14 28 11 )

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2095
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Тот же пример.
Обозначенная выше модель работы с параметрами на стеке с локальным именованием этих параметров.
Именование сквозное, т.е. имена не могут быть одинаковыми на разных уровнях вложенности.
Имена разных уровней вложенности не могут использоваться совместно.
Код:
: Pr2
  3 bs a^ b^ c^ x^  \ создание лок. переменных на данном уровне вложенности
        a b * a c * b c *
        3 bs d^ e^ f^
              d e + d f + es 10
        2 bs g^ h^
              g h + es 11
    es ;
1 2 3 4 Pr2

log
Код:
Ok ( 1 14 28 11 )

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2095
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Оптимизированный вариант кода.
Код:
: bs ( N -- ) 1+ CELLS SP@ + DUP >cs 15 CELLS - SP! ;
: p  ( n -- An ) CELLS NEGATE cs@ + ;
: es SP@ DUP >R cs> DUP 60 - R> - DUP >R - DUP -ROT R> MOVE SP! ;

PS.
Для создания локальных переменных используется только область памяти, выделенная для стека параметров,
путем перемещения указателя стека на фиксированное значение в сторону увеличения глубины стека.
После использования таких переменных указатель стека устанавливается в сторону уменьшения глубины стека, с учетом
стекового эффекта. Получается экономно в сравнении с вариантами размещения лок. переменных на стеке возвратов(СПФ) или
в хипе. При этом сохраняется возможность использования таких лок. переменных в многопоточных приложениях.

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


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

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


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

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


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

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