标签地址(MSVC)

Tre*_*erg 25 c++ assembly label goto inline-assembly

我们正在为高级编译语言编写一个字节码,经过一些分析和优化后,很明显当前最大的性能开销是我们用来跳转到字节码情况的switch语句.

我们调查了拉出每个case标签的地址并将其存储在字节码本身的流中,而不是我们通常打开的指令ID.如果我们这样做,我们可以跳过跳转表,并直接跳转到当前正在执行的指令的代码位置.这在GCC中非常有用,但是,MSVC似乎不支持这样的功能.

我们尝试使用内联汇编来获取标签的地址(并跳转到它们),但它可以工作,但是,使用内联汇编会导致MSVC优化器避免使用整个函数.

有没有办法让优化器仍然运行代码?遗憾的是,我们无法将内联汇编提取到另一个函数中,而不是制作标签的函数,因为即使在内联汇编中也无法为另一个函数引用标签.有什么想法或想法吗?非常感谢您的意见,谢谢!

Nec*_*lis 17

在MSVC中执行此操作的唯一方法是使用内联汇编(这基本上会使您对x64产生错误):

int _tmain(int argc, _TCHAR* argv[])
{
case_1:
    void* p;
    __asm{ mov [p],offset case_1 }
    printf("0x%p\n",p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你打算做这样的事情,那么最好的方法是在程序集中编写整个解释器,然后通过链接器将其链接到主二进制文件(这是LuaJIT所做的,这也是VM的主要原因所在当它没有运行JIT代码时,它是快速的.

LuaJIT是开源的,所以如果你走这条路,你可能会从中获取一些提示.或者你可能想要查看第四个来源(其创建者开发你正在尝试使用的原则),如果有MSVC构建你可以看到它们是如何完成它的,否则你就会被GCC困住(这不是'这是一件坏事,它适用于所有主要平台).


goe*_*tor 10

看看Erlang在Windows上构建的内容.他们使用MSVC进行大部分构建,然后使用GCC作为一个文件来使用label-as-values扩展.然后,对生成的目标代码进行黑客攻击,使其与MSVC链接器兼容.

http://www.erlang.org/doc/installation_guide/INSTALL-WIN32.html