4、嵌入式程序设计基础课件.ppt

上传人(卖家):三亚风情 文档编号:3003460 上传时间:2022-06-21 格式:PPT 页数:134 大小:352KB
下载 相关 举报
4、嵌入式程序设计基础课件.ppt_第1页
第1页 / 共134页
4、嵌入式程序设计基础课件.ppt_第2页
第2页 / 共134页
4、嵌入式程序设计基础课件.ppt_第3页
第3页 / 共134页
4、嵌入式程序设计基础课件.ppt_第4页
第4页 / 共134页
4、嵌入式程序设计基础课件.ppt_第5页
第5页 / 共134页
点击查看更多>>
资源描述

1、1嵌入式系统及其开发应用嵌入式系统及其开发应用第四章第四章 嵌入式程序设计基础嵌入式程序设计基础-2第第4 4章章 嵌入式程序设计基础嵌入式程序设计基础l基于基于ARM的编译器一般都支持汇编语言的程序设计、的编译器一般都支持汇编语言的程序设计、C/C+语言的程序设计及两者的混合编程。语言的程序设计及两者的混合编程。l本章介绍本章介绍ARM的嵌入式程序的基础知识的嵌入式程序的基础知识l伪指令伪指令l汇编语言的语句格式汇编语言的语句格式l汇编语言程序汇编语言程序l汇编语言与汇编语言与C/C+语言的混合编程语言的混合编程-3本章提要本章提要伪指令伪指令汇编语言的语句格式汇编语言的语句格式汇编程序应用

2、汇编程序应用汇编语言与汇编语言与C/C+C/C+语言的混合编程语言的混合编程-44.1 4.1 伪指令伪指令l在在ARM汇编语言程序里,有一些特殊指令助记符,这些助汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,记符与指令系统的助记符不同,没有相对应的操作码没有相对应的操作码,通,通常称这些特殊指令助记符为常称这些特殊指令助记符为伪指令伪指令,他们所完成的操作称,他们所完成的操作称为伪操作。为伪操作。l伪指令在源程序中的伪指令在源程序中的作用作用是是既要把正常的程序用指令表达既要把正常的程序用指令表达给计算机以外,又要把程序设计者的意图表达给编译器。给计算机以外,又要把

3、程序设计者的意图表达给编译器。 例如:例如:要告诉编译器程序段的开始和结束,需要定义数要告诉编译器程序段的开始和结束,需要定义数据等。据等。-5l在在ARM的汇编程序中,我们把伪指令分为三部分介绍的汇编程序中,我们把伪指令分为三部分介绍:l通用伪指令通用伪指令 l与与ARM指令相关的伪指令指令相关的伪指令l与与Thumb指令相关的伪指令指令相关的伪指令 4.1 4.1 伪指令伪指令-64.1.1 4.1.1 通用伪指令通用伪指令 通用伪指令包括通用伪指令包括:l符号定义伪指令符号定义伪指令l数据定义伪指令数据定义伪指令l汇编控制伪指令汇编控制伪指令l及其他一些常用伪指令等。及其他一些常用伪指令

4、等。-7其中:其中:lGBLA用于声明一个全局的数字变量,并初始化为用于声明一个全局的数字变量,并初始化为0;lGBLL伪指令用于声明一个全局的逻辑变量,并初始化为伪指令用于声明一个全局的逻辑变量,并初始化为F(假);(假);lGBLS伪指令用于声明一个全局的字符串变量,并初始化为空;对于全局变伪指令用于声明一个全局的字符串变量,并初始化为空;对于全局变量来说,变量名在源程序中必须是唯一的。量来说,变量名在源程序中必须是唯一的。1.符号定义伪指令符号定义伪指令 符号定义伪指令用于声明符号定义伪指令用于声明ARM汇编程序中的变量、对变量汇编程序中的变量、对变量赋值以及定义寄存器的名称等操作。赋值

