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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 93 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7  След.
Автор Сообщение
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Сб май 15, 2010 22:42 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Может я где-то пропустил или не понял - можно ли пользоваться внутри кусков кода словами - индексами циклов (I J K ) - Если да, то сразу могу привести пару случаев польз ы


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пт июн 18, 2010 16:45 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Локальные статические массивы, и переменные, как их частный случай

Код:
: NOTFOUND ( a u --  )
  2DUP + 1- C@ DUP DUP '}' <>  >R ']' <> R> AND
  IF DROP NOTFOUND EXIT ELSE '}' = IF 0x8 >CS THEN THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  1- lname, HERE BRANCH, >MARK 2 HERE
  HERE 0x10 + LIT, RET, >R
  CS> DUP , ALLOT POSTPONE THEN R> SWAP ! lhere @ CELL+ lhere ! ;

STARTLOG
: s1 v} v ;     SEE s1
: s2 $ 20 m] m ; SEE s2
: s3 $ 10 t] 0x10 0 DO I DUP * I t + C! LOOP
             0x10 0 DO I t + C@ . LOOP t ; s3 DUP 4 - @ DUMP
\EOF
CODE s1
5AF113 E918000000       JMP     5AF130  ( s1+1D  )
5AF118 8945FC           MOV     FC [EBP] , EAX
5AF11B B828F15A00       MOV     EAX , # 5AF128
5AF120 8D6DFC           LEA     EBP , FC [EBP]
5AF123 C3               RET     NEAR
5AF124 0800             OR      [EAX] , AL    \ размер переменной задается по умолчанию равным 8-ми
5AF126 0000             ADD     [EAX] , AL
5AF128 0000             ADD     [EAX] , AL    \ начало 8-ми байт переменной
5AF12A 0000             ADD     [EAX] , AL
5AF12C 0000             ADD     [EAX] , AL
5AF12E 0000             ADD     [EAX] , AL
5AF130 8945FC           MOV     FC [EBP] , EAX
5AF133 B828F15A00       MOV     EAX , # 5AF128
5AF138 8D6DFC           LEA     EBP , FC [EBP]
5AF13B C3               RET     NEAR
END-CODE
( 41 bytes, 15 instructions )


CODE s2
5AF14B E930000000       JMP     5AF180  ( s2+35  )
5AF150 8945FC           MOV     FC [EBP] , EAX
5AF153 B860F15A00       MOV     EAX , # 5AF160
5AF158 8D6DFC           LEA     EBP , FC [EBP]
5AF15B C3               RET     NEAR
5AF15C 2000             AND     [EAX] , AL     \ количество байт в массиве
5AF15E 0000             ADD     [EAX] , AL
5AF160 0000             ADD     [EAX] , AL     \ начало массива
5AF162 0000             ADD     [EAX] , AL
5AF164 0000             ADD     [EAX] , AL
5AF166 0000             ADD     [EAX] , AL
5AF168 0000             ADD     [EAX] , AL
5AF16A 0000             ADD     [EAX] , AL
5AF16C 0000             ADD     [EAX] , AL
5AF16E 0000             ADD     [EAX] , AL
5AF170 0000             ADD     [EAX] , AL
5AF172 0000             ADD     [EAX] , AL
5AF174 0000             ADD     [EAX] , AL
5AF176 0000             ADD     [EAX] , AL
5AF178 0000             ADD     [EAX] , AL
5AF17A 0000             ADD     [EAX] , AL
5AF17C 0000             ADD     [EAX] , AL
5AF17E 0000             ADD     [EAX] , AL
5AF180 8945FC           MOV     FC [EBP] , EAX
5AF183 B860F15A00       MOV     EAX , # 5AF160
5AF188 8D6DFC           LEA     EBP , FC [EBP]
5AF18B C3               RET     NEAR
END-CODE
( 65 bytes, 27 instructions )

0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225
5AF1B0   00 01 04 09  10 19 24 31  40 51 64 79  90 A9 C4 E1 ......$1@Qdyђ©Дб
Ok


ПС. В адресе на 4 меньшем адреса начала массива находится 4-байтное число, равное числу байтов в массиве
Можно использовать для контроля выхода за пределы массива

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пт июн 18, 2010 23:10 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
: NOTFOUND ( a u -- )
2DUP + 1- C@ DUP DUP '}' <> >R ']' <> R> AND
IF DROP NOTFOUND

в некоторых фортах не получится ли рекурсия невольная :?: :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Сб июн 19, 2010 10:25 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
вопрос писал(а):
Может я где-то пропустил или не понял - можно ли пользоваться внутри кусков кода словами - индексами циклов (I J K ) - Если да, то сразу могу привести пару случаев польз ы

Вопрос не совсем понятен. Слова (I J K ) используются как обычно в контексте do loop

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
вопрос писал(а):
в некоторых фортах не получится ли рекурсия невольная

