以下gcc中的visual studio jmp等效于什么?
extern "C" __declspec(naked) void __stdcall Proxy_Function()
{
__asm
{
jmp Procs[0];
}
}
以上在Visual Studio中工作正常。
使用gcc,我尝试过:
extern "C" void __stdcall Proxy_Function()
{
__asm("jmp *%0":: "r" (Procs[0]):);
}
但是,当我这样做时,我的程序崩溃了。有任何想法吗?
最佳答案
这里的问题很可能是gcc-for-x86没有等效于__declspec(naked)
的,因此,由gcc编译的代码会对堆栈进行某些本不应该的操作,从而导致Procs[0]
的返回跳转到错误的位置。我必须确保为Proxy_Function
生成了程序集。
我建议写一个.asm
文件,而不是试图将其拖入GCC。在ELF系统上,这可以工作:
.text
.globl Proxy_Function
.type Proxy_Function,@object
Proxy_Function:
movl Procs, %eax
jmp *%eax
.size Proxy_Function, .-Proxy_Function
但是,Windows不是ELF系统,因此所需的样板有所不同,我不知道它是什么。您可能可以通过编译来了解它是什么
extern void (*Procs[10])(void);
void P(void) { Procs[0](); }
使用
-S -O2
并检查输出。