5、以及定义寄存器的名称等操作。常见的符号定义伪指令有如下几种:常见的符号定义伪指令有如下几种:(1)GBLA、GBLL和和GBLS4.1.1 4.1.1 通用伪指令通用伪指令语法格式:语法格式: GBLA(GBLL或或GBLS)全局变量名全局变量名 GBLA、GBLL和和GBLS伪指令是伪指令是声明全局变量声明全局变量的伪指令,用于定义的伪指令,用于定义一个一个ARM程序中的全局变量,并将其初始化。程序中的全局变量,并将其初始化。-8指令示例:指令示例:GBLA DATE1;声明一个全局数字变量;声明一个全局数字变量DATE1GBLLDATE1;声明一个全局逻辑变量;声明一个全局逻辑变量DATE

6、2GBLSDATA3 ;声明一个全局的字符串变量;声明一个全局的字符串变量DATE3DATE3 SETS“Testing”;将该变量赋值为;将该变量赋值为“Testing”4.1.1 4.1.1 通用伪指令通用伪指令-9(2)LCLA、LCLL和和LCLS语法格式:语法格式: LCLA(LCLL或或LCLS)局部变量名局部变量名 LCLA、LCLL和和LCLS伪指令是伪指令是声明局部变量声明局部变量伪指令,伪指令,用于定义一个用于定义一个ARM程序中的局部变量,并将其初始化。程序中的局部变量,并将其初始化。其中:其中:lLCLA用于声明一个局部的数字变量,并初始化为用于声明一个局部的数字变量,

7、并初始化为0;lLCLL用于声明一个局部的逻辑变量,并初始化为用于声明一个局部的逻辑变量,并初始化为F(假);(假);lLCLS用于声明一个局部的字符串变量,并初始化为空。对于局部变量用于声明一个局部的字符串变量,并初始化为空。对于局部变量来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个变来说,变量名在使用的范围内必须是唯一的,范围限制在定义这个变量的宏指令程序段内。量的宏指令程序段内。4.1.1 4.1.1 通用伪指令通用伪指令-10指令示例:指令示例:LCLADATE4;声明一个局部数字变量;声明一个局部数字变量DATE4LCLLDATE5;声明一个局部的逻辑变量;声明一个局部的

8、逻辑变量DATE5DATA4 SETL 0 x10;为变量;为变量DATE4赋值为赋值为0 x10LCLSDATA6;声明一个局部的字符串变量;声明一个局部的字符串变量DATA64.1.1 4.1.1 通用伪指令通用伪指令-11(3)SETA、SETL和和SETS语法格式:语法格式:变量名变量名 SETA(SETL或或SETS)表达式)表达式 SETA、SETL、SETS是是变量赋值变量赋值伪指令,用于给一个伪指令,用于给一个已经定义的全局变量或局部变量赋值。已经定义的全局变量或局部变量赋值。其中:其中:lSETA用于给一个用于给一个数学数学变量赋值;变量赋值;lSETL用于给一个用于给一个逻

9、辑逻辑变量赋值;变量赋值;lSETS用于给一个用于给一个字符串字符串变量赋值;变量赋值;4.1.1 4.1.1 通用伪指令通用伪指令-12指令示例:指令示例:GBLA EXAMP1;先声明一个全局数字变量;先声明一个全局数字变量EXAMP1 EXAMP1 SETA 0 xaa;将变量;将变量EXAMP1赋值为赋值为0 xaaLCLL EXAMP2;声明一个局部的逻辑变量;声明一个局部的逻辑变量EXAMP2EXAMP1 SETLTRUE;将变量;将变量EXAMP1赋值为赋值为TRUEGBLA EXAMP3;先声明一个全局字符串变量;先声明一个全局字符串变量EXAMP3 EXAMP3 SETS“s

