Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 08:30   #1
sprog
Новичок
Джуниор
 
Регистрация: 10.09.2009
Сообщений: 2
По умолчанию Вызов переданной в параметре функции на С/С++

Есть необходимость вызывать произвольную функцию с неизвестным числом параметров переданную в качестве аргумента другой функции. Как это реализовать принципиально понятно:
Код:
int ra, rb;

#pragma optimize( "y", on )//гарантируем создание кадра стека
int CallIn(void* f, ...)
{
  __asm
  {
    pop  ebp       //вынимаем обратно (запихивается при генерации пролога функции для создания кадра стека)
    pop  ra          //сохраняем адрес возврата
    mov  rb, esp  //сохраняем текущую позицию стека
    pop  eax        //получаем адрес вызываемой функции
    call eax          //вызываем...
    mov  esp, rb  //восстанавливаем стек
    push ra         //возвращаем адрес возврата
    push ebp      //запихиваем для правильной отработки эпилога
  }
}

int main()
{
  CallIn(MessageBox, NULL, "message", "title", MB_OK);
  CallIn(sprintf, "text");
	return 0;
}
Проблема в том, что этот финт прокатывает только на х86. VS принципиально не поддерживает inline ассемблер для х64. Встаёт вопрос как же то же самое реализовать средствами С...
sprog вне форума Ответить с цитированием
Старый 10.09.2009, 08:52   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
VS принципиально не поддерживает inline ассемблер для х64.
А у меня Borland C++ такое хавает, за исключением:
1. проще делать jmp f
2. Это не самая хорошая стратегия.

Вот тут покрутил отладчик:
Код:
#include <windows.h>
#pragma optimize( "y", on )//гарантируем создание кадра стека

int ra, rb;
int CallIn(void* f, ...)
{
  __asm
  {
   pop eax;
   pop eax;
   jmp f
   push eax;
  }
}

int main()
{
  CallIn(MessageBoxA, NULL, "message", "title", MB_OK);
 // CallIn(sprintf, "text");
	return 0;
}
Так заработало без AV вначале, но AV в конце вылазит. И я знаю почему
I'm learning to live...

Последний раз редактировалось Stilet; 10.09.2009 в 09:00.
Stilet вне форума Ответить с цитированием
Старый 10.09.2009, 09:11   #3
sprog
Новичок
Джуниор
 
Регистрация: 10.09.2009
Сообщений: 2
По умолчанию

jmp f нельзя, это очевидно.
вопрос не в оптимизации ассемблера, а в избавлении от него...
sprog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов процедуры/функции W0LF Общие вопросы Delphi 7 26.07.2009 23:53
Вызов функции по событию phobos Общие вопросы .NET 8 26.05.2009 01:06
Вызов функции MarSeON PHP 2 01.08.2008 20:22
Функция в параметре другой функции.. templllar Помощь студентам 2 14.04.2008 14:56
Вызов функции по таймеру Lexicss Общие вопросы Delphi 4 30.05.2007 22:47