Нет конечно.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Сб июн 19, 2010 10:50 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
chess писал(а):
вопрос писал(а):
Может я где-то пропустил или не понял - можно ли пользоваться внутри кусков кода словами - индексами циклов (I J K ) - Если да, то сразу могу привести пару случаев польз ы

Вопрос не совсем понятен. Слова (I J K ) используются как обычно в контексте do loop
а вот если нам делательно обьявить енкоторый кусок кода, который будет использоваться в разных циклах, но не хотим его отдельным словом
Или если мы хотим кусок кода с I J обьявить вне циклов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Сб июн 19, 2010 21:25 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
вопрос писал(а):
а вот если нам делательно обьявить енкоторый кусок кода, который будет использоваться в разных циклах, но не хотим его отдельным словом
Или если мы хотим кусок кода с I J обьявить вне циклов

Для этого есть макросы. Пока, правда, локальные макросы мне были не нужны. Если понадобятся, то сделать - трудности не вижу.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Ср июл 07, 2010 16:31 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Ввел автоинициализированые лок. переменные наряду с обычными

Код:
\ Преобразователь выражений вида '?.?', где ?.? - ascii-символы - от 1-го до 4-х штук в одинарное число
: NOTFOUND \ a u -- n
  2DUP 2DUP 2- 0x5 < >R + 1- C@ 0x27 = >R C@ 0x27 = R> AND R> AND 0=
  IF NOTFOUND EXIT THEN 0 -ROT 1 /STRING 2- OVER +
  DO 8 LSHIFT I C@ + -1 +LOOP LIT, ;

\ область и указатель для лок. словаря

0x800 CONSTANT lenlvoc
USER lhere
USER-CREATE alvoc lenlvoc USER-ALLOT

: lvoc ( -- a len )  alvoc lenlvoc ; 1 lhere !

\ вписать пробел по адресу на стеке
: BL! ( A -- )  $ 20 @bA=b# DROP ;

\ формирование локального имени (после последнего символа имени идет байт пробела)
: lname, ( a u -- axt)
  TUCK lhere @ SWAP MOVE lhere @ + DUP BL! 1+ DUP lhere ! ;

0 WARNING !

\ опознаем начало локального имени кода, формируем имя кода в лок. области,
\ кладем на стек адрес в лок. области, в котором будет находиться адрес начала кода локального слова,
\ формируем код для перехода вперед
: NOTFOUND  ( a u -- axt here 2 xt )
  2>R 2R@ + 1- C@ '(' <> IF 2R> NOTFOUND EXIT THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  2R> 1- lname, HERE BRANCH, >MARK 2 HERE ;

\ окончание формирования кода с локальным имененм
: ) ( axt here 2 xt -- )
  >R RET, THEN, R> SWAP ! lhere @ CELL+ lhere ! ; IMMEDIATE

\ процедура поиска имени в лок. словаре
: lsearch ( a u a1 u1 -- a u 0 | a1 u1 1 )
  2OVER 2SWAP DUP >R 1+ SEARCH
  IF   DROP NIP NIP R> TRUE
  ELSE RDROP 2DROP FALSE THEN ;

\ XT для локально-именованного кода
USER locxt 0 locxt !

: l' ( 'name' -- xt )
  TRUE locxt ! ; IMMEDIATE

\ компиляция кода с именами в лок. словаре
: NOTFOUND \ a u --
  lvoc 2OVER lsearch 0= lhere @ 1 = OR IF 2DROP NOTFOUND EXIT THEN
  2SWAP NIP NIP + 1+ @ locxt @ 0= IF COMPILE, ELSE 0 locxt ! LIT, THEN  ;

\ начало компиляции определения с "обнулением" признака заполненности лок. словаря
: : 1 lhere ! : ;

\ локальные стат. переменные c автоинициализацией одинарным числом со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 1- C@  '!' <> IF NOTFOUND EXIT THEN 0x8 >CS
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  1- lname, HERE BRANCH, >MARK 2 HERE HERE 0xC + LIT, RET, >R
  CS> ALLOT THEN, R@ SWAP ! lhere @ CELL+ lhere ! R> 0xC + >CS @=A, DROP, ;

\ локальные стат. переменные c автоинициализацией двойным числом со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 2- W@ '!.' <> IF NOTFOUND EXIT THEN 0x8 >CS
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  2- lname, HERE BRANCH, >MARK 2 HERE HERE 0xC + LIT, RET, >R
  CS> ALLOT THEN, R@ SWAP ! lhere @ CELL+ lhere !
  R> 0xC + DUP CELL+ >CS >CS @=A, DROP, @=A, DROP, ;

\ локальные статические переменные без автоинициализации
: NOTFOUND ( a u --  )
  2DUP + 1- C@  ')' <> IF NOTFOUND EXIT THEN 0x8 >CS
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  1- lname, HERE BRANCH, >MARK 2 HERE HERE 0xC +  LIT, RET, >R
  CS> ALLOT THEN, R> SWAP ! lhere @ CELL+ lhere ! ;