10、tring”;将变量;将变量EXAMP3赋值为赋值为string4.1.1 4.1.1 通用伪指令通用伪指令-13(4)RLIST语法格式:语法格式: 名称名称 RLIST 寄存器列表寄存器列表 RLIST伪指令是伪指令是定义通用寄存列表定义通用寄存列表伪指令,通用寄存器列伪指令,通用寄存器列表定义主要应用在表定义主要应用在堆栈操作或多寄存器传送中堆栈操作或多寄存器传送中,即使用该伪,即使用该伪指令定义的名称可在指令定义的名称可在ARM指令指令LDM/STM中使用。中使用。 在在LDM/STM指令中,列表中的寄存器访问次序为根据寄指令中,列表中的寄存器访问次序为根据寄存器的编号存器的编号由低到

11、高由低到高,而与列表中的寄存器排列次序无关。,而与列表中的寄存器排列次序无关。4.1.1 4.1.1 通用伪指令通用伪指令-14指令示例:指令示例:RegListRLISTR0-R5,R8 ;定义寄存器列表为;定义寄存器列表为RegList在程序中使用:在程序中使用:STMFD SP!, RegList;存储列表到堆栈;存储列表到堆栈LDMIA R5, RegList;加载列表;加载列表 4.1.1 4.1.1 通用伪指令通用伪指令-152. 数据定义伪指令数据定义伪指令 数据定义伪指令一般用于数据定义伪指令一般用于为特定的数据分配存储单元为特定的数据分配存储单元,同时可完成已分配存储单元的初

12、始化。常见的数据定义伪同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:指令有如下几种:(1)DCB语法格式:语法格式: 标号标号 DCB表达式表达式 DCB伪指令是伪指令是字节分配内存单元字节分配内存单元伪指令,用来分配一片伪指令,用来分配一片连续的字节存储单元并用伪指令中指定的数值或字符初始连续的字节存储单元并用伪指令中指定的数值或字符初始化。其中,数值范围为化。其中,数值范围为0255,DCB也可用也可用“=”代替。代替。4.1.1 4.1.1 通用伪指令通用伪指令-16指令示例:指令示例:String DCB “This is a test!” ;分配一片连续的字节存储

