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]):);
}
然而,当我这样做时,我的程序崩溃了。有什么想法吗?
答案 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](); }
并检查输出。