嵌入式系统原理及应用教程第4章课件.ppt

上传人(卖家):三亚风情 文档编号:3334389 上传时间:2022-08-20 格式:PPT 页数:131 大小:892.55KB
下载 相关 举报
嵌入式系统原理及应用教程第4章课件.ppt_第1页
第1页 / 共131页
嵌入式系统原理及应用教程第4章课件.ppt_第2页
第2页 / 共131页
嵌入式系统原理及应用教程第4章课件.ppt_第3页
第3页 / 共131页
嵌入式系统原理及应用教程第4章课件.ppt_第4页
第4页 / 共131页
嵌入式系统原理及应用教程第4章课件.ppt_第5页
第5页 / 共131页
点击查看更多>>
资源描述

1、嵌入式系统原理及应用教程嵌入式系统原理及应用教程主讲内容主讲内容第第1章章 嵌入式系统概述嵌入式系统概述第第2章章 ARM微处理器概述与编程模型微处理器概述与编程模型第第3章章 ARM9指令系统指令系统第第4章章 嵌入式程序设计基础嵌入式程序设计基础第第5章章 嵌入式内部可编程模块嵌入式内部可编程模块第第6章章 嵌入式接口技术应用嵌入式接口技术应用第第7章章 软件开发环境软件开发环境第第4章章 嵌入式程序设计基础嵌入式程序设计基础u基于基于ARM的编译器一般都支持汇编语言的程序设的编译器一般都支持汇编语言的程序设计、计、C/C+语言的程序设计及两者的混合编程。语言的程序设计及两者的混合编程。u

2、本章介绍本章介绍ARM的嵌入式程序的基础知识的嵌入式程序的基础知识u伪指令伪指令u汇编语言的语句格式汇编语言的语句格式u汇编语言汇编语言uC/C+语言的混合编程语言的混合编程.4.1 伪指令伪指令u在在ARM汇编语言程序里,有一些特殊指令助记符,汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为应的操作码,通常称这些特殊指令助记符为伪指伪指令令,他们所完成的操作称为伪操作。,他们所完成的操作称为伪操作。u伪指令在源程序中的伪指令在源程序中的作用作用是既要把正常的程序用是既要把正常的程序

3、用指令表达给计算机以外,又要把程序设计者的意指令表达给计算机以外,又要把程序设计者的意图表达给编译器图表达给编译器.例如:例如:要告诉编译器程序段的开始和结束,需要告诉编译器程序段的开始和结束,需要定义数据等要定义数据等.u在在ARM的汇编程序中,我们把伪指令分为三部分的汇编程序中,我们把伪指令分为三部分介绍介绍:l通用伪指令通用伪指令 l与与ARM指令相关的伪指令指令相关的伪指令l与与Thumb指令相关的伪指令指令相关的伪指令 4.1 伪指令伪指令4.1.1 通用伪指令通用伪指令 通用伪指令包括通用伪指令包括:u符号定义伪指令符号定义伪指令u数据定义伪指令数据定义伪指令u汇编控制伪指令汇编控

4、制伪指令u及其他一些常用伪指令等。及其他一些常用伪指令等。4.1.1 通用伪指令通用伪指令1.符号定义伪指令符号定义伪指令 符号定义伪指令用于声明符号定义伪指令用于声明ARM汇编程序中的变量、对变量汇编程序中的变量、对变量赋值以及定义寄存器的名称等操作。赋值以及定义寄存器的名称等操作。常见的符号定义伪指令有如下几种:常见的符号定义伪指令有如下几种:(1)GBLA、GBLL和和GBLS语法格式:语法格式:GBLA(GBLL或或GBLS)全局变量名全局变量名 GBLA、GBLL和和GBLS伪指令是声明全局变量的伪指令,伪指令是声明全局变量的伪指令,用于定义一个用于定义一个ARM程序中的全局变量,并

5、将其初始化。程序中的全局变量,并将其初始化。4.1.1 通用伪指令通用伪指令其中:其中:uGBLA用于声明一个全局的数字变量,并初始化为用于声明一个全局的数字变量,并初始化为0;uGBLL伪指令用于声明一个全局的逻辑变量,并初始化为伪指令用于声明一个全局的逻辑变量,并初始化为F(假);(假);uGBLS伪指令用于声明一个全局的字符串变量,并初始化为伪指令用于声明一个全局的字符串变量,并初始化为空;对于全局变量来说,变量名在源程序中必须是唯一的。空;对于全局变量来说,变量名在源程序中必须是唯一的。1.符号定义伪指令符号定义伪指令 符号定义伪指令用于声明符号定义伪指令用于声明ARM汇编程序中的变量