\ локальные статические массивы
: NOTFOUND ( a u --  )
  2DUP + 1- C@ ']' <> IF NOTFOUND EXIT THEN OP0 @ 4 - @ >CS DROP,
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  1- lname, HERE BRANCH, >MARK 2 HERE
  HERE 0x10 + LIT, RET, >R
  CS> DUP , ALLOT THEN, R> SWAP ! lhere @ CELL+ lhere ! ;


\ пример поиска подстроки между подстроками-ограничителями

: subst ( a0 u0 a1 a1 a2 u2 -- a u | a0 u0 )
  s2!. s1!. s0!. \ параметры со стека в переменные s2 s1 s0
  s0 2@ s1 2@ SEARCH f01! DROP s1 @ + ab!
  s0 2@ s2 2@ SEARCH f02! DROP ae!
  f01 @ f02 @ AND IF ab @ ae @ ab @ - ELSE s0 2@ THEN ;

STARTLOG

S" Rezistor:R021[09,1k]" S" R021["  S" ]" subst TYPE

лог
Код:
09,1k
Ok

пс.
1. похоже чаще нужны лок. переменные типа VALUE, чтобы меньше было С@ @ 2@
2. величина лок.массивов задается во время компиляции кодом литерала,
из которого вытаскивается значение литерала, а сам код литерала удаляется
( : s1 10 arr] ... ; во время компиляции будет создан массив в 10 байтов )

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пт июл 09, 2010 21:38 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
реализация лок. переменных типа value

Код:
USER iol 0 iol !
: is 1 iol ! ; IMMEDIATE

\ компиляция кода с именами в лок. словаре
: NOTFOUND \ a u --
  lvoc 2OVER lsearch 0= lhere @ 1 = OR IF 2DROP NOTFOUND EXIT THEN
  2SWAP NIP NIP + 1+ @ iol @ IF 0xC + 0 iol ! THEN >CS locxt @ 0= IF :@, ELSE 0 locxt ! LIT, THEN  ;

\ локальные стат. переменные c автоинициализацией одинарным числом со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 1- C@  '!' <> IF NOTFOUND EXIT THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  1- lname, HERE BRANCH, >MARK 2 HERE HERE 0x19 + DUP LIT, @, RET, LIT, !, RET, >R 4 ALLOT THEN,
  R@ SWAP ! lhere @ CELL+ lhere ! R> 0x19 + >CS @=A, DROP, ;

: tst
1 s!    \ создание и инициализация
s       \ чтение
2 is s  \ запись
s ;     \ чтение
STARTLOG
SEE tst

лог
Код:
CODE tst
5AF20B 8945FC           MOV     FC [EBP] , EAX
5AF20E B801000000       MOV     EAX , # 1
5AF213 8D6DFC           LEA     EBP , FC [EBP]
5AF216 E91D000000       JMP     5AF238  ( tst+2D  )
5AF21B 8945FC           MOV     FC [EBP] , EAX              |  код
5AF21E A134F25A00       MOV     EAX , 5AF234  ( tst+29  )   |  чтения
5AF223 8D6DFC           LEA     EBP , FC [EBP]              |
5AF226 C3               RET     NEAR                        -
5AF227 890534F25A00     MOV     5AF234  ( tst+29  ) , EAX   |  код
5AF22D 8B4500           MOV     EAX , 0 [EBP]               |  записи
5AF230 8D6D04           LEA     EBP , 4 [EBP]               |
5AF233 C3               RET     NEAR                        -
5AF234 55               PUSH    EBP                         =
5AF235 55               PUSH    EBP                         =   4 байта переменной
5AF236 0000             ADD     [EAX] , AL                  = =
5AF238 890534F25A00     MOV     5AF234  ( tst+29  ) , EAX   код инициализации
5AF23E 8B4500           MOV     EAX , 0 [EBP]
5AF241 8D6D04           LEA     EBP , 4 [EBP]
5AF244 E8D2FFFFFF       CALL    5AF21B  ( tst+10  )         вызов кода чтения
5AF249 8945FC           MOV     FC [EBP] , EAX
5AF24C B802000000       MOV     EAX , # 2
5AF251 8D6DFC           LEA     EBP , FC [EBP]
5AF254 E8CEFFFFFF       CALL    5AF227  ( tst+1C  )         вызов кода записи
5AF259 E8BDFFFFFF       CALL    5AF21B  ( tst+10  )         вызов кода чтения
5AF25E C3               RET     NEAR
END-CODE
( 84 bytes, 25 instructions )
tst
Ok ( 1 2 )

\ старая задачка - теперь не надо с@ @ 2@
: subst  ( a0 u0 a1 u1 a2 u2 -- a u | a0 u0 )
  u2! a2! u1! a1! u0! a0!
  a0 u0 a1 u1 SEARCH IF DROP u1 + ab!
  a0 u0 a2 u2 SEARCH IF DROP ae! ab ae ab - THEN THEN ;

S" 12345<<768>>90" S" <<" S" >>" subst TYPE


пс.

