1.汇编当中可以调用C函数,只需要”IMPORT”一下即可,如:

change_vari_cPROCPUSH {R0,R1,LR}IMPORT core_res_cIMPORT temp_func_retEXPORT change_vari_cBL temp_func_retLDR R1,=core_res_cSTR R0,[R1]POP {R0,R1,PC}ENDP

如果该C函数有传递参数的,则在调用前把参数赋值到R0-R4即可;若有返回值的,则调用后从R0或者R0-R1(返回值为64位)读取即可;

2.汇编当中可以引用C全局变量,也是”IMPORT”一下即可,如上例;值得注意的是,引用进来的是该变量的地址,不是变量的值。这是C和汇编之间数据交互的一种重要方式。

3.C当中可以调用汇编函数,需要在汇编中EXPORT一下,然后在C中extern,如:

set_coreresPROCEXPORT set_coreresPUSH {R0,LR}MOV SP,R0POP {R0,PC}ENDP set_specialresPROCEXPORT set_specialresPUSH {R0,LR}MSR CONTROL,R0POP {R0,PC}ENDPread_coreresPROCEXPORT read_coreresPUSH {R0,LR}STR SP,[R0]POP {R0,PC}ENDPread_specialresPROCEXPORT read_specialresPUSH {R0,R1,LR}MRS R1,PSRSTR R1,[R0]POP {R0,R1,PC}ENDP
extern void set_coreres(int resvl);extern void set_specialres(int resvl);extern void read_coreres(int *resvl);extern void read_specialres(int *resvl);

并且在C中调用汇编函数时可以传入参数,需要传入哪些参数和参数类型只要在extern时声明下就可;也可以有返回值,存在R0或R0-R1中,但是当有返回值时,汇编函数中在退出前需要将返回值赋值给R0或R0-R1这是C和汇编之间数据交互的一种更为简便有效的方式。

4.C当中也可以使用汇编的标号,用法还是先EXPORT,再在C中extern

5.也可以直接在C中嵌入汇编,具体方式跟编译器有关,如:

uint32_t read_special_res(void){__ASM("ldr r0,=core_res_c");__ASM("mrs r1,control");__ASM("str r1,[r0]");return core_res_c;}uint32_t get_r5(){uint32_t stackPointer;__asm volatile ("mov %0, R5\n": "=r"(stackPointer));return stackPointer;}