Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Постановка задачи
Что же я имел ввиду, когда написал «неизвестное» имя функции? А значит это то, что имя функции, её параметры и, в конце концов, соглашение вызова, становятся известными только во время выполнения программы. Займемся её вызовом! =)
Что же у нас есть:Хм…
1) char* sName — тут находится имя функции
2) int N — количество параметров
size_t ExecuteFunc__сdecl(void* func_ptr, int argc, size_t argv[] )
{
typedef size_t (__cdecl *func0)(void);
typedef size_t (__cdecl *func1)(size_t);
....
typedef size_t (__cdecl *funcN)(size_t, .... , size_t);
switch( argc ) {
case 0: return ((func0)func_ptr)();
case 1: return ((func1)func_ptr)(argv[0]);
....
case N: return ((func0)func_ptr)(argv[0], argv[1], .... , argv[N]);
}
/* как-то разбираемся с нештатной ситуацией */
return 0;
}
MOVQ [EAX], MM0
EMMScall _Z4funcd
fstpl 16(%esp)По идее здесь нужно изъять из ST(0) ответ. Пока что у меня не получилось этого сделать.
push c
push b
push a
call function_name
add esp, 12 ;Stack clearing
mov x, eax
Вызов функции с «неизвестным» именем на C++. Часть 1 — cdecl