最近在读《C专家编程》一书时,遇到了C中嵌入汇编的问题,刚好项目中也经常遇到这个问题,决定花时间整理一番,理清在IAR环境下的使用方法。
C中嵌入汇编指令在不同的编译器下有不同的实现方式,在IAR中有两种方式。
一、内嵌汇编
例子1:
……//C语言
asm("NOP");
……//C语言。
例子2:
void test(void)
{
__asm("MOV R4, R2\n" //去掉“__”也可
"MOV R5, R2\n"
"LOOP:nop\n");
}
注意: 多行之间使用换行符 \n 隔开,最后一个括号要有逗号。
{
__asm("MOV R4, R2\n" //去掉“__”也可
"MOV R5, R2\n"
"LOOP:nop\n");
}
注意: 多行之间使用换行符 \n 隔开,最后一个括号要有逗号。
二、c中调用汇编程序
使用规则如下:
1、使用PUBLIC入口标签
2、被调用前应该进行函数声明:
extern int foo(void);
或者
或者
int foo(void);
或者
__ARM int foo(void);
例子:
在xx.asm中:
PUBLIC OS_CPU_SR_Save
……
OS_CPU_SR_Save
MRS R0, CPSR
ORR R1, R0, #OS_CPU_ARM_CONTROL_INT_DIS
MSR CPSR_c, R1
BX LR
在xxx.h中进行声明:
extern void OS_CPU_SR_Save(void);
在xxx.c中调用:
OS_CPU_SR_Save();
详见:EWARM_DevelopmentGuide.pdf 中 Assembler languageinterface一节。