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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: 2VALUE
СообщениеДобавлено: Вс окт 31, 2010 19:43 
Не в сети

Зарегистрирован: Пт июн 06, 2008 14:21
Сообщения: 106
Откуда: Карелия
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Нужна помощь! Понадобилось преписать код, обрабатывающий числа двойной длины, конкретно хотелось иметь аналог слова VALUE, как бы 2VALUE, работающее с числами двойной длины, посмотрел исходники, попытался сам написать, но видимо не силен в ассемблере:
Код:
CODE _2CONSTANT-CODE
     LEA  EBP, -4 [EBP]
     MOV  [EBP], EAX
     POP EAX

     MOV EDX, 4 [EAX]
     LEA EBP, -4 [EBP]
     MOV [EBP], EDX
     MOV EAX, [EAX]
    RET
END-CODE

CODE _2TOVALUE-CODE
     POP EBX
     LEA EBX, -9 [EBX]
     MOV [EBX], EAX

     MOV EDX, [EBP]
     MOV [EAX], EDX
     MOV EDX, 4 [EBP]
     MOV 4 [EAX], EDX
     LEA EBP, 0xC [EBP]
     MOV EAX, -4 [EBP]
    RET
END-CODE

: 2VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _2CONSTANT-CODE COMPILE,  , ,
  ['] _2TOVALUE-CODE COMPILE,
;


Не срабатывает слово TO, может кто-то поможет?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вс окт 31, 2010 19:59 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
а для него не надо писать слово 2TO?
просто TO - для одинарного числа.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вс окт 31, 2010 20:25 
Не в сети

Зарегистрирован: Пт июн 06, 2008 14:21
Сообщения: 106
Откуда: Карелия
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
С моей колокольни вроде должно сработать
Код:
: TO \ 94 CORE EXT
\ Интерпретация: ( x "<spaces>name" -- )
\ Пропустить ведущие пробелы и выделить name, ограниченное пробелом.
\ Записать x в name. Неопределенная ситуация возникает, если name не
\ определено через VALUE.
\ Компиляция: ( "<spaces>name" -- )
\ Пропустить ведущие пробелы и выделить name, ограниченное пробелом.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Неопределенная ситуация возникает, если name не определено через VALUE.
\ Время выполнения: ( x -- )
\ Записать x в name.
\ Примечание: Неопределенная ситуация возникает, если POSTPONE или [COMPILE]
\ применяются к TO.
  '
  9 + STATE @
  IF COMPILE, ELSE EXECUTE THEN
; IMMEDIATE


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вс окт 31, 2010 20:30 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
A кто и в каком месте вызывает
F-MAP писал(а):
_2TOVALUE-CODE


??
не 2ТO ли должно это делать?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вс окт 31, 2010 23:20 
Слово TOVALUE вызывается из TO когда делается 9 + @ EXECUTE, но 2TOVALUE так вызываться не может, т.к..
Код:
: VALUE ( x "<spaces>name" -- ) \ 94 CORE EXT
  [T] HEADER [I]
  CONSTANT-CODE COMPILE, ,
  TOVALUE-CODE COMPILE,
;
F-MAP писал(а):
Код:
: 2VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _2CONSTANT-CODE COMPILE,  , ,
  ['] _2TOVALUE-CODE COMPILE,
;

: TO \ 94 CORE EXT
  '
  9 + STATE @
  IF COMPILE, ELSE EXECUTE THEN
; IMMEDIATE

Смещение 9 подойдет только для поля данных размером в одну ячейку. Такая реализация неудачна для поддержки поля данных различной длины.

Решения: либо ввести 2TO для двойных значений; либо усложнить _2CONSTANT и _2TOVALUE (чтобы хранили старшую и младшую часть или раздельно, или вместе после кода _2TOVALUE); либо изменить реализацию (например, использовать смещение -5 вместо +9) и пересобрать SPF4.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Пн ноя 01, 2010 16:26 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Все-таки проще реализовать через 2TO:

Код:
: _2CONSTANT-CODE   $ -4 @P=A A=RS $ 4 D=@A $ -8 @P=D A=@A $ -8 Pa  ;
: _2TOVALUE-CODE    B=RS $ -0D @B=A D=@P $ -9 @B=D $ 8 Pa $ -4 A=@P ;

: 2VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _2CONSTANT-CODE COMPILE,  , ,
  ['] _2TOVALUE-CODE COMPILE,  ;

: 2TO
  '
  13 + STATE @
  IF COMPILE, ELSE EXECUTE THEN
; IMMEDIATE

STARTLOG
SEE _2CONSTANT-CODE
SEE _2TOVALUE-CODE


лог
Код:
CODE _2CONSTANT-CODE
5D0647 8945FC           MOV     FC [EBP] , EAX
5D064A 58               POP     EAX
5D064B 8B5004           MOV     EDX , 4 [EAX]
5D064E 8955F8           MOV     F8 [EBP] , EDX
5D0651 8B00             MOV     EAX , [EAX]
5D0653 8D6DF8           LEA     EBP , F8 [EBP]
5D0656 C3               RET     NEAR
END-CODE
( 16 bytes, 7 instructions )


CODE _2TOVALUE-CODE
5D0673 5B               POP     EBX
5D0674 8943F3           MOV     F3 [EBX] , EAX
5D0677 8B5500           MOV     EDX , 0 [EBP]
5D067A 8953F7           MOV     F7 [EBX] , EDX
5D067D 8D6D08           LEA     EBP , 8 [EBP]
5D0680 8B45FC           MOV     EAX , FC [EBP]
5D0683 C3               RET     NEAR
END-CODE
( 17 bytes, 7 instructions )

Ok

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Ради спортивного интереса переделал VALUE и 2VALUE под одно TO:

Код:
: _CONSTANT-CODE    DUP A=RS $ 5 A=@A ;
: _TOVALUE-CODE     B=RS @B=A DROP ;

: VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _CONSTANT-CODE COMPILE,
  ['] _TOVALUE-CODE COMPILE, , ;

: _2CONSTANT-CODE   $ -4 @P=A $ -8 Pa A=RS $ 9 D=@A @P=D $ 5 A=@A  ;
: _2TOVALUE-CODE    B=RS D=@P @B=A $ 4 @B=D 2DROP ;

: 2VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _2CONSTANT-CODE COMPILE,
  ['] _2TOVALUE-CODE COMPILE, , , ;

: TO
  ' 5 +
  STATE @ IF COMPILE, ELSE EXECUTE THEN ; IMMEDIATE

ps.
1. Тут надо вспомнить о VECT и его тоже переделать под новое TO.
2. Реализация глобальных переменных типа VALUE 2VALUE, кроме
присущего всем структурам данных в SPF, недостатка, а именно, размещения кода и собственно данных в непосредственной близости
(что приводит к замедлению кода из-за переписывания кэша процессора при записи в такие структуры)
еще и не могут использоваться в макросах (из-за читающего из входного потока слова TO).
Этот момент можно обойти путем использования локальных переменых или локально-именованных глобальных переменных,
код которых удален от собственно данных на величину большую объема кэша процессора и использование которых не требует
чтения из входного потока.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вт ноя 02, 2010 17:27 
Не в сети

Зарегистрирован: Пт июн 06, 2008 14:21
Сообщения: 106
Откуда: Карелия
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Спасибо chess, выручил.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вт ноя 02, 2010 17:38 
chess писал(а):
1. Тут надо вспомнить о VECT и его тоже переделать под новое TO.
А еще вспомнить о USER-VALUE и USER-VECT ;)
И не забыть, что новое TO нельзя применять к старым VALUE (необходима пересборка ядра, или более умный "TO", который к старым будет применять старый "TO").

Избежать заглядывания вперед можно используя синтаксис (и NOTFOUND-обработчик), например
Код:
0 VALUE abc
123 =:ABC
Хотя, какой в этом смысл, если даже само слово VALUE заглядывает вперед? ;)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Вт ноя 02, 2010 18:20 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
ps.
1. Тут надо вспомнить о VECT и его тоже переделать под новое TO.

Вообще, нужно сделать ТО в виде флага и
каждый вектор или разновидность переменной будет видеть только флаг :idea: :?:

Кстати, видимо, можно оставить совместимость со старым ТО

Новое ТО может вызывать Старое ТО, и, если не получилось, что можно, видимо. анализировать, тогда только оставлять флаг. Т.о. флаг будет оставлен только для тех слов, которые не воспринимают старое ТО. а для старых слов ТО будет просто испонено IMHO


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

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


Код:
[IFNDEF] BREAK
: BREAK POSTPONE EXIT POSTPONE THEN ;  IMMEDIATE
[THEN]


: _2CONSTANT-CODE   R> 2@ ;

: 2VALUE ( x "<spaces>name" -- )
  HEADER
  ['] _2CONSTANT-CODE COMPILE, , , ;

: TO
  >IN @
  ' 1+ DUP REL@  ['] _2CONSTANT-CODE 4 -  =
  IF NIP CELL+ STATE @ IF  LIT, POSTPONE  2! ELSE 2! THEN
  BREAK  DROP
  >IN ! POSTPONE TO  ; IMMEDIATE



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Ср ноя 03, 2010 17:31 
Не в сети

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

Какая реализация лучше
Изображение
Недостаток первого способа реализации ТО -
несоотвествие стандарту ,
однако он видимо может быть решён с помощью
создания совместимого с другим типом ТО
т.е. немного более сложное ТО, которое анализирует
ситуацию, и решает, будет ли последующее слово читать флаг или
в соответствии со стандартом ждёт прочтения

Недостаток второго способа - необходимость переделывания ТО
всякий раз, когда появляется новый тип данных, видимо не может
решаться с помощью создания совместимого ТО,
т.к. каждый раз придётся переделывать ТО,
распространяя его совместимост дальшe


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Ср ноя 03, 2010 23:08 
Не в сети

Зарегистрирован: Пт июн 06, 2008 14:21
Сообщения: 106
Откуда: Карелия
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Всем спасибо за совет. Полистал на досуге книгу Л. Броуди и нашел еще такой вариант чисто на форте:
Код:
: 2VALUE CREATE , , DOES> 2@ ;
: 2TO ' >BODY STATE @ IF LIT, POSTPONE  2! ELSE  2! THEN  ;  IMMEDIATE

Может не совсем эффективно и все же, мне кажется, для форта (SPF) универсальный TO не очень подходит, как языка поддерживающего некого стандарта, видимо TO и VALUE надо определять для каждого типа данных, типа как C@, W@, @, 2@ и т.п.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Чт ноя 04, 2010 07:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4954
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
F-MAP писал(а):
Может не совсем эффективно и все же, мне кажется, для форта (SPF) универсальный TO не очень подходит

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

Код:
\ создать инициализированную переменную,
\ возвращающую по-умолчанию собственно значение.
: VALUE ( x / name --> )
        HEADER
          COMPILE (value)
          COMPILE (store)
          COMPILE (CREATE)
          A,
        ;CREATE ;

\ создать неинициализированную переменную
: USER-VALUE ( / name --> )
             HEADER
               COMPILE (uvalue)
               COMPILE (ustore)
               COMPILE (USER)
               ADDR USER-PLACE A,
             ;CREATE ;

\ сохранить значение n в VALUE переменной
: TO ( n / name --> ) ' TOKEN + REGULAR ; IMMEDIATE

\ прочесть содержимое VALUE переменной
: FROM ( / name --> xt ) ' [ 2 TOKEN * LIT, ] + REGULAR ; IMMEDIATE


в таком случае DVALUE выглядит так же:
Код:
\ создать именованую VALUE переменную, хранящую число двойной длины
: DVALUE ( d / name --> )
         NextWord SHEADER
           COMPILE (DVAL)
           COMPILE (DTOV)
           COMPILE (CREATE)
           D,
         ;CREATE ;


\ создать пользовательскую именованую переменную двойной длины
: USER-DVAL ( --> d )
            NextWord SHEADER
              COMPILE (DUVAL)
              COMPILE (DTOUVAL)
              COMPILE (USER)
              CELL USER-PLACE ,
              1 DOUBLES USER-ALLOT
            ;CREATE ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: 2VALUE
СообщениеДобавлено: Чт ноя 04, 2010 19:27 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
Да все подходит. Вообще это лучше всего смотрится в косвенном ШК, когда просто читается адрес следующего фрагмента шитого кода, добавляется смещение в нужное поле кода (у VALUE (бывших QUAN) переменых их три) и туда передается управление. Проблема с СПФом лишь в том, что поля кода размещены не одно за другим, а потом данные, а в перемешку (чего в форке, к примеру, давно уже и нет):

Если мы захотим заинлайнить этот код?


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

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


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

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


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

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