Forth
http://fforum.winglion.ru/

Формат вызова Quark
http://fforum.winglion.ru/viewtopic.php?f=23&t=814
Страница 1 из 2

Автор:  Hishnik [ Вт июн 19, 2007 00:06 ]
Заголовок сообщения:  Формат вызова Quark

Сейчас с параметром вызывается только Evaluate. Формат вызова у него register - eax получает параметр, и возвращает результат. Для экспериментов, ввиду проблем с вызовом quark.dll из SPF, добавил EvaluateC, у которого stdcall (параметр на стеке).

Автор:  begemot [ Вт июн 19, 2007 05:42 ]
Заголовок сообщения: 

а я что то не понял .. зачем форт вызывать из форта ?

Автор:  Hishnik [ Вт июн 19, 2007 19:44 ]
Заголовок сообщения: 

Да и я не понял... попросили, однако.

Автор:  in4 [ Вт июн 19, 2007 23:22 ]
Заголовок сообщения: 

begemot писал(а):
а я что то не понял .. зачем форт вызывать из форта ?

Разные версии, однако... ;)

Автор:  VoidVolker [ Пн ноя 17, 2008 02:30 ]
Заголовок сообщения: 

Вызов кварка в СПФ осуществляется так(огромное спасибо за помощь mOleg'у):
Код:
REQUIRE CODE lib\ext\spf-asm.f

CODE  EAX-API-CALL ( ... extern-addr -- x )
\ вызов внешней функции (API или метода объекта через COM) с передачей параметра в регистре EAX
      PUSH EDI

      MOV EDX, [EBP]
      LEA EBP, 4 [EBP]

      PUSH EBP
      SUB  ESP, # 60
      MOV  EDI, ESP
      MOV  ESI, EBP
      MOV  ECX, # 15
      CLD
      REP MOVS DWORD
      MOV  EBP, ESP

      XCHG EAX, EDX
      CALL EDX

      MOV  EBX, EBP
      SUB  EBX, ESP
      MOV  ESP, EBP
      ADD  ESP, # 60
      POP EBP
      SUB EBP, EBX
      POP EDI
      RET
END-CODE

0 VALUE ActiveLibrary
: FUNCTION   DROP ActiveLibrary GetProcAddress VALUE ;

S" quark.dll" DROP LoadLibraryA CONSTANT 'quark.dll
'quark.dll TO ActiveLibrary

S" Evaluate"   FUNCTION 'Evaluate    : QUARK-EVAL  'Evaluate EAX-API-CALL ;
S" Init"       FUNCTION 'Init        : QUARK-INIT  'Init API-CALL ;
S" Done"       FUNCTION 'Done        : QUARK-DONE  'Done API-CALL ;
S" GetCode"    FUNCTION 'GetCode     : QUARK-GETCODE   'GetCode API-CALL ;
S" GetData"    FUNCTION 'GetData     : QUARK-GETDATA   'GetData API-CALL ;
S" GetStack"   FUNCTION 'GetStack    : QUARK-GETSTACK   'GetStack API-CALL ;
S" GetDepth"   FUNCTION 'GetDepth    : QUARK-GETDEPTH   'GetDepth API-CALL ;
S" GetScreen"  FUNCTION 'GetScreen   : QUARK-GETSCREEN   'GetScreen API-CALL ;
S" SetHWindow" FUNCTION 'SetHWindow  : QUARK-SETHWINDOW   'SetHWindow EAX-API-CALL ;

QUARK-INIT .( Init: ) . CR
S"  777 1000 +" DROP QUARK-EVAL .( Evaluate: ) . CR
QUARK-GETSTACK @ .( Stack: ) .

Причина неработоспособности была в регистре EAX: в спф вызов апи-функции осуществляется из этого регистра.

Автор:  ygrek [ Пт ноя 21, 2008 00:50 ]
Заголовок сообщения: 

Причина неработоспособности (как и следовало ожидать) в quark.dll, т.к. EvaluateC не соответствует формату вызова stdcall. После исправления всё работает как и должно :

Код:
WINAPI: Init quark.dll
WINAPI: EvaluateC quark.dll
WINAPI: GetStack quark.dll

: e EvaluateC ABORT" EvaluateC failed" ;

Init . CR
S" 777 1000 + " DROP e
GetStack @ . CR


Код:
1
1777

Автор:  Hishnik [ Пт ноя 21, 2008 01:03 ]
Заголовок сообщения: 

ygrek писал(а):
Причина неработоспособности (как и следовало ожидать) в quark.dll, т.к. EvaluateC не соответствует формату вызова stdcall. После исправления всё работает как и должно :

Кварк я не исправлял. СПФ адаптирован к формату вызова register.

Автор:  ygrek [ Пт ноя 21, 2008 01:36 ]
Заголовок сообщения: 

Я исправлял.

Автор:  Гость [ Пт ноя 21, 2008 08:31 ]
Заголовок сообщения: 

ygrek писал(а):
Я исправлял.


И где?
А Форт системы на базе fasm ( reda, reva и др.) также просто подключаются?

Автор:  VoidVolker [ Пт ноя 21, 2008 20:57 ]
Заголовок сообщения: 

ygrek писал(а):
Причина неработоспособности (как и следовало ожидать) в quark.dll, т.к. EvaluateC не соответствует формату вызова stdcall. После исправления всё работает как и должно

Где и что исправлено? И вот что надо исправить в ннкроне, чтоб заработало?

Автор:  ygrek [ Сб ноя 22, 2008 01:52 ]
Заголовок сообщения: 

Цитата:
Quark-Forth распространяется бесплатно, без предоставления исходных текстов.
Декомпиляция, дизассемблирование или внесение изменений в программу любыми
способами запрещены
и лишают пользователя права на использование продукта.

К сожалению публикация исправления может спровоцировать пользователя нарушить лицензию кварка.

Автор:  Hishnik [ Сб ноя 22, 2008 13:42 ]
Заголовок сообщения: 

ygrek писал(а):
К сожалению публикация исправления может спровоцировать пользователя нарушить лицензию кварка.

Меня тут внезапно осенило! :)) Можно объяснить суть исправления мне, и я его внесу в исходные тексты. Кстати, докомпиляция или правка кода штатными средствами кварка условия его использования не нарушает.

Автор:  ygrek [ Сб ноя 22, 2008 22:32 ]
Заголовок сообщения: 

Вместо jmp на Evaluate надо call, либо пролог заменить.

Автор:  Hishnik [ Сб ноя 22, 2008 23:48 ]
Заголовок сообщения: 

Ок. Я не знаю, так ли я сделал, но исправленный вариант перезалит на обычное место (www.msyst.ru/quarkexe.zip)

Автор:  VoidVolker [ Вс ноя 23, 2008 13:52 ]
Заголовок сообщения: 

Ага, все работает и в спф и в ннкроне. :)
ygrek спасибо :)

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/