适用编译器:Keil5
方式一:
单独创建一个.s汇编文件,在汇编文件内对函数进行EXPORT声明
r0寄存器是函数传入的第一个参数,r1寄存器是函数传入的第二个参数,以次类推。参数最多不确定是到r4为止,还是到r12,可自行研究。
cpp
PRESERVE8
THUMB
AREA |.text|, CODE, READONLY
ALIGN
EXPORT switch_value
switch_value PROC
LDR r2, [r0]
STR r2, [r1]
BX LR
ENDP
ALIGN
END
在.c文件内,对汇编函数再次声明,需要对参数类型进行补充
cpp
void switch_value(uint32_t * a,uint32_t * b);
int main(void)
{
uint32_t la=0x55,lb=0;
Debug_UartCfg();
while(1){
delay_ms(500);
switch_value(&la,lb);
debug_printf("hello,0x%x!\r\n",lb);
}
}
方式二:
在c语言代码中内联汇编代码,在这种方式下好像是不能使用[r0],[r1]这种方式获取参数了,编译器会报错,需要使用[参数1],[参数2]这种方式。
cpp
void switch_value(uint32_t * a,uint32_t * b)
{
__ASM volatile("LDR r2, [a]");
__ASM volatile("STR r2, [b]");
}
其他方式:
暂未确定看到网上有
__asm void switch_value(uint32_t * a,uint32_t * b)这种写法的,但是在keil下会报错,感兴趣的可以自行查阅keil help菜单下的c手册,对__asm语法有详细说明。