6、、汇编程序中的变量、对变量赋值以及定义寄存器的名称等操作。对变量赋值以及定义寄存器的名称等操作。常见的符号定义伪指令有如下几种:常见的符号定义伪指令有如下几种:(1)GBLA、GBLL和和GBLS4.1.1 通用伪指令通用伪指令指令示例:指令示例:GBLADATE1;声明一个全局数字变量;声明一个全局数字变量DATE1GBLLDATE1;声明一个全局逻辑变量;声明一个全局逻辑变量DATE2GBLSDATA3;声明一个全局的字符串变量;声明一个全局的字符串变量DATE3DATE3SETS“Testing”;将该变量赋值为;将该变量赋值为“Testing”4.1.1 通用伪指令通用伪指令(2)LC

7、LA、LCLL和和LCLS语法格式:语法格式:LCLA(LCLL或或LCLS)局部变量名局部变量名 LCLA、LCLL和和LCLS伪指令是声明局部变量伪指令,伪指令是声明局部变量伪指令,用于定义一个用于定义一个ARM程序中的局部变量,并将其初始化。程序中的局部变量,并将其初始化。其中:其中:uLCLA用于声明一个局部的数字变量,并初始化为用于声明一个局部的数字变量,并初始化为0;uLCLL用于声明一个局部的逻辑变量,并初始化为用于声明一个局部的逻辑变量,并初始化为F(假);(假);uLCLS用于声明一个局部的字符串变量,并初始化为空。用于声明一个局部的字符串变量,并初始化为空。对于局部变量来说

8、,变量名在使用的范围内必须是唯一对于局部变量来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个变量的宏指令程序段内。的,范围限制在定义这个变量的宏指令程序段内。4.1.1 通用伪指令通用伪指令指令示例:指令示例:LCLADATE4;声明一个局部数字变量;声明一个局部数字变量DATE4LCLLDATE5;声明一个局部的逻辑变量;声明一个局部的逻辑变量DATE5DATA4SETL 0 x10;为变量;为变量DATE4赋值为赋值为0 x10LCLSDATA6;声明一个局部的字符串变量;声明一个局部的字符串变量DATA64.1.1 通用伪指令通用伪指令(3)SETA、SETL和和SETS语法格

9、式:语法格式:变量名变量名 SETA(SETL或或SETS)表达式)表达式 SETA、SETL、SETS是变量赋值伪指令,用于给一是变量赋值伪指令,用于给一个已经定义的全局变量或局部变量赋值。个已经定义的全局变量或局部变量赋值。其中:其中:uSETA用于给一个数学变量赋值;用于给一个数学变量赋值;uSETL用于给一个逻辑变量赋值;用于给一个逻辑变量赋值;uSETS用于给一个字符串变量赋值;用于给一个字符串变量赋值;4.1.1 通用伪指令通用伪指令指令示例:指令示例:GBLA EXAMP1;先声明一个全局数字变量;先声明一个全局数字变量EXAMP1 EXAMP1 SETA0 xaa;将变量;将变

10、量EXAMP1赋值为赋值为0 xaaLCLL EXAMP2;声明一个局部的逻辑变量;声明一个局部的逻辑变量EXAMP2EXAMP1 SETLTRUE;将变量;将变量EXAMP1赋值为赋值为TRUEGBLA EXAMP3;先声明一个全局字符串变量;先声明一个全局字符串变量EXAMP3 EXAMP3 SETS“string”;将变量;将变量EXAMP3赋值为赋值为string4.1.1 通用伪指令通用伪指令(4)RLIST语法格式:语法格式:名称名称 RLIST 寄存器列表寄存器列表 RLIST伪指令是定义通用寄存列表伪指令,通用寄存伪指令是定义通用寄存列表伪指令,通用寄存器列表定义主要应用在堆栈

11、操作或多寄存器传送中,器列表定义主要应用在堆栈操作或多寄存器传送中,即使用该伪指令定义的名称可在即使用该伪指令定义的名称可在ARM指令指令LDM/STM中使用。中使用。在在LDM/STM指令中,列表中的寄存器访问次序为根指令中,列表中的寄存器访问次序为根据寄存器的编号据寄存器的编号由低到高由低到高,而与列表中的寄存器排列,而与列表中的寄存器排列次序无关。次序无关。4.1.1 通用伪指令通用伪指令指令示例:指令示例:RegListRLISTR0-R5,R8;定义寄存器列表为;定义寄存器列表为RegList在程序中使用:在程序中使用:STMFD SP!,RegList;存储列表到堆栈;存储列表到堆

