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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 108 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: Re: Forth++
СообщениеДобавлено: Чт окт 28, 2010 15:59 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
А что это за команды в общепринятом синтаксисе?
Код:
\ PUSH [ESI][EBP]
A;   0xFF C, 0x74 C, 0x2E C, 0x00 C,


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth++
СообщениеДобавлено: Чт окт 28, 2010 16:14 
Не в сети
Аватара пользователя

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


PUSH [ESI][EBP] - это положить содержимое ячейки памяти, на которую указызывает содержимое EBP + смещение,
которое есть содержимое регистра ESI.
На моем встроенном ассме это выглядит так:
Код:
: C-CALL ( x1 ... xn n adr -- res ) \ int fun(x1 .. xn);
  B=@P ( число аргументов ) $ 4 S=#
  L1: B|B  L2 J0= $ 0 RS=@SP $ 4 Sa B-- L1 JMP
  L2: :A  C=@P  $ 2 #C<<  X+C  $ 4 C+#  P+C  ;

STARTLOG
SEE C-CALL
лог
Код:
CODE C-CALL
5D063F 8B5D00           MOV     EBX , 0 [EBP]
5D0642 C7C604000000     MOV     ESI , # 4
5D0648 0BDB             OR      EBX , EBX
5D064A 740A             JE      5D0656
5D064C FF742E00         PUSH    0 [ESI] [EBP]
5D0650 8D7604           LEA     ESI , 4 [ESI]
5D0653 4B               DEC     EBX
5D0654 EBF2             JMP     5D0648
5D0656 FFD0             CALL    EAX
5D0658 8B4D00           MOV     ECX , 0 [EBP]
5D065B C1E102           SHL     ECX , 2
5D065E 03E1             ADD     ESP , ECX
5D0660 81C104000000     ADD     ECX , # 4
5D0666 03E9             ADD     EBP , ECX
5D0668 C3               RET     NEAR
END-CODE
( 42 bytes, 15 instructions )

Ok

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



За это сообщение автора chess поблагодарил: dynamic-wind
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Реализация вызова объекта С++ из C (на примере Qt)
СообщениеДобавлено: Вт ноя 02, 2010 20:43 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Ниже дана программа, показывающая возможность инициализации и работы с объектами С++ из форта. В частности, происходит подключение к DLL графической системы Qt, инициализация системы, создание окна и его отображение на экране. Программа написана на С, так как на SPF я не могу реализовать вызовы __thiscall на SPF. Прошу знатоков SPF и ассемблера ввести в состав форта набор слов реализующих вызовы __thiscall, например по типу C-CALL пусть будет THIS-CALL

Код:
// c_qt.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

typedef           void*  p;    // Просто указатель
typedef  void  (*proc)(void);   //указатель на процедуру

// Набор определений, для вызова процедуры по адресу с различным кол входных и
// выходных параметров
typedef  void (__stdcall *call_0_0)(void);   // void call(void);
typedef   p (__stdcall *call_1_0)(void);   //    p call(void);

typedef  void (__stdcall *call_0_1)(p);      // void call(p);
typedef   p (__stdcall *call_1_1)(p);      //    p call(p);

typedef  void (__stdcall *call_0_2)(p, p);   // void call(p, p);
typedef   p (__stdcall *call_1_2)(p, p);   //    p call(p, p);

typedef  void (__stdcall *call_0_3)(p, p, p);   // void call(p, p, p);
typedef   p (__stdcall *call_1_3)(p, p, p);   //    p call(p, p, p);


   HMODULE adll;
   FARPROC aProcApp;
   FARPROC aProcQWidget;
   FARPROC aProcQWidgetShow;
   FARPROC aProcQAppExec;
   void *adr;