Собственно все видно в коде - образованы 2 поля кода - первое поле - это код чтения из адреса переменной
на стек параметров, второе - код записи со стека в адрес. При компиляции к хт либо добавляется смещение, либо нет.
Если добавляется - то компилируется вызов на второе поле - запись, если нет - чтение. Смещение добавляется если
user переменная iol (направление ввода) в состоянии 1, в которую ее устанавливает слово немедленного исполнения is.
После формирования смещения для кода записи iol принудительно устаналивается в 0.

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

Если надо вывести адрес лок. переменной - нужно сделать третье поле кода и по at например
устанавливать iol например в 2, и компилировать уже вызов на третье поле кода.

Да еще забыл сказать, что слово is в отличии от слова TO не читает из входного потока, что
позволяет включать is в макросы, чего нельзя сделать со словом ТО.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пн июл 12, 2010 11:52 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
При попытке реализовать лок. переменные типа value разрядностью 8, 16, 64 столкнулся с неприятной неожиданностью -
нужно в обязательном порядке вводить тип для таких переменных.
А это, считаю, идет вразрез с форт-парадигмой. В форте типов нет ни в каком виде - и это способствует гибкости и расширяемости форта. Поэтому ограничился только одной разрядностью value-переменных - 32( кстати в spf - тоже самое ).

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пн июл 12, 2010 12:45 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
А это, считаю, идет вразрез с форт-парадигмой.

:))
Если это что-то маленькое и с хвостиком, но сзади нет кошки - то не мышка


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пн июл 12, 2010 14:35 
Не в сети
Аватара пользователя

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

Если так, то пожалуйста можно и без типов (в форт-стиле).

Код:
USER iol 0 iol !
I: is  1 iol !  ;
I: isb 2 iol !  ;
I: isw 3 iol !  ;
I: isd 4 iol !  ;

: l' ( 'name' -- xt )
  TRUE locxt ! ; IMMEDIATE

\ компиляция кода с именами в лок. словаре
: NOTFOUND \ a u --
  lvoc 2OVER lsearch 0= lhere @ 1 = OR IF 2DROP NOTFOUND EXIT THEN
  2SWAP NIP NIP + 1+ @ iol @
  IF 12 +
     iol @ >R R@ 3 > IF 8 ELSE R@ 1 > IF 3 ELSE 0 THEN THEN RDROP + 0 iol !
  THEN >CS locxt @ 0= IF :@, ELSE 0 locxt ! LIT, THEN  ;

\ начало компиляции определения с "обнулением" признака заполненности лок. словаря
: : 1 lhere ! : ;

\ локальные стат. переменные c автоинициализацией одинарным числом со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 1- C@  '!' <> IF NOTFOUND EXIT THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  1- lname, HERE BRANCH, >MARK 2 HERE HERE 0x19 + DUP LIT, @, RET, LIT, !, RET, >R 4 ALLOT THEN,
  R@ SWAP ! lhere @ CELL+ lhere ! R> 0x19 + >CS @=A, DROP, ;

\ локальные стат. переменные c автоинициализацией байтом со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 2- W@  '!b' <> IF NOTFOUND EXIT THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  2- lname, HERE BRANCH, >MARK 2 HERE HERE 0x22 + DUP LIT, C@, RET, LIT, C!, RET, >R 1 ALLOT THEN,
  R@ SWAP ! lhere @ CELL+ lhere ! R> 0x22 + >CS @=bA, DROP, ;

\ локальные стат. переменные c автоинициализацией 2-мя байтами со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 2- W@  '!w' <> IF NOTFOUND EXIT THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  2- lname, HERE BRANCH, >MARK 2 HERE HERE 0x20 + DUP LIT, W@, RET, LIT, W!, RET, >R 2 ALLOT THEN,
  R@ SWAP ! lhere @ CELL+ lhere ! R> 0x20 + >CS @=wA, DROP, ;

\ локальные стат. переменные c автоинициализацией двойным числом со стека параметров
: NOTFOUND ( a u --  )
  2DUP + 2- W@ '!d' <> IF NOTFOUND EXIT THEN
  lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN
  2- lname, HERE BRANCH, >MARK 2 HERE HERE 0x31 + DUP LIT, 2@, RET, LIT, 2!, RET, >R 8 ALLOT THEN,
  R@ SWAP ! lhere @ CELL+ lhere !
  R> 0x31 + DUP CELL+ >CS >CS @=A, DROP, @=A, DROP, ;

\  примеры синтаксиса
: s1 1  s!  s 2  is  s s ;
: s2 1  s!w s 2  isw s s ;
: s3 1  s!b s 2  isb s s ;
: s4 1. s!d s 2. isd s s ;


Да - ошибся - типы не обязательны. :oops:

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Пт июл 23, 2010 21:54 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Как организовать доступ к нескольким полям кода у переменных типа value видно на примере:
Код:
: s1
8 v!
l' is v \ получение xt поля кода записи
l' v    \ получение xt поля кода чтения
;
STARTLOG
SEE s1
HEX s1

