以下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并检查输出。

09-25 19:56