c++ - 标签地址 (MSVC)

标签 c++ assembly label inline-assembly goto

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

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

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

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

最佳答案

在 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;
}

如果你打算做这样的事情,那么最好的方法是在汇编中编写整个解释器,然后通过链接器将其链接到主二进制文件(这就是 LuaJIT 所做的,这是导致虚拟机的速度非常快,当它没有运行 JIT 代码时)。

LuaJIT is open-source ,所以如果你走那条路,你可能会从中得到一些提示。或者,您可能想查看 forth 的来源(其创建者开发了 the principle 您正在尝试使用),如果有 MSVC 版本,您可以看到他们是如何完成它的,否则您会被 GCC 困住(其中 < em>不是坏事,它适用于所有主要平台)。

关于c++ - 标签地址 (MSVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421433/

相关文章:

c++ - 如何重载操作数 << 以像 ostream 样式一样使用

c - 使堆栈指针指向 mmap 返回的指针。 (Linux,32 位虚拟机)

c++ - 汇编函数调用是否导致所有寄存器被压入堆栈?

assembly - 如何仅使用逻辑运算符AND判断数字是否为4的倍数?

ios - 如何将数组打印为标签中的行 (Swift 3)

javascript - 表格中的 HTML 文本框变成标签

c++ - C++从内部程序代码以编程方式将应用程序添加到Linux上的启动

c++ - 模拟一个游戏,每个玩家都有不同的获胜概率?

c++ - 链接器如何解析汇编代码中的符号

javascript - 如何通过jquery给jsp页面中的label设置值