лог
Код:
CODE s1
5AF793 8945FC           MOV     FC [EBP] , EAX
5AF796 B808000000       MOV     EAX , # 8
5AF79B 8D6DFC           LEA     EBP , FC [EBP]
5AF79E E91D000000       JMP     5AF7C0  ( s1+2D  )
5AF7A3 8945FC           MOV     FC [EBP] , EAX            <---- ЧТЕНИЕ
5AF7A6 A1BCF75A00       MOV     EAX , 5AF7BC  ( s1+29  )
5AF7AB 8D6DFC           LEA     EBP , FC [EBP]
5AF7AE C3               RET     NEAR
5AF7AF 8905BCF75A00     MOV     5AF7BC  ( s1+29  ) , EAX  <---- ЗАПИСЬ
5AF7B5 8B4500           MOV     EAX , 0 [EBP]
5AF7B8 8D6D04           LEA     EBP , 4 [EBP]
5AF7BB C3               RET     NEAR
5AF7BC 55               PUSH    EBP
5AF7BD 55               PUSH    EBP
5AF7BE 0000             ADD     [EAX] , AL
5AF7C0 8905BCF75A00     MOV     5AF7BC  ( s1+29  ) , EAX
5AF7C6 C745FCAFF75A00   MOV     FC [EBP] , # 5AF7AF
5AF7CD B8A3F75A00       MOV     EAX , # 5AF7A3
5AF7D2 8D6DFC           LEA     EBP , FC [EBP]
5AF7D5 C3               RET     NEAR
END-CODE
( 67 bytes, 20 instructions )

Ok ( 5AF7AF 5AF7A3 )

пс.
файлы для работы с лок. словами и лок. переменными можно взять по адресу:
http://www.chess2007.nm.ru/chess1.zip

1. в devel записать каталог ~chess
2. запустить скрипт spf419.spf из каталога ..\SPF-419\
3. в дальнейшем работать с полученным spf4al.exe вместо spf4.exe
( поддерживается встроенный ассм, макросы, локальные слова, переменные и массивы)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Чт окт 21, 2010 17:12 
Не в сети
Аватара пользователя

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

Код:
HERE IMAGE-BASE - 0x100000 + TO IMAGE-SIZE  \ увеличим размер образа

CREATE lcode 0x10000 ALLOT  lcode VALUE dpl \ область кода для слов с лок именами

CREATE ldata 0x10000 ALLOT ldata VALUE ldhere \ область данных для локально-именованных переменных и массивов

VARIABLE XHERE  VARIABLE xdpl \ переменные сохранения указателей компиляции

\ область локальных имен
0x800 CONSTANT lenlvoc
USER-CREATE alvoc lenlvoc USER-ALLOT
USER lhere
USER axtloc

: lvoc ( -- a len )  alvoc lenlvoc ;  lvoc ERASE 1 lhere !

\ формирование локального имени ( после последнего символа имени идет 0-й байт )
: lname, ( a u -- axt)
  TUCK lhere @ SWAP MOVE lhere @ + DUP 0! 1+ DUP lhere ! DUP axtloc ! ;

0 WARNING !

: L{  dpl xdpl ! DP @ XHERE ! dpl DP ! ;         \ переключение на компиляцию в область lcode
: }L  dpl DP @ xdpl @ - + TO dpl XHERE @ DP ! ;  \ переключение на компиляцию в область CODE
: init-lvoc   lhere @ 1 = IF lvoc ERASE lvoc DROP lhere ! THEN ;
: headl  ( a u --  ) lname, dpl SWAP ! lhere @ 5 +  lhere !   ;

M: nf1-exit ( a u s  -- a u ) -ROT 2DUP + 1- C@ -ROT 2SWAP <> IF NOTFOUND EXIT THEN ;
M: nf2-exit ( a u ss -- a u ) -ROT 2DUP + 2- W@ -ROT 2SWAP <> IF NOTFOUND EXIT THEN ;

USER locxt 0 locxt ! \ XT для локально-именованного кода
USER iol 0 iol !     \ направление ввода-вывода в лок переменные типа value

\ начало и конец компиляции определения с "обнулением" признака заполненности лок. словаря
: : 1 lhere ! : ;
\ начало формирования кода с локальным именем
: NOTFOUND  ( a u -- )   '('  nf1-exit init-lvoc 1- headl L{ ;

\ окончание формирования кода с локальным именем
: ) ( -- )  RET, }L ; IMMEDIATE

\ окончание формирования кода с локальным именем, оставляющего токен на стеке
: x) ( -- )  RET, }L axtloc @ @ LIT, ; IMMEDIATE

: razd? ( a -- fl) DUP C@ 0= SWAP C@ 0x20 = OR ;

\ процедура поиска имени в лок. словаре
: lsearch { a u a1 u1 \ a2 u2 fl -- a u 0|1 }
  0 TO fl BEGIN a u a1 u1 SEARCH >R TO u2 TO a2
                R> a2 u1 + razd? a2 1- razd? AND AND
                IF   1 TO fl a2 u1 TRUE
                ELSE a2 u1 + 1+ TO a u2 u1 - 1- TO u
                     u u1 < IF 1 TO fl a u FALSE THEN
                THEN
       fl UNTIL ;

