1TM1第8章ARM汇编语言与嵌入式C混合编程8.1嵌入式C编程规范8.2嵌入式C程序设计中的位运算8.3嵌入式C程序设计中的几点说明8.4嵌入式C程序设计格式8.5过程调用标准ATPCS与AAPCS8.6ARM汇编语言与嵌入式C混合编程2TM28.5过程调用标准ATPCS与AAPCSEXPORTstrcpyAREAstr_cpy,CODE,READONLYCODE32strcpyLDRBR2,[R1],#1STRBR2,[R0],#1CMPR2,#0BNEstrcpyMOVPC,LREND#includeexternvoidstrcpy(char*d,char*s);intmain(void){char*srcstr="Firststring-source";char*desstr="Secondstring-destination";strcpy(desstr,srcstr);//printf("%s\t%s",srcstr,desstr);return0;}3TM38.5过程调用标准ATPCS与AAPCS过程调用标准ATPCS(ARM-ThumbProduceCallStandard)规定了子程序间相互调用的基本规则,ATPCS规定子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。2007年,ARM公司推出了新的过程调用标准AAPCS(ARMArchitectureProduceCallStandard),它只是改进了原有的ATPCS的二进制代码的兼容性。4TM48.5.1寄存器使用规则(1)子程序间通过寄存器R0~R3传递参数,寄存器R0~R3可记作A1~A4。被调用的子程序在返回前无须恢复寄存器R0~R3的内容。(2)在子程序中,ARM状态下使用寄存器R4~R11来保存局部变量,寄存器R4~R11可记作V1~V8;Thumb状态下只能使用R4~R7来保存局部变量。5TM58.5.1寄存器使用规则(3)寄存器R12用作子程序间调用时临时保存栈指针,函数返回时使用该寄存器进行出栈,记作IP;在子程序间的链接代码中常有这种使用规则。(4)通用寄存器R13用作数据栈指针,记作SP。在子程序中R13不能用于其他用途。SP在进入子程序时的值和退出子程序时的值必须相等。(5)通用寄存器R14用作链接寄存器。如果在子程序中保存了返回地址,如果R14可用于其他用途。(6)通用寄存器R15用作程序计数器,记作PC,不能用于其他用途。6TM68.5.2数据栈使用规则过程调用标准规定数据栈为FD类型,并且对数据栈的操作时要求8字节对齐(通过伪操作PRESERVE8来设置)。相关概念:数据栈指针SP:最后一个写入栈的数据的内存地址;数据栈基地址:数据栈的最高地址;数据栈界限:可使用的最低的地址单元;已占用的数据栈:基地址和SP之间的内存区域;未占用的数据栈:SP和数据栈界限之间的内存区域;数据栈中的数据帧:为子程序分配的用来保存寄存器和局部变量的区域。7TM78.5.3参数传递规则1.参数个数可变的子程序参数...