13、单元并初始化。;分配一片连续的字节存储单元并初始化。DATA2 DCB 15, 25, 62, 00 ;为数字常量;为数字常量15,25,62,00分片内存单元分片内存单元4.1.1 4.1.1 通用伪指令通用伪指令-17(2)DCW(或(或DCWU)语法格式:语法格式: 标号标号 DCW(或(或DCWU)表达式)表达式 DCW(或(或DCWU)伪指令是)伪指令是为半字分配内存单元为半字分配内存单元,其中,其中,表达式可以为程序标号或数字表达式。表达式可以为程序标号或数字表达式。 伪指令伪指令DCW用于为半字分配一段半字对准的内存单元,用于为半字分配一段半字对准的内存单元,并用指定的数据初始化

14、;伪指令并用指定的数据初始化;伪指令DCWU用于为半字分配一用于为半字分配一段可以非半字对准的内存单元,并用指定的数据初始化。段可以非半字对准的内存单元,并用指定的数据初始化。4.1.1 4.1.1 通用伪指令通用伪指令-18指令示例:指令示例:DATA1 DCW 1, 2, 3 ;分配一片连续的半字存储单元并初始化为;分配一片连续的半字存储单元并初始化为1,2,3。DATA2 DCWU 45, 0 x2a*0 x2a ;分配一片非半字对准存储单元并初始化。;分配一片非半字对准存储单元并初始化。4.1.1 4.1.1 通用伪指令通用伪指令-19(3)DCD(或(或DCDU)语法格式:语法格式:

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

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

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

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

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

20、存单元,并用指定的数据初始化。的内存单元,并用指定的数据初始化。指令示例:指令示例: DATA1 DCQ100 ;分配一片连续的存储单元并初始化为指定的值。;分配一片连续的存储单元并初始化为指定的值。4.1.1 4.1.1 通用伪指令通用伪指令-24(6)MAP和和FILED语法格式:语法格式: MAP 表达式,表达式,基址寄存器基址寄存器 标号标号 FIELD 表明数据字节数的数值表明数据字节数的数值MAP和和FILED是是内存表定义伪指令内存表定义伪指令。l伪指令伪指令MAP用于用于定义一个结构化的内存表的首地址定义一个结构化的内存表的首地址,MAP也可用也可用“”代替;代替;l伪指令伪指

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

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

23、单元分配伪指令内存单元分配伪指令,用于分配一片连,用于分配一片连续的存储区域并初始化为续的存储区域并初始化为0,SPACE也可用也可用“”代替。代替。指令示例:指令示例: DATASPA SPACE100 ;为;为DATASPA分配分配100个存储单元个存储单元 ;并初始化为;并初始化为04.1.1 4.1.1 通用伪指令通用伪指令-283. 汇编控制伪指令汇编控制伪指令 汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:控制伪指令包括以下几条:(1)MACRO、MEND和和MEXIT语法格式:语法格式:MACRO$

24、标号标号 宏名宏名 $参数参数1,$参数参数2,语句段语句段MEXIT语句段语句段MENDMACRO、MEND和和MEXIT都是宏定义指令。都是宏定义指令。4.1.1 4.1.1 通用伪指令通用伪指令-29l伪指令伪指令MACRO定义一个定义一个宏语句段的开始宏语句段的开始;伪指令;伪指令MEND定义定义宏语句段的结束宏语句段的结束;伪指令;伪指令MEXIT可以实现可以实现从宏程序从宏程序段的跳出段的跳出。宏指令可以使用一个或多个参数,当宏指令被。宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。展开时,这些参数被相应的值替换。MACRO、MEND伪伪指令可以嵌套使用。指

25、令可以嵌套使用。l宏宏是一段功能完整的程序是一段功能完整的程序,能够实现一个特定的功能,在,能够实现一个特定的功能,在使用中可以把它视为一个子程序。在其他程序中,可以调使用中可以把它视为一个子程序。在其他程序中,可以调用宏完成某个功能。用宏完成某个功能。4.1.1 4.1.1 通用伪指令通用伪指令-30l调用宏是通过调用宏的名称来实现的。调用宏是通过调用宏的名称来实现的。宏指令的使用宏指令的使用方式和功能与子程序有些相似方式和功能与子程序有些相似,子程序可以提供模块,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。化的程序设计、节省存储空间并提高运行速度。l但在使用子程序结构时需要

26、保护现场,从而增加了系但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,统的开销,因此,在代码较短且需要传递的参数较多在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序时,可以使用宏指令代替子程序。调用宏的好处是不调用宏的好处是不占用传送参数的寄存器,不用保护现场占用传送参数的寄存器,不用保护现场。4.1.1 4.1.1 通用伪指令通用伪指令-31指令示例:指令示例:MACRO ;定义宏;定义宏$DATA1 MAX $N1, $N2 ;宏名称是;宏名称是MAX,主标号是,主标号是$DATA1,两个参数,两个参数语句段语句段 ;语句段;语句段$DATA1. MAY1 ;非主标

27、号,由主标号构成;非主标号,由主标号构成语句段语句段 ;语句段;语句段$DATA1. MAY2 ;非主标号,由主标号构成;非主标号,由主标号构成MEND ;宏结束;宏结束4.1.1 4.1.1 通用伪指令通用伪指令-32(2)IF、ELSE、ENDIF语法格式:语法格式:IF 逻辑表达式逻辑表达式语句段语句段1ELSE语句段语句段2ENDIFlIF、ELSE、ENDIF伪指令是伪指令是条件分支伪指令条件分支伪指令,能根据条件的成立与,能根据条件的成立与否决定是否执行某个语句。伪指令否决定是否执行某个语句。伪指令IF可以对条件进行判断;伪指令可以对条件进行判断;伪指令ELSE产生分支;伪指令产生

28、分支;伪指令ENDIF定义分支结束。定义分支结束。l当当IF后面的逻辑表达式为真,则执行语句段后面的逻辑表达式为真,则执行语句段1,否则执行语句段,否则执行语句段2。其。其中,中,ELSE及语句段及语句段2可以没有,此时,当可以没有,此时,当IF后面的逻辑表达式为真,后面的逻辑表达式为真,则执行指令序列则执行指令序列1,否则继续执行后面的指令。,否则继续执行后面的指令。IF、ELSE、ENDIF伪指令可以嵌套使用。伪指令可以嵌套使用。4.1.1 4.1.1 通用伪指令通用伪指令-33指令示例:指令示例:IF R0=0 x10 ;判断;判断R0中的内容是否是中的内容是否是0 x10ADD R0,

29、 R1, R2 ;如果;如果R0= 0 x10,则执行,则执行R0= R1+ R2ELSEADD R0,R1,R3 ;如果;如果R0 0 x10,则执行,则执行R0= R1+ R3ENDIF4.1.1 4.1.1 通用伪指令通用伪指令-34(3)WHILE、WEND语法格式:语法格式:WHILE逻辑表达式逻辑表达式语句段语句段WENDlWHILE、WEND伪指令是伪指令是条件循环伪指令条件循环伪指令,能根据条件的成立与否,能根据条件的成立与否决定是否循环执行某个语句段。伪指令决定是否循环执行某个语句段。伪指令WHILE对条件进行判断,满足对条件进行判断,满足条件循环,不满足条件结束循环;伪指令

30、条件循环,不满足条件结束循环;伪指令WEND定义循环体结束。定义循环体结束。l当当WHILE后面的逻辑表达式为真,则执行语句段,该语句段执行完毕后面的逻辑表达式为真,则执行语句段,该语句段执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。的值为假。4.1.1 4.1.1 通用伪指令通用伪指令-35指令示例:指令示例:GBLACou1;声明一个全局的数学变量,变量名为;声明一个全局的数学变量,变量名为CounterCou1 SETA1;为;为Cou1赋值赋值1WHILE Cou1 10;判断;判断WHILEC

31、ounter ”、“=”、“= ”、“/=”、“ ” 运算符。运算符。 以以A和和B表示两个逻辑表达式,以上的运算符代表的运表示两个逻辑表达式,以上的运算符代表的运算如下:算如下:A = B表示表示A等于等于B。A B表示表示A大于大于B。A = B表示表示A大于等于大于等于B。A = B表示表示A小于等于小于等于B。A /= B表示表示A不等于不等于B。X B表示表示A不等于不等于B。4.2.2 4.2.2 汇编语言中表达式和运算符汇编语言中表达式和运算符-85指令示例:指令示例:MOV R5, #0 xFF00: MOD: 0 xF: ROL: 2 ;R5寄存器里的内容为寄存器里的内容为0

32、 x00IF R5: LAND: R6=R7MOV R0, #0 x00ELSEMOV R0, #0 xFF ;如果;如果R5R6、=、=、/=、)逻辑运算(逻辑运算(LAND、LOR、LEOR)表表4-3 运算符优先级运算符优先级4.2.2 4.2.2 汇编语言中表达式和运算符汇编语言中表达式和运算符-95本章提要本章提要伪指令伪指令汇编语言的语句格式汇编语言的语句格式汇编程序应用汇编程序应用汇编语言与汇编语言与C/C+C/C+语言的混合编语言的混合编程程-964.3 4.3 汇编程序应用汇编程序应用4.3.1 汇编程序基本结构汇编程序基本结构下面是一个汇编语言源程序的基本结构:下面是一个汇

33、编语言源程序的基本结构: 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 ;文件结束;文件结束-974.3.1 4.3.1 汇编程序基本结构汇编程序基本结

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

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

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

37、;定义一个代码段ENTRY ;定义一个程序入口;定义一个程序入口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 ;传送到软件中断的参数

38、;传送到软件中断的参数SWI 0 x123456 ;通过软件中断指令返回;通过软件中断指令返回SUB1 SUB R0, R0, R1 ;子程序代码;子程序代码SUB R0, R0, R2SUB R0, R0, R3MOV PC, LR ;从子程序返回;从子程序返回END4.3.2 4.3.2 子程序调用子程序调用-101本章提要本章提要伪指令伪指令汇编语言的语句格式汇编语言的语句格式汇编程序应用汇编程序应用汇编语言与汇编语言与C/C+C/C+语言的混合编语言的混合编程程-1024. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程 在应用系统的程序设计中,若所有的编程任务

39、均用汇在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工作量是可想而知的。事实上,编语言来完成,其工作量是可想而知的。事实上,ARM体系结构支持体系结构支持C/C以及与汇编语言的混合编程,在一个以及与汇编语言的混合编程,在一个完整的程序设计的中,除了初始化部分用汇编语言完成完整的程序设计的中,除了初始化部分用汇编语言完成以外,其主要的编程任务一般都用以外,其主要的编程任务一般都用C/C+完成。完成。汇编语言与汇编语言与C/C+的混合编程通常有以下几种方式:的混合编程通常有以下几种方式:l在在C/C代码中嵌入汇编指令。代码中嵌入汇编指令。l在汇编程序和在汇编程序和C/C的程序之间进

40、行变量的互访。的程序之间进行变量的互访。l汇编程序、汇编程序、C/C程序间的相互调用。程序间的相互调用。-103 在以上的几种混合编程技术中,必须在以上的几种混合编程技术中,必须遵守一定的调用遵守一定的调用规则规则:这里所指的是:这里所指的是ATPCS规则,规则,PCS即即Procedure Call Standard(过程调用规范),(过程调用规范),ATPCS即即ARM-THUMB procedure call standard。PCS规定了应用程规定了应用程序的函数可以如何分开地写,分开地编译,最后将它序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关

41、过程们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。(函数)调用者与被调用者之间的协议。4. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-104lPCS强制实现如下强制实现如下约定约定:调用函数如何传递参数(即压:调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。取参数,以何种方式传递函数返回值。lPCS的制订是一系列指标的的制订是一系列指标的“tradeoff(折衷)(折衷)”(因(因为很大程度上涉及系统的一些性能),如:会涉及生为

42、很大程度上涉及系统的一些性能),如:会涉及生成代码的大小,调试功能的支持,函数调用上下文处成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗等。理速度以及内存消耗等。l当然,通过编译器的支持可以让生成的代码有不同的当然,通过编译器的支持可以让生成的代码有不同的特性,如:特性,如:gcc编译选项可以支持或不支持编译选项可以支持或不支持frame pointer来支持深入调试功能或提高程序运行性能。来支持深入调试功能或提高程序运行性能。4. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-105l基本基本ATPCS规定了在子程序调用时的一些基本规则,包规定了在

43、子程序调用时的一些基本规则,包括以下三个方面的内容:各寄存器的使用规则及其相应括以下三个方面的内容:各寄存器的使用规则及其相应的名字;数据栈的使用规则;参数传递的规则。的名字;数据栈的使用规则;参数传递的规则。l相对于其他类型的相对于其他类型的ATPCS,满足基本,满足基本ATPCS的程序的执的程序的执行速度更快,所占用的内存更少。但是它不能提供以下行速度更快,所占用的内存更少。但是它不能提供以下的支持的支持ARM程序和程序和THUMB程序相互调用;数据以及代程序相互调用;数据以及代码的位置无关;子程序的可重入性;数据栈检查等。码的位置无关;子程序的可重入性;数据栈检查等。4. 4 4. 4

44、汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-1061.各寄存器的使用规则各寄存器的使用规则(1)子程序通过寄存器)子程序通过寄存器R0R3来传递参数。来传递参数。 这时寄存器可这时寄存器可以记作:以记作: A0A3 ,被调用的子程序在返回前无需恢复寄存,被调用的子程序在返回前无需恢复寄存器器R0R3的内容。的内容。(2)在子程序中,使用)在子程序中,使用R4R11来保存局部变量来保存局部变量,这时寄存器这时寄存器R4R11可以记作:可以记作:V1V8。如果在子程序中使用到。如果在子程序中使用到V1V8的某些寄存器,子程序进入时必须保存这些寄存器的值,的某些寄存器,子程序进入时必须

45、保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作。在到的寄存器则不必执行这些操作。在THUMB程序中,通程序中,通常只能使用寄存器常只能使用寄存器R4R7来保存局部变量。来保存局部变量。(3)寄存器)寄存器R12用作子程序间用作子程序间scratch寄存器,记作寄存器,记作ip;在子;在子程序的连接代码段中经常会有这种使用规则。程序的连接代码段中经常会有这种使用规则。4. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-107(4)寄存器)寄存器R13用作数据栈指针,记做

