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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: static.f -- статические и локальные переменные
СообщениеДобавлено: Ср дек 13, 2006 17:41 
Развитие мысли про локальные переменные.

~profit/lib/static.f:

Код:
\ Статические переменные, хранящиеся непосредственно в шитом
\ коде определения.
\ В комбинации с словом B! или KEEP (слово LOCAL, см. пример
\ внизу) можно использовать как полностью bac4th-совместимые
\ локальные переменные.

...

\EOF
: previousValue
STATIC a
a @
SWAP a ! ;

REQUIRE SEE lib/ext/disasm.f
SEE previousValue

\ 559330 E904000000       JMP     559339  ( previousValue+9  )
\ 559335 0000             ADD     [EAX] , AL
\ 559337 0000             ADD     [EAX] , AL
\ 559339 8BD0             MOV     EDX , EAX
\ 55933B A135935500       MOV     EAX , 559335  ( previousValue+5  )
\ 559340 891535935500     MOV     559335  ( previousValue+5  ) , EDX
\ 559346 C3               RET     NEAR

1 previousValue .
2 previousValue .
3 previousValue .

: sum ( a b -- )
STATIC a
STATIC b
a ! b !

a @ b @ +

STATIC c c !
c @ ;

: fact ( n -- n! ) \ Не самый удачный пример, согласен.
DUP 0=      IF     \ Но тем не менее показывает как сохраняются локальные
DROP 1      ELSE   \ значения в статических переменных
LOCAL n
DUP n !
1- RECURSE
n @ *       THEN ;


Пока неполностью уверился в применимости такого. Кто меня аргументированой критикой разубедит окончательно -- буду только благодарен.

По реализации:
Можно забивать ячейки не нулями а NOP'ами и выравнивать не ALIGN'ом, а ALIGN-NOP'ом, чтобы дизассемблер не терялся. Но тогда на время исполнения придётся выносить отдельную операцию обнуления или же честно предупреждать что вначале у переменных значение будет дурацкое (четыре байта-NOP'а) и обнулять надо их явно.
Или можно брать ячейки для статических переменных не посреди шитого кода, разрывая его jmp'ом, а после RET'а, но с этим чуть надо посидеть... Тогда и предыдущий вопрос отпадает.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: static.f -- статические и локальные переменные
СообщениеДобавлено: Ср дек 13, 2006 18:49 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
profiT писал(а):
Развитие мысли про локальные переменные.

~profit/lib/static.f:

Или можно брать ячейки для статических переменных не посреди шитого кода, разрывая его jmp'ом, а после RET'а, но с этим чуть надо посидеть...


Можно до шитого кода если до STATIC такового еще нет, продвигая
поле кода текущего определения. Еще LAST следует сохранять
хотя-бы ради возможности поставить признак IMMEDIATE .

Код:
: STATIC ( "name -- ) ?COMP
HERE LAST @ NAME> =              \ еще ничего не компилировалось
IF  0 , HERE LAST @ NAME>C ! 
ELSE
0 BRANCH, >MARK                  \ jmp HERE+ячейка , перескакиваем ячейку
\ ALIGN                          \ дизассемблеру это может не понравится, хотя работать будет...
0 ,                              \ сама ячейка, пишем ноль
1 >RESOLVE                       \ ставим ссылку jmp на сюда
THEN

LAST @
HERE                             \ отмечаем HERE внутри определения
CURRENT @  WARNING @  WARNING 0! \ конфликты по именам игнорируем
LOCAL-WORDLIST                   \ создаём или переходим во временный словарь локальных переменных
CREATE IMMEDIATE                 \ создаём в временном словаре имя локальной переменной
WARNING !
OVER CELL - ,                    \ присваиваем слову временного словаря ячейку
HERE widHere !                   \ отмечаем HERE внутри словаря
SET-CURRENT
DP !                             \ возращаем HERE внутри определения
LAST !
DOES> @ LIT, ; IMMEDIATE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 22, 2006 17:17 
Mihail
Ага, спасибо, внёс. Правда толку от этого надо сказать не очень уж и много получается, так как в основном используется LOCAL а он как раз компилирует код и из-за этого уже второй переменной приходится jmp-прыгать. Поэтому мой второй вариант с занесением ячеек после шитого кода определения выглядит и предпочтительней, и общее.

profiT писал(а):
Пока неполностью уверился в применимости такого. Кто меня аргументированой критикой разубедит окончательно — буду только благодарен.

А уже поздно, если кто хотел. Библиотека ушла в работу. Уже и не туды, и не сюды без неё...


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

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


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

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


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

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