2025年年终全过程工程咨询公司推荐:从用户评价到行业口碑,5家综合实力领先公司选购指南 - 品牌推荐
2026/1/2 0:19:30
__asm volatile是 GCC(及兼容编译器如 Clang)中的一个特性,用于在 C/C++ 代码中内嵌汇编指令。让我们详细解释:
__asmasm(取决于编译器选项)__asm__("汇编指令");或__asm volatile("汇编指令");volatile// 简单形式__asmvolatile("nop");// 执行空操作// 多条指令__asmvolatile("movl $1, %eax\n\t""movl $2, %ebx");// 带输入输出操作数inta=10,b;__asmvolatile("movl %1, %%eax\n\t""addl $5, %%eax\n\t""movl %%eax, %0":"=r"(b)// 输出操作数:"r"(a)// 输入操作数:"%eax"// 破坏的寄存器);// 完整语法__asmvolatile("汇编指令模板":输出操作数列表// 可选:输入操作数列表// 可选:破坏的寄存器列表// 可选);| 约束 | 含义 |
|---|---|
r | 寄存器 |
m | 内存地址 |
i | 立即数 |
g | 寄存器/内存/立即数 |
// 防止指令重排序__asmvolatile("":::"memory");// 编译器屏障__asmvolatile("":::"memory");// 读取时间戳计数器uint64_trdtsc(){uint32_tlo,hi;__asmvolatile("rdtsc":"=a"(lo),"=d"(hi));return((uint64_t)hi<<32)|lo;}// Linux x86_64 系统调用longsyscall(longnumber,...){longret;__asmvolatile("syscall":"=a"(ret):"a"(number):"rcx","r11","memory");returnret;}// 原子加法voidatomic_add(int*ptr,intvalue){__asmvolatile("lock addl %1, %0":"+m"(*ptr):"ir"(value));}// 获取当前栈指针void*get_stack_pointer(){void*sp;__asmvolatile("mov %%rsp, %0":"=r"(sp));returnsp;}// 延迟一段时间(简单忙等待)voiddelay_cycles(unsignedintcycles){__asmvolatile("1:\n\t""sub $1, %0\n\t""jnz 1b":"+r"(cycles));}不同的编译器/架构有不同的语法:
// GCC/Clang (x86)__asmvolatile("指令");// MSVC (x86)__asm{mov eax,1add eax,2}// ARM GCC__asmvolatile("mov r0, #1");现代 C/C++ 中,考虑使用:
<stdatomic.h>,<atomic>)__builtin_*)<xmmintrin.h>等用于 SIMD)__asm volatile是底层编程的强大工具,但:
除非进行系统编程、内核开发或性能关键代码优化,否则通常应避免使用内联汇编。