__asm__是GCC 关键字asm 的宏定义
用来声明一个内联汇编表达式
__volatile__是GCC 关键字volatile 的宏定义
#define volatile volatile
向GCC 声明不允许对该内联汇编优化,否则当 使用了优化选项(-O)进行编译时,GCC 将会根据自己的判断决定是否将这个内联汇编表达式中的指令优化掉。
带有C/C++表达式的内联汇编格式为:
asm volatile(“Instruction List” : Output : Input : Clobber/Modify);
当在"Instruction List"中有多条指令的时候,
可以在一对引号中列出全部指令,
也可以将一条 或几条指令放在一对引号中,所有指令放在多对引号中。必须用分号(;)或换行符(/n)将它们分开.
在ARM系统结构上关闭中断的操作
三条指令,/n分开。
只有2个输出寄存器,无输入
改变内存
int disable_interrupts (void)
{
unsigned long old,temp;
__asm__ __volatile__("mrs %0, cpsr/n"
"orr %1, %0, #0x80/n"
"msr cpsr_c, %1"
: "=r" (old), "=r" (temp)
:
: "memory");
return (old & 0x80) == 0;
}
ref
指令查询
https://blog.youkuaiyun.com/qq_35608277/article/details/105123483
CPSR查询
https://blog.youkuaiyun.com/qq_35608277/article/details/105107353
ref
其他
https://blog.youkuaiyun.com/geekcome/article/details/6216436