12、栈LDMIA R5,RegList;加载列表;加载列表 4.1.1 通用伪指令通用伪指令2.数据定义伪指令数据定义伪指令 数据定义伪指令一般用于为特定的数据分配存储单元,数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:义伪指令有如下几种:(1)DCB语法格式:语法格式:标号标号 DCB表达式表达式 DCB伪指令是字节分配内存单元伪指令,用来分配伪指令是字节分配内存单元伪指令,用来分配一片连续的字节存储单元并用伪指令中指定的数值或一片连续的字节存储单元并用伪指令中指定的数值或字符初始化

13、。其中,数值范围为字符初始化。其中,数值范围为0255,DCB也可用也可用“=”代替。代替。4.1.1 通用伪指令通用伪指令指令示例:指令示例:String DCB“This is a test!”;分配一片连续的字节存储单元并初始化。;分配一片连续的字节存储单元并初始化。DATA2 DCB 15,25,62,00;为数字常量;为数字常量15,25,62,00分片内存单元分片内存单元4.1.1 通用伪指令通用伪指令(2)DCW(或(或DCWU)语法格式:语法格式:标号标号 DCW(或(或DCWU)表达式)表达式 DCW(或(或DCWU)伪指令是为半字分配内存单)伪指令是为半字分配内存单元,其中

14、,表达式可以为程序标号或数字表达式。元,其中,表达式可以为程序标号或数字表达式。伪指令伪指令DCW用于为半字分配一段半字对准的内存用于为半字分配一段半字对准的内存单元,并用指定的数据初始化;伪指令单元,并用指定的数据初始化;伪指令DCWU用于为用于为半字分配一段可以非半字对准的内存单元,并用指定半字分配一段可以非半字对准的内存单元,并用指定的数据初始化。的数据初始化。4.1.1 通用伪指令通用伪指令指令示例:指令示例:DATA1 DCW 1,2,3;分配一片连续的半字存储单元并初始化为;分配一片连续的半字存储单元并初始化为1,2,3。DATA2 DCWU 45,0 x2a*0 x2a;分配一片

15、非半字对准存储单元并初始化。;分配一片非半字对准存储单元并初始化。4.1.1 通用伪指令通用伪指令(3)DCD(或(或DCDU)语法格式:语法格式:标号标号 DCD(或(或DCDU)表达式表达式 DCD(或(或DCDU)伪指令是为字分配内存单元伪)伪指令是为字分配内存单元伪指令,其中,表达式可以为程序标号或数字表达式。指令,其中,表达式可以为程序标号或数字表达式。DCD也可用也可用“&”代替。代替。伪指令伪指令DCD用来为字分配一段对准的内存单元,用来为字分配一段对准的内存单元,并用指定的数值或标号初始化;伪指令并用指定的数值或标号初始化;伪指令DCDU用来为用来为字分配一段可以非对准的内存单

16、元,并用指定的数值字分配一段可以非对准的内存单元,并用指定的数值或标号初始化。或标号初始化。4.1.1 通用伪指令通用伪指令指令示例:指令示例:DATA1 DCD 4,5,6;分配一片连续的字存储单元并初始化。;分配一片连续的字存储单元并初始化。DATA2 DCDU LOOP ;为;为LOOP标号的地址值分配一个内存单元。标号的地址值分配一个内存单元。4.1.1 通用伪指令通用伪指令(4)DCFD(或(或DCFDU)和)和DCFS(或(或DCFSU)语法格式:语法格式:标号标号 伪指令伪指令 表达式表达式uDCFD(或(或DCFDU)和)和DCFS(或(或DCFSU)都是为浮点数分配)都是为浮

17、点数分配内存单元的伪指令。内存单元的伪指令。uDCFD用于为双精度的浮点数分配一段字对准的内存单元,并用于为双精度的浮点数分配一段字对准的内存单元,并用指定的数据初始化,每个双精度的浮点数占两个字单元;用指定的数据初始化,每个双精度的浮点数占两个字单元;DCFDU用于为双精度的浮点数分配一段非字对准的内存单元,用于为双精度的浮点数分配一段非字对准的内存单元,并用指定的数据初始化,每个双精度的浮点数占两个字单元;并用指定的数据初始化,每个双精度的浮点数占两个字单元;uDCFS用于为单精度的浮点数分配一段字对准的内存单元,并用于为单精度的浮点数分配一段字对准的内存单元,并用指定的数据初始化,每个单

18、精度的浮点数占一个字单元;用指定的数据初始化,每个单精度的浮点数占一个字单元;uDCFSU用于为单精度的浮点数分配一段非字对准的内存单元,用于为单精度的浮点数分配一段非字对准的内存单元,并用指定的数据初始化,每个单精度的浮点数占一个字单元。并用指定的数据初始化,每个单精度的浮点数占一个字单元。4.1.1 通用伪指令通用伪指令指令示例:指令示例:FLO1 DCFD2E115,-5E7;分配一段字对准存储单元并初始化为指定的双精度数;分配一段字对准存储单元并初始化为指定的双精度数为为2E115,-5E7。FLO2 DCFDU22,1E2;分配一段非字对准存储单元并初始化为指定的双精度;分配一段非字

19、对准存储单元并初始化为指定的双精度数为数为22,1E2。FLO3 DCFS2E5,-5E7;分配一段非字对准存储单元并初始化为指定的单精度;分配一段非字对准存储单元并初始化为指定的单精度数为数为2E5,-5E-7。4.1.1 通用伪指令通用伪指令(5)DCQ(或或DCQU)语法格式:语法格式:标号标号 DCQ(或(或DCQU)表达式)表达式 DCQ(或(或DCQU)伪指令是为双字分配内存单元的伪指令。)伪指令是为双字分配内存单元的伪指令。伪指令伪指令DCQ用于为双字分配一段字对准的内存单元,并用指用于为双字分配一段字对准的内存单元,并用指定的数据初始化;伪指令定的数据初始化;伪指令DCQU用于

20、为双字分配一段可以非用于为双字分配一段可以非字对准的内存单元,并用指定的数据初始化。字对准的内存单元,并用指定的数据初始化。指令示例:指令示例:DATA1DCQ 100 ;分配一片连续的存储单元并初始化为指定的值。;分配一片连续的存储单元并初始化为指定的值。4.1.1 通用伪指令通用伪指令(6)MAP和和FILED语法格式:语法格式:MAP 表达式,表达式,基址寄存器基址寄存器 标号标号 FIELD 表明数据字节数的数值表明数据字节数的数值MAP和和FILED是内存表定义伪指令。是内存表定义伪指令。u伪指令伪指令MAP用于定义一个结构化的内存表的首地址,用于定义一个结构化的内存表的首地址,MA

21、P也可用也可用“”代替;代替;u伪指令伪指令FIELD用于定义内存表中的数据的长度。用于定义内存表中的数据的长度。FILED也可用也可用“#”代替。代替。4.1.1 通用伪指令通用伪指令u表达式可以为程序中的标号或数学表达式,基址寄存表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。首地址为表达式的值与基址寄存器的和。u注意注意MAP和和FIELD伪指令仅用于定义数据结构,并伪指令

22、仅用于定义数据结构,并不实际分配存储单元。不实际分配存储单元。4.1.1 通用伪指令通用伪指令指令示例:指令示例:MAP0 x10,R1;定义内存表首地址的值为;定义内存表首地址的值为R1+0 x10。DATA1FIELD4;为数据;为数据DATA1定义定义4字节长度字节长度DATA2FIELD16;为数据;为数据DATA1定义定义16字节长度字节长度4.1.1 通用伪指令通用伪指令(7)SPACE语法格式:语法格式:标号标号SPACE 分配的内存单元字节数分配的内存单元字节数 SPACE伪指令是内存单元分配伪指令,用于分配一伪指令是内存单元分配伪指令,用于分配一片连续的存储区域并初始化为片连

23、续的存储区域并初始化为0,SPACE也可用也可用“”代替。代替。指令示例:指令示例:DATASPA SPACE 100;为;为DATASPA分配分配100个存储单元个存储单元;并初始化为;并初始化为04.1.1 通用伪指令通用伪指令3.汇编控制伪指令汇编控制伪指令汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:汇编控制伪指令包括以下几条:(1)MACRO、MEND和和MEXIT语法格式:语法格式:MACRO$标号标号 宏名宏名$参数参数1,$参数参数2,语句段语句段MEXIT语句段语句段MENDMACRO、MEND和和

24、MEXIT都是宏定义指令。都是宏定义指令。4.1.1 通用伪指令通用伪指令u伪指令伪指令MACRO定义一个宏语句段的开始;伪指令定义一个宏语句段的开始;伪指令MEND定义宏语句段的结束;伪指令定义宏语句段的结束;伪指令MEXIT可以实可以实现从宏程序段的跳出。宏指令可以使用一个或多个参现从宏程序段的跳出。宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。数,当宏指令被展开时,这些参数被相应的值替换。MACRO、MEND伪指令可以嵌套使用。伪指令可以嵌套使用。u宏宏是一段功能完整的程序,能够实现一个特定的功能,是一段功能完整的程序,能够实现一个特定的功能,在使用中可以把它视

25、为一个子程序。在其他程序中,在使用中可以把它视为一个子程序。在其他程序中,可以调用宏完成某个功能。可以调用宏完成某个功能。4.1.1 通用伪指令通用伪指令u调用宏是通过调用宏的名称来实现的。宏指令的使用调用宏是通过调用宏的名称来实现的。宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。化的程序设计、节省存储空间并提高运行速度。u但在使用子程序结构时需要保护现场,从而增加了系但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多统的开销,因此,在代码较短且需要传递

26、的参数较多时,可以使用宏指令代替子程序。调用宏的好处是不时,可以使用宏指令代替子程序。调用宏的好处是不占用传送参数的寄存器,不用保护现场。占用传送参数的寄存器,不用保护现场。4.1.1 通用伪指令通用伪指令指令示例:指令示例:MACRO;定义宏;定义宏$DATA1 MAX$N1,$N2;宏名称是;宏名称是MAX,主标号是,主标号是$DATA1,两个参数,两个参数语句段语句段;语句段;语句段$DATA1.MAY1;非主标号,由主标号构成;非主标号,由主标号构成语句段语句段;语句段;语句段$DATA1.MAY2;非主标号,由主标号构成;非主标号,由主标号构成MEND;宏结束;宏结束4.1.1 通用

27、伪指令通用伪指令(2)IF、ELSE、ENDIF语法格式:语法格式:IF 逻辑表达式逻辑表达式语句段语句段1ELSE语句段语句段2ENDIFlIF、ELSE、ENDIF伪指令是条件分支伪指令,能根据条件的伪指令是条件分支伪指令,能根据条件的成立与否决定是否执行某个语句。伪指令成立与否决定是否执行某个语句。伪指令IF可以对条件进行判可以对条件进行判断;伪指令断;伪指令ELSE产生分支;伪指令产生分支;伪指令ENDIF定义分支结束。定义分支结束。l当当IF后面的逻辑表达式为真,则执行语句段后面的逻辑表达式为真,则执行语句段1,否则执行语句,否则执行语句段段2。其中,。其中,ELSE及语句段及语句段

28、2可以没有,此时,当可以没有,此时,当IF后面的逻后面的逻辑表达式为真,则执行指令序列辑表达式为真,则执行指令序列1,否则继续执行后面的指令。,否则继续执行后面的指令。IF、ELSE、ENDIF伪指令可以嵌套使用。伪指令可以嵌套使用。4.1.1 通用伪指令通用伪指令指令示例:指令示例:IF R0=0 x10;判断;判断R0中的内容是否是中的内容是否是0 x10ADD R0,R1,R2 ;如果;如果R0=0 x10,则执行,则执行R0=R1+R2ELSEADD R0,R1,R3 ;如果;如果R0 0 x10,则执行,则执行R0=R1+R3ENDIF4.1.1 通用伪指令通用伪指令(3)WHILE

29、、WEND语法格式:语法格式:WHILE逻辑表达式逻辑表达式语句段语句段WENDuWHILE、WEND伪指令是条件循环伪指令,能根据伪指令是条件循环伪指令,能根据条件的成立与否决定是否循环执行某个语句段。伪指条件的成立与否决定是否循环执行某个语句段。伪指令令WHILE对条件进行判断,满足条件循环,不满足对条件进行判断,满足条件循环,不满足条件结束循环;伪指令条件结束循环;伪指令WEND定义循环体结束。定义循环体结束。u当当WHILE后面的逻辑表达式为真,则执行语句段,后面的逻辑表达式为真,则执行语句段,该语句段执行完毕后,再判断逻辑表达式的值,若为该语句段执行完毕后,再判断逻辑表达式的值,若为

30、真则继续执行,一直到逻辑表达式的值为假。真则继续执行,一直到逻辑表达式的值为假。4.1.1 通用伪指令通用伪指令指令示例:指令示例:GBLA Cou1;声明一个全局的数学变量,变量名为;声明一个全局的数学变量,变量名为CounterCou1 SETA 1;为;为Cou1赋值赋值1WHILE Cou1 10;判断;判断WHILECounter”、“=”、“=”、“/=”、“”运算符。运算符。以以A和和B表示两个逻辑表达式,以上的运算符代表表示两个逻辑表达式,以上的运算符代表的运算如下:的运算如下:A=B表示表示A等于等于B。A B表示表示A大于大于B。A=B表示表示A大于等于大于等于B。A=B表

31、示表示A小于等于小于等于B。A/=B表示表示A不等于不等于B。X B表示表示A不等于不等于B。4.2.2 汇编语言中表达式和运算符汇编语言中表达式和运算符指令示例指令示例:MOV R5,#0 xFF00:MOD:0 xF:ROL:2;R5寄存器里的内容为寄存器里的内容为0 x00IF R5:LAND:R6=R7MOV R0,#0 x00ELSEMOV R0,#0 xFF ;如果;如果R5R6、=、=、/=、)逻辑运算(逻辑运算(LAND、LOR、LEOR)表表4-3 运算符优先级运算符优先级4.3 汇编程序应用汇编程序应用4.3.1 汇编程序基本结构汇编程序基本结构下面是一个汇编语言源程序的基

32、本结构:下面是一个汇编语言源程序的基本结构:AREA example,CODE,READONLY;定义代码块为;定义代码块为exampleENTRY;程序入口;程序入口StartMOV R0,#40 ;R0=40MOV R1,#16;R1=16 ADD R2,R0,R1;R2=R0+R1MOV R0,#0 x18;传送到软件中断的参数;传送到软件中断的参数LDR R1,=0 x20026;传送到软件中断的参数;传送到软件中断的参数SWI 0 x123456;通过软件中断指令返回;通过软件中断指令返回END;文件结束;文件结束4.3.1 汇编程序基本结构汇编程序基本结构uAREA 伪指令定义一个

33、段,并说明所定义段的相关伪指令定义一个段,并说明所定义段的相关属性,本例定义一个名为属性,本例定义一个名为 example 的代码段,属性的代码段,属性为只读。为只读。u ENTRY 伪指令标识程序的入口点,接下来为语句伪指令标识程序的入口点,接下来为语句段。执行主代码后,通过返回控制终止应用程序并段。执行主代码后,通过返回控制终止应用程序并返回到返回到DEBUG,通过使用软件中断指令实现了返回。,通过使用软件中断指令实现了返回。u在程序的末尾为在程序的末尾为 END 伪指令,该伪指令通知编译器伪指令,该伪指令通知编译器停止对源文件的处理,每一个汇编程序段都必须有停止对源文件的处理,每一个汇编

34、程序段都必须有一条一条END伪指令,指示代码段的结束。伪指令,指示代码段的结束。4.3.2 子程序调用子程序调用2.在在ARM汇编语言程序中,子程序的调用一般是通过汇编语言程序中,子程序的调用一般是通过BL指令来实现的。指令来实现的。3.指令格式:指令格式:BL子程序名子程序名 该指令在执行时完成如下操作:将子程序的返回地该指令在执行时完成如下操作:将子程序的返回地址存放在连接寄存器址存放在连接寄存器LR中,同时将程序计数器中,同时将程序计数器PC指指向子程序的入口点,当子程序执行完毕需要返回调向子程序的入口点,当子程序执行完毕需要返回调用处时,只需要将存放在用处时,只需要将存放在LR中的返回

35、地址重新拷贝中的返回地址重新拷贝给程序计数器给程序计数器PC(即:使用指令(即:使用指令MOV PC,LR)。)。4.3.2 子程序调用子程序调用 习惯上用寄存器习惯上用寄存器R0R3来存放送到子程序的参来存放送到子程序的参数,然后从子程序返回时存放返回的结果给调用者。数,然后从子程序返回时存放返回的结果给调用者。下面给出的子程序,减下面给出的子程序,减4个参数的值,用个参数的值,用R0返回返回结果(即实现结果(即实现R0=R0-R1-R2-R3)。)。4.3.2 子程序调用子程序调用AREA Init,CODE,READONLY;定义一个代码段;定义一个代码段ENTRY ;定义一个程序入口;

36、定义一个程序入口LOOP1 MOV R0,#412;给参数;给参数R0赋值赋值680MOV R1,#106;给参数;给参数R1赋值赋值25MOV R2,#64;给参数;给参数R2赋值赋值101MOV R3,#195;给参数;给参数R3赋值赋值91BL SUB1 ;调用子程序;调用子程序SUB1,同时将子程序的返回,同时将子程序的返回;地址存放在连接寄存器;地址存放在连接寄存器R14(LR)中。中。MOV R0,#0 x18;传送到软件中断的参数;传送到软件中断的参数LDR R1,=0 x20026;传送到软件中断的参数;传送到软件中断的参数SWI 0 x123456;通过软件中断指令返回;通过

37、软件中断指令返回SUB1SUB R0,R0,R1;子程序代码;子程序代码SUB R0,R0,R2SUB R0,R0,R3MOV PC,LR;从子程序返回;从子程序返回END4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程在应用系统的程序设计中,若所有的编程任务均用汇编在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工作量是可想而知的。事实上,语言来完成,其工作量是可想而知的。事实上,ARM体系结构支持体系结构支持C/C以及与汇编语言的混合编程,以及与汇编语言的混合编程,在一个完整的程序设计的中,除了初始化部分用汇编在一个完整的程序设计的中,除了初始化部分用汇编语言完成以外

38、,其主要的编程任务一般都用语言完成以外,其主要的编程任务一般都用C/C+完完成。成。汇编语言与汇编语言与C/C+的混合编程通常有以下几种的混合编程通常有以下几种方式方式:l在在C/C代码中嵌入汇编指令。代码中嵌入汇编指令。l在汇编程序和在汇编程序和C/C的程序之间进行变量的互访。的程序之间进行变量的互访。l汇编程序、汇编程序、C/C程序间的相互调用。程序间的相互调用。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程 在以上的几种混合编程技术中,必须在以上的几种混合编程技术中,必须遵守一定的调遵守一定的调用规则用规则:这里所指的是:这里所指的是ATPCS规则,规则,PCS即即Proced

39、ure Call Standard(过程调用规范),(过程调用规范),ATPCS即即ARM-THUMB procedure call standard。PCS规定规定了应用程序的函数可以如何分开地写,分开地编译,了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。关过程(函数)调用者与被调用者之间的协议。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程uPCS强制实现如下强制实现如下约定约定:调用函数如何传递参数(即:调用函数如何传递参数(即压栈方法,以何种方

40、式存放参数),被调用函数如何压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。获取参数,以何种方式传递函数返回值。uPCS的制订是一系列指标的的制订是一系列指标的“tradeoff(折衷)(折衷)”(因为很大程度上涉及系统的一些性能),如:会涉(因为很大程度上涉及系统的一些性能),如:会涉及生成代码的大小,调试功能的支持,函数调用上下及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗等。文处理速度以及内存消耗等。u当然,通过编译器的支持可以让生成的代码有不同的当然,通过编译器的支持可以让生成的代码有不同的特性,如:特性,如:gcc编译选项可以支

41、持或不支持编译选项可以支持或不支持frame pointer来支持深入调试功能或提高程序运行性能。来支持深入调试功能或提高程序运行性能。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程u基本基本ATPCS规定了在子程序调用时的一些基本规则,规定了在子程序调用时的一些基本规则,包括以下三个方面的内容:各寄存器的使用规则及其包括以下三个方面的内容:各寄存器的使用规则及其相应的名字;数据栈的使用规则;参数传递的规则。相应的名字;数据栈的使用规则;参数传递的规则。u相对于其他类型的相对于其他类型的ATPCS,满足基本,满足基本ATPCS的程序的程序的执行速度更快,所占用的内存更少。但是它不能提

42、的执行速度更快,所占用的内存更少。但是它不能提供以下的支持供以下的支持ARM程序和程序和THUMB程序相互调用;数程序相互调用;数据以及代码的位置无关;子程序的可重入性;数据栈据以及代码的位置无关;子程序的可重入性;数据栈检查等。检查等。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程1.各寄存器的使用规则各寄存器的使用规则(1)子程序通过寄存器)子程序通过寄存器R0R3来传递参数。来传递参数。这时寄存这时寄存器可以记作:器可以记作:A0A3,被调用的子程序在返回前无,被调用的子程序在返回前无需恢复寄存器需恢复寄存器R0R3的内容。的内容。(2)在子程序中,使用)在子程序中,使用R4R

43、11来保存局部变量来保存局部变量,这时寄这时寄存器存器R4R11可以记作:可以记作:V1V8。如果在子程序中使。如果在子程序中使用到用到V1V8的某些寄存器,子程序进入时必须保存这的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作。对于子程序中没有用到的寄存器则不必执行这些操作。在在THUMB程序中,通常只能使用寄存器程序中,通常只能使用寄存器R4R7来保来保存局部变量。存局部变量。(3)寄存器)寄存器R12用作子程序间用作子程序间scratch寄存器,记作寄存器,记作i

44、p;在子程序的连接代码段中经常会有这种使用规则。在子程序的连接代码段中经常会有这种使用规则。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程(4)寄存器)寄存器R13用作数据栈指针,记做用作数据栈指针,记做SP;在子程序;在子程序中寄存器中寄存器R13不能用做其他用途。不能用做其他用途。寄存器寄存器SP在进入子在进入子程序时的值和退出子程序时的值必须相等。程序时的值和退出子程序时的值必须相等。(5)寄存器)寄存器R14用作连接寄存器,记作用作连接寄存器,记作lr;它用于保存;它用于保存子程序的返回地址,如果在子程序中保存了返回地址,子程序的返回地址,如果在子程序中保存了返回地址,则则R

