等效的gcc组装?

时间:2013-12-18 20:28:22

标签: c++ c gcc

gcc中以下visual studio jmp的等价物是什么?

extern "C" __declspec(naked) void __stdcall Proxy_Function()
{
    __asm
    {
        jmp Procs[0];
    }
}

以上在视觉工作室中效果很好。

使用gcc,我试过了:

extern "C" void __stdcall Proxy_Function()
{
    __asm("jmp *%0":: "r" (Procs[0]):);
}

然而,当我这样做时,我的程序崩溃了。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这里的问题很可能是gcc-for-x86没有等价于__declspec(naked),所以gcc编译的代码对堆栈做了一些不应该有的东西,导致从{{1返回跳到错误的地方。我必须看到为Procs[0]生成的程序集是确定的。

我建议写一个Proxy_Function文件而不是试图把它变成GCC。在ELF系统上,这将起作用:

.asm

但是,Windows 是ELF系统,因此所需的样板不同,我不知道它是什么。您可以通过编译

找出它是什么
    .text
    .globl Proxy_Function
    .type Proxy_Function,@object
Proxy_Function:
        movl Procs, %eax
        jmp *%eax
    .size Proxy_Function, .-Proxy_Function

使用extern void (*Procs[10])(void); void P(void) { Procs[0](); } 并检查输出。