ATPCS规则2

参数传递规则
1.参数不超过4个时,可以使用寄存器R0R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。
2.结果为一个32位整数时,可以通过寄存器R0返回
3.结果为一个64位整数时,可以通过寄存器R0R1返回,依次类推。
汇编程序、C程序及C++程序相互调用
C程序调用汇编程序:
o汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传递。o在汇编程序中使用EXPORT伪指令声明本子程序,使其它程序可以调用此子程序。o在C语言程序中使用extern关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。o调用汇编的C函数:o示例#include
extern void strcopy(char *d,const char *s) //声明外部函数,即要调用的汇编
//子程序int main(void)
{
const char *srcstr=“First string-source”;//定义字符串常量
char dstsrt[] =“Second string-destination”;//定义字符串变量
printf(“Before copying:\n”);
printf(“’%s’\n ‘%s\n,”srcstr,dststr); //显示源字符串和目标字符串的内容
strcopy(dststr,srcstr); //调用汇编子程序,R0=dststr,R1=srcstr
printf(“After copying:\n”)
printf(“’%s’\n ‘%s\n,”srcstr,dststr); //显示strcopy复制字符串结果
return(0);
}
o被调用汇编子程序:AREASCopy,CODE,READONLYEXPORT strcopy;声明汇编程序strcopy,以便外部程序引用strcopy;R0为目标字符串的地址;R1为源字符串的地址;LDRB R2,[R1],#1 ;读取字节数据,源地址加1STRB R2,[R0],#1 ;保存读取的1字节数据,目标地址加1CMP r2,#0;判断字符串是否复制完毕BNE strcopy;没有复制完毕,继续循环MOV pc,lr;返回END汇编程序调用C程序
o汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传递.o在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数.o在调用C程序时,要正确设置入口参数,然后使用BL调用.o汇编调用C程序的C函数:int sum5(int a,lit b, int c,int d,int e)
{
return(a+b+c+d+e); //返回5个变量的和
}
o汇编调用C程序的汇编程序AREAsample, CODE,READONLYIMPORT sum5;声明外部标号sum5,C函数sum5()

嵌入式C编程
概述:
C语言的优点是运行速度快、编译效率高、移植性好和可读性强。C语言支持模块化程序设计,支持自顶
向下的结构化程序设计方法。因此在嵌入式程序设计中经
常会用到C语言程序设计。
嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首先是C
言程序设计,因此必须符合C语言基本语法,只是它是面向
嵌入式的应用而设计的程序。
oC语言的预处理伪指令在嵌入式程序设计中的应用。1、文件包含伪指令
格式:#include <头文件名;标准头文件#include 头文件名.h”;自定义头文件2、宏定义伪指令
格式:define宏标识符宏体

3、条件宏:先测试是否定义过某宏标识符,然后决定如何处理。这样做是为了避免重复定义。
格式:
#ifdef宏标识符#undef宏标识符#define宏标识符宏体#else#define宏标识符宏体#endif
4、条件编译伪指令
格式
#if(条件表达式1#elif(条件表达式2#elif(条件表达式n#else#endif这样,编译时,编译器仅对#if()…#endif之间满足某一条件表达式的源文件部分进行编译。
使用寄存器变量
当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,
原文地址:https://www.cnblogs.com/feisky/p/1586440.html