46、用作数据栈指针,记做SP;在子程序中;在子程序中寄存器寄存器R13不能用做其他用途。不能用做其他用途。 寄存器寄存器SP在进入子程在进入子程序时的值和退出子程序时的值必须相等。序时的值和退出子程序时的值必须相等。(5)寄存器)寄存器R14用作连接寄存器,记作用作连接寄存器,记作lr ;它用于保存;它用于保存子程序的返回地址,如果在子程序中保存了返回地址,子程序的返回地址,如果在子程序中保存了返回地址,则则R14可用作其它的用途。可用作其它的用途。(6)寄存器)寄存器R15是程序计数器,记作是程序计数器,记作PC ;它不能用作其;它不能用作其他用途。他用途。(7)ATPCS中的各寄存器在中的各寄

47、存器在ARM编译器和汇编器中都编译器和汇编器中都是预定义的。是预定义的。4. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-1082.数据栈的使用规则数据栈的使用规则 ATPCS规定数据栈为满递减类型。并对数据栈的操作是规定数据栈为满递减类型。并对数据栈的操作是8字节对齐的,下面是一个数据栈的示例及相关的名词。字节对齐的,下面是一个数据栈的示例及相关的名词。(1)数据栈栈指针()数据栈栈指针(stack pointer ),其指向最后一个写入),其指向最后一个写入栈的数据的内存地址。栈的数据的内存地址。(2)数据栈的基地址()数据栈的基地址(stack base),是