: l' ( 'lname' -- xt ) TRUE locxt ! ; IMMEDIATE  \ аналог ' для локально-именованных слов

: is  1 iol ! ; IMMEDIATE  \ аналоги TO
: ib  2 iol ! ; IMMEDIATE
: iw  3 iol ! ; IMMEDIATE
: id  4 iol ! ; IMMEDIATE

\ компиляция кода с именами в лок. словаре
: NOTFOUND \ a u --
  OVER C@ '`' = IF 1 /STRING TRUE locxt ! THEN
  lvoc 2OVER lsearch 0= lhere @ 1 = OR IF 2DROP NOTFOUND EXIT THEN
  2SWAP NIP NIP + 1+ @ iol @
  IF 12 + iol @ >R R@ 3 > IF  8 ELSE R@ 1 > IF 3 ELSE 0 THEN THEN
     RDROP + 0 iol !
  THEN locxt @ 0= IF COMPILE, ELSE 0 locxt ! LIT, THEN  ;

\ локально-именованные переменые
: NOTFOUND ( a u --  ) \ типа 2variable
  ')d' nf2-exit init-lvoc 2- headl
  L{ ldhere LIT, RET, ldhere 2 CELLS + TO ldhere }L ;
: NOTFOUND ( a u --  ) \ типа variable
  ')' nf1-exit init-lvoc 1- headl
  L{ ldhere LIT, RET, ldhere CELL + TO ldhere }L ;
: NOTFOUND ( a u --  ) \ типа wvariable
  ')w' nf2-exit init-lvoc 2- headl
  L{ ldhere LIT, RET, ldhere 2+ TO ldhere }L ;
: NOTFOUND ( a u --  ) \ типа bvariable
  ')b' nf2-exit init-lvoc 2- headl
  L{ ldhere LIT, RET, ldhere 1+ TO ldhere }L ;
: NOTFOUND ( a u --  ) \ типа value
  '!' nf1-exit init-lvoc 1- headl ldhere LIT, !,
  L{ ldhere LIT, @, RET, ldhere LIT, !, RET,   ldhere 1 CELLS + TO ldhere }L ;
: NOTFOUND ( a u --  ) \ 2value
  '!d' nf2-exit init-lvoc 2- headl ldhere LIT, 2!,
  L{ ldhere LIT, 2@, RET, ldhere LIT, 2!, RET, ldhere 2 CELLS + TO ldhere }L ;
: NOTFOUND ( a u --  ) \ wvalue
  '!w' nf2-exit init-lvoc 2- headl ldhere LIT, W!,
  L{ ldhere LIT, W@, RET, ldhere LIT, W!, RET, ldhere 2+ TO ldhere }L ;
: NOTFOUND ( a u --  ) \ bvalue
  '!b' nf2-exit init-lvoc 2- headl ldhere LIT, C!,
  L{ ldhere LIT, C@, RET, ldhere LIT, C!, RET, ldhere 1+ TO ldhere }L ;

\ локально-именованные статические массивы
: NOTFOUND ( a u --  ) \ размер задается только числовым литералом  20 arr]
  ']' nf1-exit OP0 @ 4 - @ >CS DROP, init-lvoc 1-  headl
  L{ ldhere LIT, RET, CS> ldhere + TO ldhere }L ;
: NOTFOUND ( a u --  ) \ размер берется с локального стека  $ 8 arr1} или [ величина >CS ] arr}
  '}' nf1-exit init-lvoc 1- headl
  L{ ldhere LIT, RET, CS> ldhere + TO ldhere }L ;

\ определение слов через ':' в виде name: .... ; вместо : name .... ;
: NOTFOUND ( a u -- ) ':' nf1-exit 1- SHEADER ] HIDE ;

\ определение макросов через ':M' в виде name:M .... ; вместо M: name .... ;
: NOTFOUND ( a u -- ) ':M' nf2-exit 2- SHEADER ] HIDE IMMEDIATE LOAD-TEXT POSTPONE EVALUATE POSTPONE ; ;

\ определение строк многострочныx через ':T' в виде name:T .... ; вместо T: name .... ;
: NOTFOUND ( a u -- ) ':T' nf2-exit 2- SHEADER ] HIDE LOAD-TEXT POSTPONE ; ;
\ EOF

\ сумма попарных произведений для 4 параметров
: d(4) ( a b c d -- ab+ac+ad+bc+bd+cd )
  a! b! c! d!
  b c + d + a *
  c d + b * +
  c d * + ;
\ на 'старых' лок. переменных спф
: D(4) { a b c d -- ab+ac+ad+bc+bd+cd }
  b c + d + a *
  c d + b * +
  c d * +  ;

: S1  1 2 3 4 d(4) ;
: S2  1 2 3 4 D(4) ;


STARTLOG

SEE d(4)

SEE D(4)