int main(int argc, char* argv[])
{
   HGLOBAL uApp;
   HGLOBAL uQWidget;

   adll = LoadLibrary("QtGuid4.dll");   // Грузим в память DLL из состава Qt

   // uApp = QApplication(argc, argv);  // моделируем данный вызов средствами C
   aProcApp     = GetProcAddress(adll, "??0QApplication@@QAE@AAHPAPAD@Z");  // ищем адрес конструктора QApplication
   uApp     = GlobalAlloc(GHND, 1000);  // выделяем под объект место, т.к. размер сейчас не важен то просто блок в 1000 байт
   _asm { mov ecx, uApp } ((call_0_2)aProcApp)((p)&argc, (p)argv); // непосредственно вызов конструктора

   // uQWidget = QWidget(NULL, "Widget1", NULL);
   aProcQWidget = GetProcAddress(adll, "??0QWidget@@QAE@PAV0@PBDV?$QFlags@W4WindowType@Qt@@@@@Z");
   uQWidget = GlobalAlloc(GHND, 1000);
   _asm { mov ecx, uQWidget } ((call_0_3)aProcQWidget)(NULL, "Widget1", NULL);

   // uQWidget.show();
   aProcQWidgetShow = GetProcAddress(adll, "?show@QWidget@@QAEXXZ");
   _asm { mov ecx, uQWidget } ((call_0_0)aProcQWidgetShow)();

   // uApp.exec();
   aProcQAppExec = GetProcAddress(adll, "?exec@QApplication@@SAHXZ");
   _asm { mov ecx, uApp } ((call_0_0)aProcQAppExec)();

   return 0;
}


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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Народ! Помогите написать на ассемблере форта новое слово THIS-CALL (вызов конструктора C++).
Для этого в C-CALL надо вставить (вопрос только куда????) _asm { mov ecx, АдресБлокаПамяти }


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth++
СообщениеДобавлено: Чт ноя 04, 2010 22:47 
Посмотрите, как сделан C-CALL2 (определение рядом с C-CALL )
Код:
CODE C-CALL2 ( x1 ... xn n adr -- dres)
  CALL ' C-CALL
  LEA EBP, -4 [EBP]
  MOV [EBP], EAX
  MOV EAX, EDX
  RET
END-CODE

Значит, будет нечто вроде:
Код:
CODE THIS-CALL ( x1 ... xn n this adr -- res)
  MOV ECX, [EBP]
  LEA EBP, 4 [EBP]
  CALL ' C-CALL
  RET
END-CODE


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Помогите изменить CAPI-CALL
СообщениеДобавлено: Пн ноя 08, 2010 18:45 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Спецы по асму, помогите изменить CAPI-CALL.

Нужно смоделировать вызов (вызов конструктора C++ проще говоря):
Код:
   
_asm { mov ecx, uApp } (__stdcall(call_0_2)aProcApp)((p)&argc, (p)argv); // uApp = QApplication(argc, argv);

Сейчас в CAPI-CALL регистр ECX используеться для внутренних расчетов, и соответственно затираеться.

Помогите!!!

P.S. В SPF нужна полная поддержка всех типов вызовов, как в С++ (__stdcall, __cdecl, __thiscall и т.д.) а её нет. Вот вам и стандартизация ......


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
О какой форт-системе речь, о какой ОС речь?
если в СПФ под виндой, то ECX не используется, его можно не сохранять.
Верхний элемент стека кешируется в EAX, поэтому может быть достаточно последовательности:
MOV ECX, EAX
MOV EAX , ApiAddr
CALL EAX
Кроме того, надо не забыть, что у форта минимум два стека, и указатель на стек данных(либо возвратов) надо где-то сохранять.

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


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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Я говорю о СПФ и Win (хотя Linux в планах). Я смотрю на код CAPI-CALL и вижу использование ECX. Однако win предпологает передачу в нем адреса буфера под объект. Я понимаю, что нужно менять код CAPI-CALL и прошу помощи в этом, тем более, что на С (см выше) все замечательно работает.

Неужели на СПФ нельзя сделать то что можно на С ....


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth++
СообщениеДобавлено: Пн ноя 08, 2010 19:32 
Не в сети
Moderator
Moderator
Аватара пользователя

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

скорее всего под линукс придется писать свой метод вызова.

mgw писал(а):
Я смотрю на код CAPI-CALL и вижу использование ECX.

мне не нравится СПФовский вызов АПИ, однако ECX в нем используется временно для копирования нужного количества параметров со стека данных на стек возвратов. То есть, посл пересылки данных в ЕСХ можно поместить нужное вам значение. Было бы лучше, если бы вы привели код рассматриваемого CAPI-CALL здесь, тогда разговор был бы предметнее.


mgw писал(а):
Неужели на СПФ нельзя сделать то что можно на С ....

можно, но не так, как на С ...

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


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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Код CAPI-CALL следующий (СПФ ~\lib\win\api-call\capi.f ) :

Код:
CODE (CAPI-CALL) ( EAX - extern-addr, ECX - n -- x )
      OR   ECX, ECX
      JZ   SHORT @@1
      LEA  EBX, [ECX*4]
      SUB  ESP, EBX
      MOV  EDX, EDI
      MOV  EDI, ESP
      MOV  ESI, EBP
      CLD
      REP MOVS DWORD
      MOV EDI, EDX
      ADD EBP, EBX
      CALL EAX
      ADD  ESP, EBX
      RET

@@1:  CALL EAX
      RET
END-CODE

