Можно ли вызвать функцию, запихав аргументы в стек руками?
От: Misha87  
Дата: 24.12.08 21:01
Оценка:
Я опять о своем. Пусть у меня есть void* ааа. Я знаю что это указатель на функцию. В тантайме я узнаю все про агрументы и возвращемое значение. Можно ли как-то запихать в стек ручккми все нужные агрументы, вызвать функцию без аргуметров, и потом снять руками со стека результат? То есть хочется вот такого хака:

void   CallMyFucntion(void* functPtr, char* arguments="int, float")
{
   push_to_stek(intVal);
   push_to_stek(floatVal);
   void (*func)();
   func = functPtr;
   func();

   result = pop_stek();
}


Как такое реализовать? в ассемблер надо лезть?
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От: AstroMan  
Дата: 24.12.08 21:37
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Я опять о своем. Пусть у меня есть void* ааа. Я знаю что это указатель на функцию. В тантайме я узнаю все про агрументы и возвращемое значение. Можно ли как-то запихать в стек ручккми все нужные агрументы, вызвать функцию без аргуметров, и потом снять руками со стека результат? То есть хочется вот такого хака:


M>
M>void   CallMyFucntion(void* functPtr, char* arguments="int, float")
M>{
M>   push_to_stek(intVal);
M>   push_to_stek(floatVal);
M>   void (*func)();
M>   func = functPtr;
M>   func();

M>   result = pop_stek();
M>}
M>


M>Как такое реализовать? в ассемблер надо лезть?

В такой постановке задачи — надо лезть.
Вот я тут недавно лепил подобное:
http://www.rsdn.ru/forum/message/3194324.1.aspx
Автор: AstroMan
Дата: 30.11.08


Я почему бы просто не передавать в функции массив каких-нибудь вариантов?
Реализацию функций у тебя пишут специально для регистрации в машине?
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От: Аноним  
Дата: 24.12.08 21:51
Оценка:
Можно то можно, но это очень платформозависимый хак. Например на х64 платформе вобще первые 4 аргумента передаются через регистры, а стек надо по особому выравнивать.
А чем не угодили старые добрые три точки в аргументах?
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От: Sergey Россия  
Дата: 24.12.08 22:07
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Я опять о своем.


Тебе ж написали уже что делать: http://www.rsdn.ru/forum/message/3227480.1.aspx
Автор: -MyXa-
Дата: 24.12.08
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От: 8bit  
Дата: 24.12.08 22:12
Оценка:
Здравствуйте, Misha87, Вы писали:

В соседнем разделе уже все обсудили
http://rsdn.ru/forum/message/3227121.aspx
Автор: 8bit
Дата: 24.12.08
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 07:36
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Тебе ж написали уже что делать: http://www.rsdn.ru/forum/message/3227480.1.aspx
Автор: -MyXa-
Дата: 24.12.08


Ничего мне никто не посоветовал сделать так, как было задумано в самом начальном вопросе — чтобы пользователю ввоще не было видно никаких шаблонов. Все советы свелись к запрятыванию этих же шаблонов в макросы. То есть как сделать регитсрацию вот в таком виде:

bool RegCallback("int MyFunction(int aa=0, float bb=0.0, int cc=1)", void* funcPtr)


никто такого решения не предложил. Извраты с шаблонами, умными указателями и прочими, так что эту всю кухню видит пользователь, у меня сейчас уже сделана и работает — я хочу сделать именно так как в приведенном примере
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 07:37
Оценка: -1
Здравствуйте, 8bit, Вы писали:

Неа


Ничего мне никто не посоветовал сделать так, как было задумано в самом начальном вопросе — чтобы пользователю ввоще не было видно никаких шаблонов. Все советы свелись к запрятыванию этих же шаблонов в макросы. То есть как сделать регитсрацию вот в таком виде:

bool RegCallback("int MyFunction(int aa=0, float bb=0.0, int cc=1)", void* funcPtr)


никто такого решения не предложил. Извраты с шаблонами, умными указателями и прочими, так что эту всю кухню видит пользователь, у меня сейчас уже сделана и работает — я хочу сделать именно так как в приведенном примере
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 07:42
Оценка:
Здравствуйте, AstroMan, Вы писали:

AM>Вот я тут недавно лепил подобное:

AM>http://www.rsdn.ru/forum/message/3194324.1.aspx
Автор: AstroMan
Дата: 30.11.08


O, суперско. А для других типов кроме целого что-нибудь придумалось?

AM>Я почему бы просто не передавать в функции массив каких-нибудь вариантов?


Не, хочется чтобы просто у пользовтаеля есть его обычная функция с обычными парамтерами и он одной строкой мог зарегистрить её в скриптовыую машину. Пути через зад со всякими шаблона, вариантами, стеками, машинами состоняий и прочее не хочется. Точнее не хочется чтобы это все видел пользовтаель, или тем боллее как-то эта кухня влияла на способ написания колбеков.

