c - 在 x64 Visual Studio 中内联汇编函数

标签 c assembly visual-c++ x86-64 masm

我知道 x64 模式下的 MSVC 编译器不支持内联汇编代码片段,为了使用汇编代码,您必须像这样在一些外部 my_asm_funcs.asm 文件中定义您的函数:

my_asm_func PROC
    mov rax, rcx
    ret
my_asm_func ENDP

然后在您的 .c 或 .h 文件中为该函数定义一个 header :

int my_asm_func(int x);

尽管该解决方案解决了很多问题,但我仍然对使该汇编代码函数成为内联函数感兴趣,换句话说 - 编译后我不希望对 my_asm_func 进行任何“调用”,我只想将这段程序集粘贴到我最终编译的代码中。我尝试使用 inline__forceinline 关键字声明该函数,但似乎没有任何帮助。还有办法做我想做的事吗?

最佳答案

不,没有办法做你想做的。

如您所说,Microsoft 的编译器不支持 x86-64 目标的内联汇编。这迫使您在外部代码模块 (*.asm) 中定义您的汇编函数,使用 MASM 对其进行汇编,并将结果与​​单独编译的 C/C++ 代码链接在一起。

所需的步骤分离意味着 C/C++ 编译器无法内联您的汇编函数,因为它们在编译时对它不可见。

即使启用了链接时代码生成 (LTCG),您的汇编模块也不会内联,因为链接器根本不支持这一点。

绝对没有办法让编写在单独模块中的汇编函数直接内联到 C 或 C++ 代码中。

inline__forceinline 关键字不可能做任何事情。事实上,如果没有编译器错误(或至少是警告),您无法使用它们。这些注释必须放在函数的定义中(对于内联函数,它与其声明相同),但你不能将它放在函数的定义中,因为它是在一个单独的文件中定义的*.asm 文件。这些不是 MASM 关键字,因此尝试将它们添加到定义中必然会导致错误。将它们放在 C 头文件中汇编函数的前向声明中同样不会成功,因为那里没有要内联的代码——只有一个原型(prototype)。

这就是 Microsoft 推荐使用 intrinsics 的原因。您可以直接在 C 或 C++ 代码中使用它们,编译器会自动生成相应的汇编代码。这不仅实现了所需的内联,而且内在函数甚至允许优化器运行,从而进一步改进结果。不,内在函数不会导致完美的代码,并且内在函数并非适用于所有事物,但这是您使用 Microsoft 的编译器所能做的最好的事情。

您唯一的另一种选择是坐下来尝试各种 C/C++ 代码排列,直到您让编译器生成所需的目标代码。在您希望生成的指令无法使用内在函数的情况下,这可能非常强大,但它确实需要花费大量时间来坐立不安,并且您必须重新访问它以确保它继续执行您的操作升级编译器版本时需要。

关于c - 在 x64 Visual Studio 中内联汇编函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41208105/

相关文章:

c - ARGV中的 vector 是指一维数组吗?

c - C 中的奇怪字符串问题

c - 使用两个标准排序

c# - 逻辑运算结果的地址是什么?

c++ - std::set 使用 char * 类型查找行为

c++ - 标称情况优先与正 boolean 表达式

assembly - 如何使用汇编中的所有其他指令来实现 MUL?

c++ - 在嵌入 C++ 的 x86 程序集中调用/返回

visual-c++ - 适用于 Windows 8.1 的 Windows SDK 包括哪些内容?

visual-c++ - 当我尝试运行应用程序的 Debug模式时,显示 vld_x86 dll 未找到错误