Соглашение о вызове динамически создаваемой функции в (Visual) C ++

Я использую следующие типы для создания новой функции во время выполнения:

typedef int (*pfunc)(int);

union funcptr {
  pfunc x;
  byte* y;
};

Это позволяет мне писать инструкции в y и затем вызовите функцию следующим образом:

byte* p = (byte*)VirtualAllocEx(GetCurrentProcess(), 0, 1<<16, MEM_COMMIT, PAGE_EXECUTE_READWRITE );

// Write some instructions to p

funcptr func;
func.y = p;

int ret = func.x(arg1); // Call the generated function

Крайне важно знать, как C ++ подготавливает аргументы (соглашение о вызовах), поэтому я просмотрел свойства проекта (Visual C ++) и вижу, что он использует __ cdecl . Он должен помещать аргументы в стек в соответствии с: http://msdn.microsoft.com/en-us/library/aa271989 (v = vs.60) .aspx и http: // en.wikipedia.org/wiki/X86_calling_conventions#cdecl, но когда я смотрю на сгенерированную сборку, аргумент перемещается в регистр EAX.

Я хочу быть абсолютно уверенным в том, как подготовлены аргументы. Так что я что-то упустил из виду cdecl или Visual C ++ оптимизирует вызов, и если да, как мне убедиться, что этого не произойдет?

С уважением, Лассе Эспехольт

5
задан David Heffernan 26 November 2011 в 16:42
поделиться