__asm__ __volatile__("": : :"memory")

本文深入探讨了GCC编译器中asmvolatile的使用方式,解释了其如何防止指令移动优化,并通过memory关键字强制RAM所有内存单元被汇编指令修改,导致CPU寄存器和缓存失效,从而阻止指令优化并促进内存访问。

     memory 强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。


    The GCC manual says using 'asm volatile' prevents the asm instruction from being 'movedsignificantly' and adding 'memory' to the clobber list prevents GCC from keeping memory values cached in registers across the assembler instruction, but also says 'GCC will perform some optimizations across a volatile asm instruction' but doesn't explain what.

   

1)   __asm__用于指示编译器在此插入汇编语句。

2)  __volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
3) 
 memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内存。
4) 
  "":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。
`__asm volatile()` 是 C/C++ 中用于插入**内联汇编代码**的一种语法结构,常见于嵌入式开发(如 ARM、RISC-V、x86 等平台),特别是在操作系统底层、驱动程序或实时系统中。 --- ### 含义解析: #### `__asm` - 表示插入一段**汇编指令**。 - 不同编译器语法略有不同: - GCC/Clang 使用:`__asm__` - MSVC 使用:`__asm` - ARM 编译器也支持 `__asm` #### `volatile` - 告诉编译器:**不要对该汇编代码进行优化或重排**。 - 保证该段代码按你写的顺序执行,常用于硬件操作、内存屏障等关键代码。 --- ### 基本语法(GCC 示例): ```c __asm volatile ( "instruction1" : outputs : inputs : clobbers ); ``` - `"instruction1"`:实际的汇编指令字符串。 - `outputs`:输出操作数。 - `inputs`:输入操作数。 - `clobbers`:告知编译器哪些寄存器被修改。 --- ### 示例:使用 `__asm volatile()` 插入 WFE 指令 ```c void wait_for_event(void) { __asm volatile ("wfe"); } ``` 这等价于调用 `__wfe()` 函数。 --- ### 示例:读取当前程序计数器 PC(ARM Cortex-M) ```c unsigned int get_pc(void) { unsigned int pc; __asm volatile ("MOV %0, PC" : "=r"(pc)); return pc; } ``` - `"MOV %0, PC"`:将程序计数器值移动到寄存器中。 - `=r(pc)`:输出到变量 `pc` 所在的寄存器。 --- ### 示例:插入内存屏障指令(ARM DMB) ```c __asm volatile ("dmb ish" ::: "memory"); ``` 用于确保内存访问顺序,防止编译器和CPU乱序执行。 --- ### 注意事项: | 项目 | 说明 | |------|------| | 可移植性 | 内联汇编依赖具体架构,不具可移植性 | | 调试困难 | 内联汇编不易调试,建议封装成函数 | | 编译器支持 | GCC、Clang 支持较好;MSVC 风格不同 | | volatile 的作用 | 防止编译器优化和指令重排 | --- ### 总结:`__asm volatile()` 是干嘛的? > **用于在C/C++代码中插入不可优化汇编指令,实现对硬件、CPU状态、内存顺序等底层控制,是嵌入式和系统级编程的重要工具。** ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值