




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、17.1 ARM C/C+7.1 ARM C/C+编译器编译器7.2 7.2 在在C/C+C/C+程序中内嵌汇编指令程序中内嵌汇编指令7.3 7.3 从汇编程序中访问从汇编程序中访问C C程序变量程序变量7.4 7.4 汇编程序、汇编程序、C C程序及程序及C+C+程序相互调用程序相互调用7.5 7.5 嵌入式嵌入式C C编程编程2ARM集成开发环境中包含的集成开发环境中包含的C/C+编译器:编译器:编译器编译器名称名称编译编译器器种类种类源文件源文件类型类型源文件源文件后缀后缀输出目标文件输出目标文件类型类型armccCC*.C32位位ARM代码代码tccCC*.C16位位Thumb代代码码
2、armcppC+C/C+*.C/*.C+ 32位位ARM代码代码tcppC+C/C+*.C/*.C+16位位Thumb代代码码3在在CC+程序中使用内嵌的汇编指令的语法格式:程序中使用内嵌的汇编指令的语法格式: 在在ARM C语言程序中,使用关键字语言程序中,使用关键字_ _asm来标来标识一段汇编指令程序。识一段汇编指令程序。_ _asm 汇编语言程序汇编语言程序 汇编语言程序汇编语言程序其中:如果一行中有多个汇编指令,指令之间使用其中:如果一行中有多个汇编指令,指令之间使用 分号分号(;)分开。分开。 在一条指令占多行,要使用续行符号在一条指令占多行,要使用续行符号().4在在C/C+程序
3、中内嵌汇编指令注意事项:程序中内嵌汇编指令注意事项:n必须小心使用物理寄存器必须小心使用物理寄存器,如如R0R3,SP,LR 和和CPSR 中的中的N,Z,C,V 标志位标志位.因为计算汇编代码中的因为计算汇编代码中的C 表达式表达式时时,可能会使用这些物理寄存器可能会使用这些物理寄存器,并会修改并会修改N,Z,C,V标志标志位。位。_ _asm MOV R0,xADD y,R0,x/y /计算计算x/y 时时R0 会被修改会被修改 在计算在计算x/y 时时R0 会被修改会被修改,从而影响从而影响R0+x/y 的结果的结果.5在在C/C+程序中内嵌汇编指令注意事项:程序中内嵌汇编指令注意事项:
4、n用一个用一个C 程序的变量代替程序的变量代替R0就可以解决这个问题就可以解决这个问题:_ _asm MOV var,xADD y,var,x/y 注意:内嵌汇编器探测到隐含的寄存器冲突就会报错注意:内嵌汇编器探测到隐含的寄存器冲突就会报错.6在在C/C+程序中内嵌汇编指令注意事项:程序中内嵌汇编指令注意事项:n不要使用寄存器代替变量不要使用寄存器代替变量.尽管有时寄存器明显对应某个尽管有时寄存器明显对应某个变量变量,但也不能直接使用寄存器代替变量但也不能直接使用寄存器代替变量.int bad_f(int x) /x 存放在存放在R0 中中 _ _asm ADD R0,R0,#1 /发生寄存器
5、冲突发生寄存器冲突,实际上实际上x 的值没有变化的值没有变化 return(x); 尽管根据编译器的编译规则似乎可以确定尽管根据编译器的编译规则似乎可以确定R0 对应对应x,但但这样的代码会使内嵌汇编器认为发生了寄存器冲突这样的代码会使内嵌汇编器认为发生了寄存器冲突.7在在C/C+程序中内嵌汇编指令注意事项:程序中内嵌汇编指令注意事项: 这段代码的正确写法如下这段代码的正确写法如下:int bad_f(int x) _ _asm ADD x,x,#1 return(x);8 在在C程序中声明的全局变量可以被汇编程序程序中声明的全局变量可以被汇编程序通过地址间接访问。具体访问方法如下:通过地址间
6、接访问。具体访问方法如下:n使用使用IMPORT伪指令声明这个全局变量。伪指令声明这个全局变量。n使用使用LDR指令读取该全局变量的内存地址,通常该指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中。全局变量的内存地址存放在程序的数据缓冲池中。n根据该数据类型,使用相应的根据该数据类型,使用相应的LDR指令读取该全局指令读取该全局变量的值;使用相应的变量的值;使用相应的STR指令修改该全局变量的指令修改该全局变量的值。值。9例如:例如:C语言源程序语言源程序str.c如下:如下:#include int globvar=3; /定义一个整型全局变量定义一个整型全局变
7、量int main()return 0;10例如:汇编源文件例如:汇编源文件hello.s:AREA globals,CODE,READONLYEXPORT asmsubIMPORT globvar ;声明外部变量声明外部变量globvarasmsubLDR R1,=globvar ;装载变量地址装载变量地址LDR R0,R1 ;读出数据读出数据ADD R0,R0,#2 ;修改修改R0的值的值STR R0,R1 ;保存变量值保存变量值MOV PC, LREND11 寄存器的使用规则寄存器的使用规则 1.子程序间通过寄存器子程序间通过寄存器R0R3来传递参数。来传递参数。 2.在子程序中,使用寄
8、存器在子程序中,使用寄存器R4R11来保存局部变量。来保存局部变量。 3.寄存器寄存器R12用于子程序间用于子程序间scratch寄存器寄存器(用于保存用于保存SP,在函数返回时使用该寄存器出桟),记作,在函数返回时使用该寄存器出桟),记作IP。 4.寄存器寄存器R13用于数据栈指针,记作用于数据栈指针,记作SP。寄存器。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。在进入子程序时的值和退出子程序时的值必须相等。 5.寄存器寄存器R14称为链接寄存器,记作称为链接寄存器,记作LR。它用于保存。它用于保存子程序的返回地址。子程序的返回地址。6.寄存器寄存器R15是程序计数器,记作是程序
9、计数器,记作PC 12 13参数传递规则参数传递规则 1.参数不超过参数不超过4个时,可以使用寄存器个时,可以使用寄存器R0R3来传来传递参数,当参数超过递参数,当参数超过4个时,还可以使用数据栈来个时,还可以使用数据栈来传递参数。传递参数。2.结果为一个结果为一个32位整数时,可以通过寄存器位整数时,可以通过寄存器R0返回返回 3.结果为一个结果为一个64位整数时,可以通过寄存器位整数时,可以通过寄存器R0和和R1返回,依次类推。返回,依次类推。14C 程序调用汇编程序程序调用汇编程序:n汇编程序的设置要遵循汇编程序的设置要遵循ATPCS 规则,保证程序调用规则,保证程序调用时参数的正确传递
10、。时参数的正确传递。n在汇编程序中使用在汇编程序中使用EXPORT 伪指令声明本子程序,伪指令声明本子程序,使其它程序可以调用此子程序。使其它程序可以调用此子程序。n在在C 语言程序中使用语言程序中使用extern 关键字声明外部函数关键字声明外部函数(声明要调用的汇编子程序声明要调用的汇编子程序),即可调用此汇编子程序。,即可调用此汇编子程序。15C程序调用汇编程序程序调用汇编程序(调用汇编的调用汇编的C 函数函数):#include extern void strcopy(char *d,const char *s); /声明外部函声明外部函 /数数,即要调用的汇编子程序即要调用的汇编子程
11、序int main(void) const char *srcstr=“First string-source”; char dstsrt =“Second string-destination”; printf(“Before copying:n”); printf(“%sn %sn,”srcstr,dststr); /显示源字符串和目显示源字符串和目 /标字符串的内容标字符串的内容 strcopy(dststr,srcstr); /调用汇编子程序调用汇编子程序,R0=dststr /R1=srcstr printf(“After copying:n”) printf(“%sn %sn,”s
12、rcstr,dststr); /显示显示strcopy 复制复制 /字符串结果字符串结果 return(0);16C程序调用汇编程序程序调用汇编程序(被调用汇编子程序被调用汇编子程序):AREA SCopy,CODE,READONLYEXPORT strcopy ;声明汇编程序声明汇编程序strcopy,以便外部以便外部 ;程序引用程序引用strcopy ;R0 为目标字符串的地址为目标字符串的地址 ;R1 为源字符串的地址为源字符串的地址 ;LDRB R2,R1,#1 ;读取字节数据读取字节数据,源地址加源地址加1STRB R2,R0,#1 ;保存读取的保存读取的1 字节数据字节数据,目标地
13、目标地 ;址加址加1CMP r2,#0 ;判断字符串是否复制完毕判断字符串是否复制完毕BNE strcopy ;没有复制完毕没有复制完毕,继续循环继续循环MOV pc,lr ;返回返回END17汇编程序调用汇编程序调用C程序程序n汇编程序的设置要遵循汇编程序的设置要遵循ATPCS 规则规则,保证程保证程序调用时参数的正确传递序调用时参数的正确传递.n在汇编程序中使用在汇编程序中使用IMPORT 伪指令声明将要伪指令声明将要调用的调用的C 程序函数程序函数.n在调用在调用C 程序时程序时,要正确设置入口参数要正确设置入口参数,然后然后使用使用BL 调用调用.18n汇编调用汇编调用C 程序的程序的
14、C 函数:函数:/*函数函数sum5()返回返回5 个整数的和个整数的和*/#include int sum5(int a,lit b, int c,int d,int e) return(a+b+c+d+e); /返回返回5 个变量的和个变量的和19n汇编调用汇编调用C 程序的汇编程序程序的汇编程序 AREA sample, CODE,READONLY IMPORT sum5 ;声明声明C程序程序sum5() EXPORT sample ;声明可被外部程序引用声明可被外部程序引用 ENTRY STR LR,SP,#-4! ;保存返回地址保存返回地址 MOV R0,#1 ;设置参数设置参数1
15、MOV R1,#2 ;设置参数设置参数2 MOV R2,#3 ;设置参数设置参数3 MOV R3,#4 ;设置参数设置参数4 MOV R4,#5 ;参数参数5通过数据栈传递通过数据栈传递 STR R4,SP,#-4!20n汇编调用汇编调用C 程序的汇编程序程序的汇编程序 BL sum5 ;调用调用sum5(),结果从,结果从R0返回返回 ADD SP,SP,#4 ;调整调整SP,准备返回,准备返回 LDR PC,SP,#4END21概述:概述: C语言的优点是运行速度快、编译效率高、移植性好语言的优点是运行速度快、编译效率高、移植性好和可读性强。和可读性强。C语言支持模块化程序设计,支持自顶语
16、言支持模块化程序设计,支持自顶向下的结构化程序设计方法。因此在嵌入式程序设计向下的结构化程序设计方法。因此在嵌入式程序设计中经常会用到中经常会用到C语言程序设计。语言程序设计。 嵌入式嵌入式C语言程序设计是利用基本的语言程序设计是利用基本的C语言知识,面语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首向嵌入式工程实际应用进行程序设计。也就是说它首先是先是C语言程序设计,因此必须符合语言程序设计,因此必须符合C语言基本语法,语言基本语法,只是它是面向嵌入式的应用而设计的程序。只是它是面向嵌入式的应用而设计的程序。22C语言的语言的“预处理伪指令预处理伪指令”在嵌入式程序设计中的应用。在
17、嵌入式程序设计中的应用。1、文件包含伪指令、文件包含伪指令 格式:格式:#include ;标准头文件;标准头文件#include“头文件名头文件名.h” ;自定义头文件;自定义头文件2、宏定义伪指令、宏定义伪指令 格式:格式:# define 宏标识符宏标识符 宏体宏体 例:例:n#define U32 unsigned intn#define U16 unsigned shortn#define S32 intn#define S16 short intn#define U8 unsigned charn#define S8 char233、条件宏:先测试是否定义过某宏标识符,然后决定如何
18、处理。、条件宏:先测试是否定义过某宏标识符,然后决定如何处理。这样做是为了避免重复定义。这样做是为了避免重复定义。格式:格式:#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_
19、BAUD_RATE 115200#endif244、条件编译伪指令、条件编译伪指令格式格式#if(条件表达式(条件表达式1)#elif(条件表达式(条件表达式2)#elif(条件表达式(条件表达式n)#else#endif编译时,编译器仅对编译时,编译器仅对#if()()#endif之间满足某一之间满足某一条件表达式的源文件部分进行编译。条件表达式的源文件部分进行编译。255.使用寄存器变量使用寄存器变量 当对一个变量频繁被读写时,需要反复访问内存,当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,从而花费大量的存取时间。为此,C语言提供了一种语言提供了一种变量,即变量
20、,即寄存器变量寄存器变量。这种变量存放在。这种变量存放在CPU的寄存器的寄存器中,使用时,不需要访问内存,而直接从寄存器中读中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。寄存器变量的最好候选者。 例:例:/* 求求1+2+3+.+n的值的值 */WORD Addition(BYTE n)regis
21、ter i,s=0; for(i=1;i 4;j = 562 &0 x1f; 276.活用位操作活用位操作 C语言位运算除了可以提高运算效率外,在嵌入式语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的与(广泛地正在被使用着的是位间的与(&)、或()、或(|)、)、非(非()操作,这跟嵌入式系统的编程特点有很大关)操作,这跟嵌入式系统的编程特点有很大关系。系。例:例: rGPCDAT=(rGPCDAT&0 xFFFFFFF0)|0 x0E rINTMSK&=(BIT_TIMER1) 287.数据指针数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的容,汇编有对应的MOV指令,而除指令,而除C/C+以外的其它编程语言以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况:以指针直接操作内存多发生在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度服装设计大赛参赛作品授权合同
- 二零二五年度文化创意产业劳动合同违约赔偿及创意作品授权合同
- 二零二五年度二零二五年度互联网企业商标许可使用授权协议书
- 2025辽宁省能源产业控股集团所属抚矿集团招聘90人笔试参考题库附带答案详解
- 2025甘肃定西市临洮三临瑞祥购物广场有限责任公司招聘12人笔试参考题库附带答案详解
- 2025河南空港数字城市开发建设有限公司招聘20人笔试参考题库附带答案详解
- 教育管理学知到智慧树章节测试课后答案2024年秋牡丹江师范学院
- 鉴乐·赏舞知到智慧树章节测试课后答案2024年秋绥化学院
- 2025年国网陕西省电力有限公司招聘480人(第二批)笔试参考题库附带答案详解
- 2025四川旻清环保科技有限公司急招9人笔试参考题库附带答案详解
- 房产中介店长招聘合同模板
- 七年级语文组名著阅读计划
- 2024年考研数学三试题及答案
- 2025年高考数学模拟卷(浙江专用)(解析版)
- 《临床篇疾病概论》课件
- 2024解析:第十章 浮沉条件及应用-基础练(原卷版)
- 《妇女保健讲座》课件
- 胃肠减压的护理查房
- 医疗器械高值耗材
- 车间生产现场5S管理基础知识培训课件
- 2024北京高一(上)期末地理汇编:地球上的大气章节综合
评论
0/150
提交评论