Вы не можете, по крайней мере, напрямую.
call принимает адрес в качестве параметра. Несмотря на то, что вы пишете «call functionName», компоновщик заменяет имя функции фактическим адресом функции. Вам нужно сначала сопоставить эту строку с ее адресом. В общем, C и C++ не поддерживают какие-либо метаданные времени выполнения о сопоставлениях имен функций, которые позволили бы это сделать. Если функция экспортируется из DLL, вы можете использовать GetProcAddress, чтобы найти ее адрес.
Если список функций статичен, вы можете создать сопоставление заранее самостоятельно.
Что-то типа:
std:map<string, PVOID> functionMappings;
functionMappings["MyFunction"] = MyFunction;
// Later
PVOID function = functionMappings["MyFunction"];
__asm
{
push a;
call [function]
}
Некоторые примечания:
Я считаю, что стандарт говорит, что указатель функции может быть больше, чем PVOID. Это должно работать на платформах Windows x86/x64.
Вы не сказали, какое соглашение о вызовах вы использовали - этот код предполагает stdcall.
Это очень, очень странная вещь — какую проблему вы пытаетесь решить?
person
Michael
schedule
18.02.2010