48、指数据栈的最高地址。),是指数据栈的最高地址。由于由于ATPCS中的数据栈是中的数据栈是FD类型的,实际上数据栈中最早类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元。入栈数据占据的内存单元是基地址的下一个内存单元。4. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-109(3)数据栈界限()数据栈界限(stack limit ),是指数据栈中可以使用的),是指数据栈中可以使用的最低的内存单元地址。最低的内存单元地址。 (4)已占用的数据栈()已占用的数据栈(used stack),是指数据栈的基地址),是指数据栈的基地址和数据栈栈指针之间的区

49、域,其中包括数据栈栈指针对应和数据栈栈指针之间的区域,其中包括数据栈栈指针对应的内存单元。的内存单元。(5)数据栈中的数据帧)数据栈中的数据帧(stack frames) ,是指在数据栈中,是指在数据栈中,为为子程序分配的用来保存寄存器和局部变量的区域。子程序分配的用来保存寄存器和局部变量的区域。异常中断的处理程序可以使用被中断程序的数据栈,这异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大。时用户要保证中断的程序数据栈足够大。 4. 4 4. 4 汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程-1103.参数的传递规则参数的传递规则根据参数个数是否

50、固定,可以将子程序分为参数个数固根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序。定的子程序和参数个数可变的子程序。 (1)参数个数可变的子程序参数传递规则)参数个数可变的子程序参数传递规则 对于参数个数可变的子程序,当参数不超过对于参数个数可变的子程序,当参数不超过4个时,可以个时,可以使用寄存器使用寄存器R0R3来进行参数传递,当参数超过来进行参数传递,当参数超过4个时,还个时,还可以使用数据栈来传递参数。在参数传递时,将所有参数看可以使用数据栈来传递参数。在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名做是存放在连续的内存单元

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

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

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


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

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


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