45、14可用作其它的用途。可用作其它的用途。(6)寄存器)寄存器R15是程序计数器,记作是程序计数器,记作PC;它不能用作;它不能用作其他用途。其他用途。(7)ATPCS中的各寄存器在中的各寄存器在ARM编译器和汇编器中都编译器和汇编器中都是预定义的。是预定义的。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程2.数据栈的使用规则数据栈的使用规则 ATPCS规定数据栈为满递减类型。并对数据栈的规定数据栈为满递减类型。并对数据栈的操作是操作是8字节对齐的,下面是一个数据栈的示例及相字节对齐的,下面是一个数据栈的示例及相关的名词。关的名词。(1)数据栈栈指针()数据栈栈指针(stack poi

46、nter),其指向最后一),其指向最后一个写入栈的数据的内存地址。个写入栈的数据的内存地址。(2)数据栈的基地址()数据栈的基地址(stack base),是指数据栈的最),是指数据栈的最高地址。由于高地址。由于ATPCS中的数据栈是中的数据栈是FD类型的,实际类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元。下一个内存单元。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程(3)数据栈界限()数据栈界限(stack limit),是指数据栈中可以使),是指数据栈中可以使用的最低的内存单元地址。用的最低的内存单元地址。

47、(4)已占用的数据栈()已占用的数据栈(used stack),是指数据栈的基),是指数据栈的基地址和数据栈栈指针之间的区域,其中包括数据栈栈地址和数据栈栈指针之间的区域,其中包括数据栈栈指针对应的内存单元。指针对应的内存单元。(5)数据栈中的数据帧)数据栈中的数据帧(stack frames),是指在数据栈,是指在数据栈中中,为子程序分配的用来保存寄存器和局部变量的区为子程序分配的用来保存寄存器和局部变量的区域。域。异常中断的处理程序可以使用被中断程序的数据栈,异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大。这时用户要保证中断的程序数据栈足够大。4.4 汇