CODE CAPI-CALL ( ... n extern-addr -- x )
\ вызов внешней функции, экспортированной по c-правилам
      MOV  ECX, [EBP]
      LEA  EBP, 4 [EBP]
      CALL ' (CAPI-CALL)
      RET
END-CODE


Наверное адрес буфера под объект в стеке надо располагать перед параметрами, тогда его в последний момент можно записать в ECX.

С точки зрения стандартизации, вызовы функций в SPF совершенно не проработаны.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Код:
CODE (CAPI-CALL) ( EAX - extern-addr, ECX - n -- x )
      OR   ECX, ECX        \
      JZ   SHORT @@1    \ если в ЕСХ находится нуль переход на метку 1
      LEA  EBX, [ECX*4]  \  EBX = ECX* размер ячейки
      SUB  ESP, EBX        \ выделить в стеке возвратов место под фрейм данных
      MOV  EDX, EDI        \ сохранить TLS
      MOV  EDI, ESP        \ куда
      MOV  ESI, EBP        \ откуда
      CLD                        \  от младших адресов к старишим
      REP MOVS DWORD  \ копировать (тут как раз ECX используется)
      MOV EDI, EDX         \ вернуть TLS
      ADD EBP, EBX         \ удалить данные со стека данных
      CALL EAX                \ вызвать ф-цию
      ADD  ESP, EBX        \ удалить фрейм
      RET                        \ вернуться
@@1:  CALL EAX           \ вызов без параметров (?с одним параметром)
      RET                        \ вернуться
END-CODE


надеюсь так будет чуточку понятнее что делается

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



За это сообщение автора mOleg поблагодарил: mgw
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth++
СообщениеДобавлено: Пн ноя 08, 2010 20:55 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
Посмотрел fork (крутая штука), там вообще по другому вызов реализован (или это асм другой). Детализация и комментарии - супер! Однако не понял, под Linux портировано или нет?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Forth++
СообщениеДобавлено: Пн ноя 08, 2010 21:01 
Не в сети
Moderator
Moderator
Аватара пользователя

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

И то и другое (в некотором роде, потому что асм тот же с небольшой добавкой).
Но, там память системы распределяется иначе, чем в СПФе, поэтому для СПФа этот метод не покатит.

mgw писал(а):
Детализация и комментарии - супер!

да, я стараюсь делать понятно, хотя часто это не просто.

mgw писал(а):
Однако не понял, под Linux портировано или нет?

пока нет. по нескольким причинам.
1) у меня нет линукса и некуда его ставить (на мой ноут оно становится криво)
2) у меня нет нужды в линуксе и необходимых программ под него
3) я еще не доделал в ядре все изменения, которые хотел, а делать сразу все оказалось слишком муторно.
однако, разговор об этом таки в другом разделе форума вестись должен

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


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

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
После долгих мучений удалось вызвать объекты C++. В качестве примера http://mgw.narod.ru/spf_qt.zip в котором лежит пример работы SPF с Qt 4.3 (http://ru.wikipedia.org/wiki/Qt) для Windows.

Большое спасибо mOleg и Kopa за ценные мысли.


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
mgw писал(а):
В качестве примера http://mgw.narod.ru/spf_qt.zip в котором лежит пример работы SPF с Qt 4.3

После кой-каких коррекций исходников вылетело окошко с заголовком "spf4"(имя похоже берется из имени транслятора).
Кроме QtCored4.dll и QtGuid4.dll оказались нужны еще Msvcp60d.dll и Msvcrtd.dll(видимо вызываются из QtCored4.dll и/или QtGuid4.dll).
Если (THIS-API-CALL) переписать в указанном ниже виде, то не надо писать DROP DROP после THIS-API-CALL:
Код:
CODE (THIS-API-CALL) ( EAX - extern-addr, ECX - n -- x )
      OR   ECX, ECX
      JZ   SHORT @@1
      LEA  EBX, [ECX*4]
      SUB  ESP, EBX
      MOV  EDX, EDI
      MOV  EDI, ESP
      MOV  ESI, EBP
      CLD
      REP MOVS DWORD
      MOV EDI, EDX
      ADD EBP, EBX
      MOV ECX, [EBP]
      CALL EAX
      ADD  ESP, EBX
      JMP SHORT @@2
@@1:  MOV ECX, [EBP]
      CALL EAX
@@2:  MOV EAX, 4 [EBP]
      LEA  EBP, 8 [EBP]
      RET
END-CODE

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


Последний раз редактировалось chess Вт ноя 09, 2010 17:58, всего редактировалось 1 раз.


За это сообщение автора chess поблагодарил: mgw
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 108 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.

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


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

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


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

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