ATPCS中寄存器使用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ATPCS中各寄存器的使用规则及其名称

参数传递规则

1. 参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可

以使用数据栈来传递参数。

2. 结果为一个32位整数时,可以通过寄存器R0返回

3. 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。

汇编程序、C程序及C++程序相互调用

C 程序调用汇编程序:

☐汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递。

☐在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序。

☐在C 语言程序中使用extern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。

☐调用汇编的C 函数:

☐示例

#include

extern void strcopy(char *d,const char *s) //声明外部函数,即要调用的汇编

//子程序

int main(void)

{

const cha r *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(“Aft er copying:\n”)

printf(“‟%s‟\n …%s\n,”srcstr,dststr); //显示strcopy 复制字符串结果

return(0);

}

☐被调用汇编子程序:

AREA SCopy,CODE,READONLY

EXPORT strcopy ;声明汇编程序strcopy,以便外部程序引用

strcopy ;R0 为目标字符串的地址

;R1 为源字符串的地址;

LDRB R2,[R1],#1 ;读取字节数据,源地址加1

STRB R2,[R0],#1 ;保存读取的1 字节数据,目标地址加1

CMP r2,#0 ;判断字符串是否复制完毕

BNE strcopy ;没有复制完毕,继续循环

MOV pc,lr ;返回

END

汇编程序调用C程序

☐汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递.

☐在汇编程序中使用IMPORT 伪指令声明将要调用的C 程序函数.

☐在调用C 程序时,要正确设置入口参数,然后使用BL 调用.

☐汇编调用C 程序的C 函数:

/*函数sum5()返回5 个整数的和*/

int sum5(int a,lit b, int c,int d,int e)

{

return(a+b+c+d+e); //返回5 个变量的和

}

☐汇编调用C 程序的汇编程序

AREA sample, CODE,READONLY

IMPORT sum5 ;声明外部标号sum5,即C 函数sum5() CALLSUM

STMFD SP! {LR} ;LR 寄存器放栈

ADD R1,R0,R0 ;设置sum5 函数入口参数,R0 为参数a

ADD R2,R1,R0 ;R1 为参数b,R2 为参数c

ADD R3,R1,R2,

STR R3,[SP,# -4]! ;参数e 要通过堆栈传递

ADD R3,R1,R1 ;R3 为参数d

BL sum5 ;调用sum5(),结果保存在R0

ADD SP,SP#4 ;修正SP 指针

LDMFD SP,PC ;子程序返回

END

嵌入式C编程

概述:

C语言的优点是运行速度快、编译效率高、移

植性好和可读性强。C语言支持模块化程序设计,支持自顶

向下的结构化程序设计方法。因此在嵌入式程序设计中经

常会用到C语言程序设计。

嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首先是C语

言程序设计,因此必须符合C语言基本语法,只是它是面向

嵌入式的应用而设计的程序。

☐C语言的“预处理伪指令”在嵌入式程序设计中的应用。

1、文件包含伪指令

格式:

#include<头文件名.h> ;标准头文件

#include“头文件名.h” ;自定义头文件

2、宏定义伪指令

格式:

# define 宏标识符宏体

例:

⏹#define U32 unsigned int

⏹#define U16 unsigned short

⏹#define S32 int

⏹#define S16 short int

⏹#define U8 unsigned char

⏹#define S8 char

3、条件宏:先测试是否定义过某宏标识符,然后决定如何处理。这样做是为了避免重复定义。

格式:

#ifdef 宏标识符

#undef 宏标识符

#define 宏标识符宏体

#else

#define 宏标识符宏体

#endif

例:

#ifdef INCLUDE_SERIAL

#undef NUM_TTY

#define NUM_TTY

N_UART_CHANNELS

#undef CONSOLE_TTY

#define CONSOLE_TTY 0

#undef CONSOLE_BAUD_RATE

#define CONSOLE_BAUD_RATE 115200

#endif

4、条件编译伪指令

格式

#if(条件表达式1)

#elif(条件表达式2)

相关文档
最新文档