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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: на сей раз работа с различными переменными
СообщениеДобавлено: Вт апр 03, 2007 19:46 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Код:

\ 31-03-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ константы, vect и value переменные, работа с ними.

\ основное отличие от используемого в СПФ варианта заключается в том, что
\ используется не прямой шитый код а подпрограммный 8), что логично, так
\ как во всем остальном СПФ использует именно подпрограмный ШК.
\ второе, не менее важное отличие заключается в том, что нельзя присвоить
\ vect - значение по to а value с помощью is !!! Что вобщем-то достаточно
\ логично. Ну и с большой оглядкой надо использовать следующие варианты
\ CREATE-DOES> механизма: VALUE DOES> ; VECT DOES> ; CONSTANT DOES>
\ потому как поведение DOES> в таком случае не проходит- то есть вообще
\ не стоит использовать.

  \ размер адресной ссылки байт                                            \
    : ADDR ( --> const ) 4 ;                                               \
  \                                                                        \
  \ работа с адресными ссылками                                            \
    : A@ @ ; : A! ! ; : A, , ;                                             \
  \                                                                        \
  \ !!! часто используется и по сути выдает смещение от текущего           \
  \ адреса до указанного. Стоит вынести в отдельное слово.                 \
    : atod ( addr --> disp ) HERE ADDR + - ;                               \
  \                                                                        \
  \ совместимость с базовым вариантом СПФ4                                 \
  \ компилировать ассемблерную команду CALL на addr                        \
    : CALL, ( addr --> ) 0xE8 C, atod A, ;                                 \
  \                                                                        \
  \ делает то же, что и ['] name COMPILE,                                  \
  \ все-таки более однозначное слово, чем POSTPONE                         \
    : COMPILE ( --> ) ?COMP ' LIT, ['] COMPILE, COMPILE, ; IMMEDIATE       \


\ создать константу √
\ отличие от СПФ-варианта в том, что значение константы компилируется
\ прямо в код, в отличие от СПФ - где в код компилируется CALL на константу.
\ И это означает, что изменение значения константы не предусматривается.
: const ( n / name --> )
        CREATE , IMMEDIATE
        DOES> @
              STATE @ IF 0x8D C, 0x6D C, 0xFC C,  \ LEA EBX, -4 [EBX]
                         0x89 C, 0x45 C, 0x00 C,  \ MOV [EBP], EAX
                         0xB8 C, ,                \ MOV EAX, # const
                       ELSE
                      THEN ;

\ создать вектор-переменную √
\ если переменная не инициализирована - выполнить NOOP
: vect ( / name --> ) HEADER ['] NOOP CALL, RET, ;

\ установить новое значение vect переменной √
: (is) ( addr 'vect --> ) TUCK ADDR + - SWAP A! ;

\ изменить значение vect переменной √
: is   ( n / name --> )
       ' 1 +
       STATE @ IF LIT, COMPILE (is)
                ELSE (is)
               THEN ; IMMEDIATE

\ получить содержимое vect переменной - то есть узнать на кого она указывает√
: (evoke) ( addr --> addr ) 1 + DUP A@ + ADDR + ;

\ извлечь содержимое vect переменной √
: evoke ( / name --> addr )
        '
        STATE @ IF LIT, COMPILE (evoke)
                 ELSE (evoke)
                THEN ; IMMEDIATE

\ создать value переменную √
: value ( n / name --> )
        HEADER
         0x8D C, 0x6D C, 0xFC C,  \ LEA EBX, -4 [EBX]
         0x89 C, 0x45 C, 0x00 C,  \ MOV [EBP], EAX
         0x90 C,                  \ NOP               \ выравнивание значения
         0xB8 C, ,                \ MOV EAX, # const  \ +08
         RET, ;

\ присвоить n value-переменной с именем name √
: to ( n / name --> )
     ' 8 +
     STATE @ IF LIT, COMPILE A!
              ELSE A!
             THEN ; IMMEDIATE

\ присвоить n value-переменной с именем name √
: +to ( n / name --> )
      ' 8 +
      STATE @ IF LIT, COMPILE +!
               ELSE +!
              THEN ; IMMEDIATE

\ заменить значение переменной на новое - старое вернуть.
: change ( a addr --> b ) DUP @ -ROT ! ;

\ заменить значение value переменной на новое, старое вернуть.
: exch ( a / name --> b )
       ' 8 +
       STATE @ IF LIT, COMPILE change
                ELSE change
               THEN ; IMMEDIATE

\EOF -- тестовая секция -----------------------------------------------------
                                   DECIMAL

  123 value proba S" должно быть 123 = " TYPE proba . CR
  200 to proba S" должно быть 200 = " TYPE proba . CR
  : testa 300 to proba ; testa S" должно быть 300 = " TYPE proba . CR
  vect sample S" должно быть " TYPE ' NOOP . S" = " TYPE evoke sample . CR
  : testb ." vect sample passed. " ; ' testb is sample   sample CR
  : testc evoke sample . ;
  S" должно быть " TYPE ' testb . S" = " TYPE testc CR
  20 +to proba S" должно быть 320 = " TYPE proba . CR
  : testd 30 +to proba ; S" должно быть 350 = " TYPE testd proba . CR
  234 exch proba S" должно быть 350 = " TYPE . CR
  S" должно быть 234 = " TYPE proba . CR



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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
mOleg писал(а):
Код:
: vect ( / name --> ) HEADER ['] NOOP CALL, RET, ;


Тогда уж:
Код:
  : vect ( / name --> ) HEADER E9 C, ( jmp) ['] NOOP atod A, ;


Цитата:
Код:
\ создать value переменную √
: value ( n / name --> )
        HEADER
         0x8D C, 0x6D C, 0xFC C,  \ LEA EBX, -4 [EBX]
         0x89 C, 0x45 C, 0x00 C,  \ MOV [EBP], EAX
         0x90 C,                  \ NOP               \ выравнивание значения
         0xB8 C, ,                \ MOV EAX, # const  \ +08
         RET, ;



Тогда >BODY нужно переопределить

0 value xxxxx
' xxxxx @ CONSTANT ZZZ

: >BODY DUP @ ZZZ =
IF 3 + THEN
5 + ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 04, 2007 20:31 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Mihail писал(а):
Тогда уж:
Код:

: vect ( / name --> ) HEADER E9 C, ( jmp) ['] NOOP atod A, ;


а почему? чем мешает CALL, ?

Mihail писал(а):
Тогда >BODY нужно переопределить

зачем?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 05, 2007 10:31 
Не в сети

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

: vect ( / name --> ) HEADER E9 C, ( jmp) ['] NOOP atod A, ;


а почему? чем мешает CALL, ?


CALL , по моему, медленнее JMP да и лишний RET придется
выполнять и на байт длиннее.

Цитата:
Mihail писал(а):
Тогда >BODY нужно переопределить

зачем?


Если >BODY есть, он должен работать предсказуемым образом.
Может я хочу использовать функцию, умеющую работать только
с адресом. И value нужно назвать по другому (даже с
подменой >BODY). Тоже касается и vect . И без маленьких букв.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 06, 2007 03:57 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Mihail писал(а):
mOleg писал(а):
Mihail писал(а):
Тогда уж:
Код:

: vect ( / name --> ) HEADER E9 C, ( jmp) ['] NOOP atod A, ;

а почему? чем мешает CALL, ?

CALL , по моему, медленнее JMP да и лишний RET придется
выполнять и на байт длиннее.

Да, согласен. Я не обратил внимания на 0xE9. Так действительно будет короче и быстрее.

Mihail писал(а):
Цитата:

Mihail писал(а):
Тогда >BODY нужно переопределить

зачем?

Если >BODY есть, он должен работать предсказуемым образом.
Может я хочу использовать функцию, умеющую работать только
с адресом. И value нужно назвать по другому (даже с
подменой >BODY). Тоже касается и vect .

Тут у меня сомнения. Мне кажется, что данный момент касается в большей мере слов созданных с помощью
CREATE - а value и vect не обязаны быть созданы таким образом.

Mihail писал(а):
И без маленьких букв.

я привел прототип - то есть данная либа не заменяет того, что есть в СПФ сейчас. Поэтому все набрано на нижнем регистре, чтобы не путаться. Когда буду включать в ядро приведу к верхнему регистру.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 09, 2007 22:43 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
учел пожелания и подсказки 8)
вместо evoke использовал from
добавил слово JMP,

Код:
\ 31-03-2007 ~mOleg v1.1
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ константы, vect и value переменные, работа с ними.

REQUIRE ?: devel\~moleg\lib\util\ifcolon.f

  \ размер адресной ссылки байт                                            \
    ?: ADDR ( --> const ) 4 ;                                              \
  \                                                                        \
  \ работа с адресными ссылками                                            \
    ?: A@ @ ; ?: A! ! ; ?: A, , ;                                          \
  \                                                                        \
  \ !!! часто используется и по сути выдает смещение от текущего           \
  \ адреса до указанного. Стоит вынести в отдельное слово.                 \
    ?: atod ( addr --> disp ) HERE ADDR + - ;                              \
  \                                                                        \
  \ делает то же, что и ['] name COMPILE,                                  \
  \ все-таки более однозначное слово, чем POSTPONE                         \
    ?: COMPILE ( --> ) ?COMP ' LIT, ['] COMPILE, COMPILE, ; IMMEDIATE      \
  \                                                                        \
  \ компилировать ассемблерную команду jmp на addr                         \
    ?: JMP,  ( addr --> ) 0xE9 C, atod A, ;                                \

\ ----------------------------------------------------------------------------

\ создать константу »
\ отличие от СПФ-варианта в том, что значение константы компилируется
\ прямо в код, в отличие от СПФ - где в код компилируется CALL на константу.
\ И это означает, что изменение значения константы не предусматривается.
: const ( n / name --> )
        CREATE , IMMEDIATE
        DOES> @
              STATE @ IF 0x8D C, 0x6D C, 0xFC C,  \ LEA EBX, -4 [EBX]
                         0x89 C, 0x45 C, 0x00 C,  \ MOV [EBP], EAX
                         0xB8 C, ,                \ MOV EAX, # const
                       ELSE
                      THEN ;

\ создать вектор-переменную »
\ если переменная не инициализирована - выполнить NOOP
: vect ( / name --> ) HEADER ['] NOOP JMP, ;

\ установить новое значение vect переменной »
: (is) ( addr 'vect --> ) TUCK ADDR + - SWAP A! ;

\ изменить значение vect переменной »
: is   ( n / name --> )
       ' 1 +
       STATE @ IF LIT, COMPILE (is)
                ELSE (is)
               THEN ; IMMEDIATE

\ получить содержимое vect переменной - то есть узнать на кого она указывает»
: (from) ( addr --> addr ) 1 + DUP A@ + ADDR + ;


\ извлечь содержимое vect переменной »
: from ( / name --> addr )
        '
        STATE @ IF LIT, COMPILE (from)
                 ELSE (from)
                THEN ; IMMEDIATE

\ создать value переменную »
: value ( n / name --> )
        HEADER
         0x8D C, 0x6D C, 0xFC C,  \ LEA EBX, -4 [EBX]
         0x89 C, 0x45 C, 0x00 C,  \ MOV [EBP], EAX
         0x90 C,                  \ NOP               \ выравнивание значения
         0xB8 C, ,                \ MOV EAX, # const  \ +08
         RET, ;

\ присвоить n value-переменной с именем name »
: to ( n / name --> )
     ' 8 +
     STATE @ IF LIT, COMPILE A!
              ELSE A!
             THEN ; IMMEDIATE

\ присвоить n value-переменной с именем name »
: +to ( n / name --> )
      ' 8 +
      STATE @ IF LIT, COMPILE +!
               ELSE +!
              THEN ; IMMEDIATE

\ заменить значение переменной на новое - старое вернуть. »
: change ( a addr --> b ) DUP @ -ROT ! ;

\ заменить значение value переменной на новое, старое вернуть. »
: exch ( a / name --> b )
       ' 8 +
       STATE @ IF LIT, COMPILE change
                ELSE change
               THEN ; IMMEDIATE

\ основное отличие от используемого в СПФ варианта заключается в том, что
\ используется не прямой шитый код а подпрограммный 8), что логично, так
\ как во всем остальном СПФ использует именно подпрограмный ШК.
\ второе, не менее важное отличие заключается в том, что нельзя присвоить
\ vect - значение по to а value с помощью is !!! Что вобщем-то достаточно
\ логично. Ну и с большой оглядкой надо использовать следующие варианты
\ CREATE-DOES> механизма: VALUE DOES> ; VECT DOES> ; CONSTANT DOES>
\ потому как поведение DOES> в таком случае не проходит- то есть вообще
\ не стоит использовать.

\EOF -- тестовая секция -----------------------------------------------------

                                   DECIMAL

  123 value proba S" должно быть 123 = " TYPE proba . CR
  200 to proba S" должно быть 200 = " TYPE proba . CR
  : testa 300 to proba ; testa S" должно быть 300 = " TYPE proba . CR
  vect sample sample S" должно быть " TYPE ' NOOP . S" = " TYPE from sample . CR
  : testb ." vect sample passed. " ; ' testb is sample   sample CR
  : testc from sample . ;
  S" должно быть " TYPE ' testb . S" = " TYPE testc CR
  20 +to proba S" должно быть 320 = " TYPE proba . CR
  : testd 30 +to proba ; S" должно быть 350 = " TYPE testd proba . CR
  234 exch proba S" должно быть 350 = " TYPE . CR
  S" должно быть 234 = " TYPE proba . CR

\  7-04-2007  теперь vect содержит JMP а не CALL на указанное слово
\             в связи с чем добавлено слово JMP,
\           спасибо ~mak 8) за подсказку.



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 00:20 
mOleg писал(а):
добавил слово JMP,

А BRANCH, чем плох?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 00:27 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
А BRANCH, чем плох?

спасибо 8) даже как-то неудобно, что я про него забыл 8(
хотя branch, может быть коротким


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 08:47 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
mOleg писал(а):
создать константу √
\ отличие от СПФ-варианта в том, что значение константы компилируется
\ прямо в код, в отличие от СПФ - где в код компилируется CALL на константу.
\ И это означает, что изменение значения константы не предусматривается.
: const ( n / name --> )
CREATE , IMMEDIATE
DOES> @
STATE @ IF 0x8D C, 0x6D C, 0xFC C, \ LEA EBX, -4 [EBX]
0x89 C, 0x45 C, 0x00 C, \ MOV [EBP], EAX
0xB8 C, , \ MOV EAX, # const
ELSE
THEN ;


Такие константы и существующими средствами можно создать, причем даже короче:
Код:
: CONST1 0x123 ;

SEE CONST1

56BD90 8945FC           MOV     FC [EBP] , EAX
56BD93 B823010000       MOV     EAX , # 123
56BD98 8D6DFC           LEA     EBP , FC [EBP]
56BD9B C3               RET     NEAR
END-CODE

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 15:01 
Ага. Заодно и не разводим лишних сучностей.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 20:39 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
Такие константы и существующими средствами можно создать, причем даже короче:
Код:

: CONST1 0x123 ;

SEE CONST1

56BD90 8945FC MOV FC [EBP] , EAX
56BD93 B823010000 MOV EAX , # 123
56BD98 8D6DFC LEA EBP , FC [EBP]
56BD9B C3 RET NEAR
END-CODE


угу, только слово CONSTANT есть уже и его нужно всеравно реализовывать.

profiT писал(а):
Ага. Заодно и не разводим лишних сучностей.

а их и нету 8) это просто другая реализация стандартного механизма.
просто мне обл пис длин слв

8))


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 21:29 
Не в сети
Аватара пользователя

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

В свете : CONST1 0x123 ; слово CONSTANT нужно вообще убрать(или не использовать).

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 21:37 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
mOleg писал(а):
угу, только слово CONSTANT есть уже и его нужно всеравно реализовывать.

В свете : CONST1 0x123 ; слово CONSTANT нужно вообще убрать(или не использовать).

гы 8)

А стандарт?
слово такое есть и пользуется частенько ( правда на мой взгляд длинновато название )


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 21:47 
Не в сети
Аватара пользователя

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

Яж и говорю - (или не использовать). :)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 11, 2007 11:54 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
mOleg писал(а):
chess писал(а):
В свете : CONST1 0x123 ; слово CONSTANT нужно вообще убрать(или не использовать).

гы 8)

А стандарт?
слово такое есть и пользуется частенько


Слово определенное через CONSTANT не должно иметь признак IMMEDIATE.


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

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


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

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


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

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