AM>Реализацию функций у тебя пишут специально для регистрации в машине?

Да
Re[3]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Сергей  
Дата: 25.12.08 07:48
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Ничего мне никто не посоветовал сделать так, как было задумано в самом начальном вопросе — чтобы пользователю ввоще не было видно никаких шаблонов. Все советы свелись к запрятыванию этих же шаблонов в макросы. То есть как сделать регитсрацию вот в таком виде:


M>
M>bool RegCallback("int MyFunction(int aa=0, float bb=0.0, int cc=1)", void* funcPtr)
M>


M>никто такого решения не предложил. Извраты с шаблонами, умными указателями и прочими, так что эту всю кухню видит пользователь, у меня сейчас уже сделана и работает — я хочу сделать именно так как в приведенном примере


Посмотри в исходники AngelScript — это интерпретатор, в котором можно регистрировать сишные и сиплюсплюсные функции практически так, как тебе надо.

Выглядит примерно так:
void Func(int a, float b);
r = engine->RegisterGlobalFunction("void Func(int, float)", asFUNCTION(globalFunc), asCALL_CDECL);
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От: byleas  
Дата: 25.12.08 08:13
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Я опять о своем. Пусть у меня есть void* ааа. Я знаю что это указатель на функцию. В тантайме я узнаю все про агрументы и возвращемое значение. Можно ли как-то запихать в стек ручккми все нужные агрументы, вызвать функцию без аргуметров, и потом снять руками со стека результат? То есть хочется вот такого хака:

Можно посмотреть исходники плагина System к NSIS. Там как раз делается это же, вызов внешней функции из интерпретатора, параметры задаются строкой, довольно мощный синтаксис (работа со структурами, памятью, СОМ-интерфейсами).
Re[3]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: 8bit  
Дата: 25.12.08 10:27
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Неа


Миша, вообще-то топик "Можно ли вызвать функцию, запихав аргументы в стек руками?"
Там, куда я дал ссылку, именно про это.
Re[4]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 10:38
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Там, куда я дал ссылку, именно про это.


А, FFI имеется ввиду? Спасибо буду разбираться
Re[4]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 10:45
Оценка:
ПРосто я что-то никак не могу разобраться как эту libffi под MSVC скомпилить
Re[5]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: 8bit  
Дата: 25.12.08 10:55
Оценка:
Здравствуйте, Misha87, Вы писали:

M>ПРосто я что-то никак не могу разобраться как эту libffi под MSVC скомпилить

Читаем внимательней, там ниже nen777w тоже спросил о том как построить.
Вообщем, тебе лучше поглядеть на http://www.nongnu.org/cinvoke/ там есть проект под vs.
Re[6]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 10:58
Оценка:
Здравствуйте, 8bit, Вы писали:

Спасибо большое.
Слуш, а откуда ты все такие либы тянешь? Помнится в другом топике про OpenGL GUI ты тоже какого-то зверя порекомендовал. Ты как ишешь такое?
Re[7]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: 8bit  
Дата: 25.12.08 11:12
Оценка:
Здравствуйте, Misha87, Вы писали:

M>Спасибо большое.

M>Слуш, а откуда ты все такие либы тянешь? Помнится в другом топике про OpenGL GUI ты тоже какого-то зверя порекомендовал. Ты как ишешь такое?

гугл начало всех начал. Могу например целый день копаться в том что он там мне выдает по моим запросам.
Перечитать\пересмотреть кучу всякого хлама, сотни переходов по ссылкам, что бы найти то что надо. Вот так все и находится.
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От: nen777w  
Дата: 25.12.08 13:03
Оценка:
M>Как такое реализовать? в ассемблер надо лезть?

У меня такая же задача. Вот есть две великолепные либы:
libffi
cinvoke
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 13:16
Оценка:
Здравствуйте, nen777w, Вы писали:

Я вот тут написал своё на базе исходников AngelScript. Все работает, все суперю. Но думаю — баги будут если на 64 надо будет перейти. А в эти либы работа с x64 уже встароена?
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Misha87  
Дата: 25.12.08 13:17
Оценка:
Здравствуйте, nen777w, Вы писали:

Могу кстати выложить, что я понаписал. Попинаете?
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
От: Кодт Россия  
Дата: 25.12.08 13:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Можно то можно, но это очень платформозависимый хак.


Платформозависимость здесь только в том, что void* <-> void(void), что не для всех моделей памяти справедливо.
Впрочем, последний раз я такое разделение видел под дос.

А>Например на х64 платформе вобще первые 4 аргумента передаются через регистры, а стек надо по особому выравнивать.


Если конвенция __cdecl, то там все аргументы передаются через стек. Иначе это уже не __cdecl, а компиляторно-зависимый __fastcall.

А>А чем не угодили старые добрые три точки в аргументах?


(Это, кстати, и будет честный __cdecl).
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.