如何使用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
相关产品推荐
相关产品推荐

