【问题标题】:Equivalent gcc assembly?等效的 gcc 程序集?
【发布时间】:2014-01-07 04:45:23
【问题描述】:

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]):);
}

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

【问题讨论】:

  • 我猜是&Procs[0],但看看你的Procs 的C 级声明会有所帮助
  • Procs 相当于FARPROC Procs[10]; 然后我使用GetProcAddress 填充数组中的每个索引。我检查以确保它们当然是有效的。
  • FARPROC?这是一个正常的函数指针还是一个不寻常的大小?我认为“远指针”已经随着 DOS 而死。
  • 它是一个指向 dll 中函数的指针。我使用 jmp far 而不是 jmp 解决了它。还必须像您建议的那样使用&Procs[0]
  • @Wumpus Far 仍在 16 位 Windows 中积极使用。由于遗留原因,该术语一直存在于 32 位和 64 位 Windows 中,尽管现在它已经毫无意义。

标签: c++ c gcc


【解决方案1】:

这里的问题很可能是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 并检查输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2011-02-07
    • 2017-04-29
    • 2015-09-18
    • 1970-01-01
    • 2015-09-03
    • 2016-11-10
    相关资源
    最近更新 更多