REQUIRE METER ~CHESS\TASK\METER.F

METER S1
METER S2

лог
Код:
CODE d(4)
5CFB37 890560EE5B00     MOV     5BEE60  ( ldata+5  ) , EAX
5CFB3D 8B4500           MOV     EAX , 0 [EBP]
5CFB40 8D6D04           LEA     EBP , 4 [EBP]
5CFB43 890564EE5B00     MOV     5BEE64  ( ldata+9  ) , EAX
5CFB49 8B4500           MOV     EAX , 0 [EBP]
5CFB4C 8D6D04           LEA     EBP , 4 [EBP]
5CFB4F 890568EE5B00     MOV     5BEE68  ( ldata+D  ) , EAX
5CFB55 8B4500           MOV     EAX , 0 [EBP]
5CFB58 8D6D04           LEA     EBP , 4 [EBP]
5CFB5B 89056CEE5B00     MOV     5BEE6C  ( ldata+11  ) , EAX
5CFB61 8B4500           MOV     EAX , 0 [EBP]
5CFB64 8D6D04           LEA     EBP , 4 [EBP]
5CFB67 8945FC           MOV     FC [EBP] , EAX
5CFB6A A164EE5B00       MOV     EAX , 5BEE64  ( ldata+9  )
5CFB6F 030568EE5B00     ADD     EAX , 5BEE68  ( ldata+D  )
5CFB75 03056CEE5B00     ADD     EAX , 5BEE6C  ( ldata+11  )
5CFB7B F72D60EE5B00     IMUL    5BEE60  ( ldata+5  )
5CFB81 8945F8           MOV     F8 [EBP] , EAX
5CFB84 A168EE5B00       MOV     EAX , 5BEE68  ( ldata+D  )
5CFB89 03056CEE5B00     ADD     EAX , 5BEE6C  ( ldata+11  )
5CFB8F F72D64EE5B00     IMUL    5BEE64  ( ldata+9  )
5CFB95 0345F8           ADD     EAX , F8 [EBP]
5CFB98 8945F8           MOV     F8 [EBP] , EAX
5CFB9B A168EE5B00       MOV     EAX , 5BEE68  ( ldata+D  )
5CFBA0 F72D6CEE5B00     IMUL    5BEE6C  ( ldata+11  )
5CFBA6 0345F8           ADD     EAX , F8 [EBP]
5CFBA9 8D6DFC           LEA     EBP , FC [EBP]
5CFBAC C3               RET     NEAR
END-CODE
( 118 bytes, 28 instructions )


CODE D(4)
5CFBBF 8945FC           MOV     FC [EBP] , EAX
5CFBC2 B810000000       MOV     EAX , # 10
5CFBC7 8D6DFC           LEA     EBP , FC [EBP]
5CFBCA E82535F8FF       CALL    5530F4  ( DRMOVE )
5CFBCF 6810000000       PUSH    , # 10
5CFBD4 6878325500       PUSH    , # 553278
5CFBD9 8945FC           MOV     FC [EBP] , EAX
5CFBDC 8B442410         MOV     EAX , 10 [ESP]
5CFBE0 0344240C         ADD     EAX , C [ESP]
5CFBE4 03442408         ADD     EAX , 8 [ESP]
5CFBE8 8945F8           MOV     F8 [EBP] , EAX
5CFBEB 8B442414         MOV     EAX , 14 [ESP]
5CFBEF F76DF8           IMUL    F8 [EBP]
5CFBF2 8945F8           MOV     F8 [EBP] , EAX
5CFBF5 8B44240C         MOV     EAX , C [ESP]
5CFBF9 03442408         ADD     EAX , 8 [ESP]
5CFBFD 8945F4           MOV     F4 [EBP] , EAX
5CFC00 8B442410         MOV     EAX , 10 [ESP]
5CFC04 F76DF4           IMUL    F4 [EBP]
5CFC07 0345F8           ADD     EAX , F8 [EBP]
5CFC0A 8945F8           MOV     F8 [EBP] , EAX
5CFC0D 8B44240C         MOV     EAX , C [ESP]
5CFC11 8945F4           MOV     F4 [EBP] , EAX
5CFC14 8B442408         MOV     EAX , 8 [ESP]
5CFC18 F76DF4           IMUL    F4 [EBP]
5CFC1B 0345F8           ADD     EAX , F8 [EBP]
5CFC1E 8D6DFC           LEA     EBP , FC [EBP]
5CFC21 C3               RET     NEAR
END-CODE
( 99 bytes, 28 instructions )

99 45
171 72
Ok

ps.
1. Быстродействие локально-именованных переменных стало даже чуть выше чем у обычных лок. переменных спф,
а пользоваться локально-именованными переменными стало удобнее, так как их можно вводить
многократно и в любых местах определения , а не один только раз как раньше.
2. Кроме того они не завязаны со стеком возвратов как старые лок. переменые и могут использоваться
в локально-именованных словах.

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


