You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Microsoft VC编译器编译ARM内联汇编代码?

ARM架构下MSVC内联汇编的替代方案

明确结论:MSVC完全不支持ARM/ARM64的内联汇编——不管是GCC风格的asm("..."),还是MSVC自家仅适配x86/x64的__asm语法,在ARM平台上都无法使用,这是官方硬限制。

如果你不想写独立的纯汇编函数,可行的替代方案如下:

1. 优先使用ARM内置函数

MSVC为绝大多数常用ARM指令(原子操作、SIMD、系统指令等)提供了内置函数,这些函数会被编译器直接翻译成对应ARM机器码,效果和内联汇编一致,且完全兼容C语法。

举个实际转换例子:
GCC下的ARM原子加法内联汇编:

uint32_t atomic_add(uint32_t *ptr, uint32_t val) {
    uint32_t old_val;
    __asm__ __volatile__ (
        "ldrex r1, [%1]\n"
        "add r0, r1, %2\n"
        "strex r2, r0, [%1]\n"
        "cmp r2, #0\n"
        "bne 1b"
        : "=r"(old_val)
        : "r"(ptr), "r"(val)
        : "r1", "r2", "memory"
    );
    return old_val;
}

换成MSVC的内置函数实现:

#include <intrin.h>
uint32_t atomic_add(uint32_t *ptr, uint32_t val) {
    // 通用原子加法内置函数
    return __sync_fetch_and_add(ptr, val);
    // 或者用ARM专用的ldrex/strex组合
    uint32_t old_val;
    do {
        old_val = __ldrex(ptr);
    } while (__strex(old_val + val, ptr) != 0);
    return old_val;
}

几乎所有常用ARM指令都有对应的内置函数,足够覆盖绝大多数场景。

2. 极端场景的备选:__declspec(naked)(接近纯汇编函数)

如果遇到极个别没有对应内置函数的特殊指令,你可以用__declspec(naked)修饰函数,在函数体内直接写ARM汇编,但这本质上是纯汇编函数(编译器不会生成函数开头/结尾的栈帧代码),虽然能放在C文件里,但不符合你“不写纯汇编函数”的要求,仅作为最后无奈选择。


内容的提问来源于stack exchange,提问作者Lolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:42:17