GCC规定了一个内联汇编的语法,不同硬件平台上的GCC内联汇编几乎都是这样的:
asm(
汇编指令列表
:输出运算符列表
:输入运算符列表
:被更改的资源列表
};
在GCC中插入汇编代码,需要以asm关键字开头,中间四个部分用”:”分隔,如果你嵌入的汇编没有输入输出,或者更改资源,后面三项是可以省略的。
表1 GCC4内联汇编操作符节选
操作符 | 含义 |
r | 通用寄存器R0~R15 |
m | 一个有效内存地址 |
l | 数据处理指令中的立即数 |
X | 被修饰的操作符只能作为输出 |
表2 GCC4中内联汇编修饰符
修饰符 | 说明 |
无 | 被修饰的操作符是只读的 |
= | 被修饰的操作符只写 |
+ | 被修饰的操作符具有可读写的属性 |
& | 被修饰的操作符只能作为输出 |
uint32_t __get_PRIMASK(void)
{
uint32_t result=0;
__asm __volatile( \
"MRS %0,primask" \
:"=r"(result) \
: \
:"memory"
);
return result;
}
void __set_PRIMASK(uint32_t priMask)
{
__asm volatile ( \
"MSR primask, %0" \
: \
:"r"(priMask) \
:"memory"
);
}
uint32_t enterCritical(void)
{
uint32_t status=0;
status=__get_PRIMASK();
__asm volatile ( \
"cpsid i" \
: \
: \
:"memory"
);
return status;
}
void exitCritical(uint32_t status)
{
__set_PRIMASK(status);
}