Последний раз редактировалось chess Пн дек 13, 2010 17:21, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Локальные слова
СообщениеДобавлено: Чт окт 21, 2010 21:00 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
chess писал(а):
5CFB37 890560EE5B00 MOV 5BEE60 ( ldata+5 ) , EAX
5CFB3D 8B4500 MOV EAX , 0 [EBP]
5CFB40 8D6D04 LEA EBP , 4 [EBP]
5CFB43 890564EE5B00 MOV 5BEE64 ( ldata+9 ) , EAX
5CFB49 8B4500 MOV EAX , 0 [EBP]
5CFB4C 8D6D04 LEA EBP , 4 [EBP]
5CFB4F 890568EE5B00 MOV 5BEE68 ( ldata+D ) , EAX

Мне трудно разобраться с твоей программой, но здесь я вижу присвоение
глобальным ячейкам. (Почему-то оптимизатор не сработал.)

Код:
0 VALUE a
0 VALUE b
0 VALUE c
0 VALUE d

: d(4) ( a b c d -- ab+ac+ad+bc+bd+cd )
  TO a TO b TO c TO d
  b c + d + a *
  c d + b * +
  c d * + ;

SEE d(4)


Код:

57C027 A3B8BF5700       MOV     57BFB8  ( a+5  ) ,  EAX
57C02C 8B4500           MOV     EAX , 0 [EBP]
57C02F A3D4BF5700       MOV     57BFD4  ( b+5  ) ,  EAX
57C034 8B4504           MOV     EAX , 4 [EBP]
57C037 A3F0BF5700       MOV     57BFF0  ( c+5  ) ,  EAX
57C03C 8B4508           MOV     EAX , 8 [EBP]
57C03F A30CC05700       MOV     57C00C  ( d+5  ) ,  EAX
57C044 A1D4BF5700       MOV     EAX , 57BFD4  ( b+5  )
57C049 0305F0BF5700     ADD     EAX , 57BFF0  ( c+5  )
57C04F 03050CC05700     ADD     EAX , 57C00C  ( d+5  )
57C055 F72DB8BF5700     IMUL    57BFB8  ( a+5  )
57C05B 894508           MOV     8 [EBP] , EAX
57C05E A1F0BF5700       MOV     EAX , 57BFF0  ( c+5  )
57C063 03050CC05700     ADD     EAX , 57C00C  ( d+5  )
57C069 F72DD4BF5700     IMUL    57BFD4  ( b+5  )
57C06F 034508           ADD     EAX , 8 [EBP]
57C072 894508           MOV     8 [EBP] , EAX
57C075 A1F0BF5700       MOV     EAX , 57BFF0  ( c+5  )
57C07A F72D0CC05700     IMUL    57C00C  ( d+5  )
57C080 034508           ADD     EAX , 8 [EBP]   \ Press
57C083 8D6D0C           LEA     EBP , C [EBP]
57C086 C3               RET     NEAR


chess писал(а):
Быстродействие локально-именованных переменных стало даже чуть выше чем у обычных лок.

Мои надо использовать

Код:
REQUIRE   { ~mak\locals4.f

: D(4) { a b c d -- ab+ac+ad+bc+bd+cd }
  b c + d + a *
  c d + b * +
  c d * +  ;

SEE D(4)


Код:
57BFB7 50               PUSH    EAX
57BFB8 8B4500           MOV     EAX , 0 [EBP]
57BFBB 50               PUSH    EAX
57BFBC 8B4504           MOV     EAX , 4 [EBP]
57BFBF 50               PUSH    EAX
57BFC0 8B4508           MOV     EAX , 8 [EBP]
57BFC3 50               PUSH    EAX
57BFC4 8B442404         MOV     EAX , 4 [ESP]
57BFC8 03442408         ADD     EAX , 8 [ESP]
57BFCC 0344240C         ADD     EAX , C [ESP]
57BFD0 894508           MOV     8 [EBP] , EAX
57BFD3 8B442400         MOV     EAX , 0 [ESP]
57BFD7 F76D08           IMUL    8 [EBP]
57BFDA 894508           MOV     8 [EBP] , EAX
57BFDD 8B442408         MOV     EAX , 8 [ESP]
57BFE1 0344240C         ADD     EAX , C [ESP]
57BFE5 894504           MOV     4 [EBP] , EAX
57BFE8 8B442404         MOV     EAX , 4 [ESP]
57BFEC F76D04           IMUL    4 [EBP]
57BFEF 034508           ADD     EAX , 8 [EBP]
57BFF2 894508           MOV     8 [EBP] , EAX
57BFF5 8B442408         MOV     EAX , 8 [ESP]
57BFF9 894504           MOV     4 [EBP] , EAX
57BFFC 8B44240C         MOV     EAX , C [ESP]
57C000 F76D04           IMUL    4 [EBP]
57C003 034508           ADD     EAX , 8 [EBP]
57C006 8D642410         LEA     ESP , 10 [ESP]
57C00A 8D6D0C           LEA     EBP , C [EBP]
57C00D C3               RET     NEAR


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

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


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

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


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

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