48、编语言与汇编语言与C/C+的混合编程的混合编程3.参数的传递规则参数的传递规则根据参数个数是否固定,可以将子程序分为参数个根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序。数固定的子程序和参数个数可变的子程序。(1)参数个数可变的子程序参数传递规则)参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过对于参数个数可变的子程序,当参数不超过4个时,可个时,可以使用寄存器以使用寄存器R0R3来进行参数传递,当参数超过来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数。在参数传递时,个时,还可以使用数据栈来传递参数。在参数传递时,将所有参数

49、看做是存放在连续的内存单元中的字数据。将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器然后,依次将各名字数据传送到寄存器R0、R1、R2、R3;如果参数多于;如果参数多于4个,将剩余的字数据传送到数据个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。按照上面的规则,一个浮点数参数可以通据先入栈。按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递。通过寄存器传递,另一半通

50、过数据栈传递。4.4 汇编语言与汇编语言与C/C+的混合编程的混合编程(2)参数个数固定的子程序参数传递规则)参数个数固定的子程序参数传递规则对于参数个数固定的子程序,参数传递与参数个数对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:运算的硬件部件,浮点参数将按照下面的规则传递:各个浮点参数按顺序处理;为每个浮点参数分配各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是满足该浮点参数需要的且编号寄存器;分配的方法是满足该浮点参数需要的且编号最小的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(嵌入式系统原理及应用教程第4章课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|